2012-05-25 19 views
2

我已經爲使用客戶端PerlScript的IE編寫了一個非常小的html頁面。在腳本中,我啓動了一個創建TCP套接字的單獨進程。啓動該過程之後,我啓動了一個偵聽器,它在讀取行時將HTML附加到div的末尾,另外還用於調試,我在讀取每行時添加了警報。爲什麼寫入緩存在Internet Explorer中的html頁面?有沒有辦法解決它?

問題是,當線條被讀取時,警報發生在點上,但是HTML在進程完成之前不會更新。這是爲什麼?有沒有辦法強制頁面呈現,以便我可以得到相同的行爲?

這裏的頁面:

<html> 
    <head> 
     <title>Message Test</title> 
     <script language=perlscript> 
      use util; 
      use Win32::Process; 

      my $alreadyrunflag = 0; 

      sub _write { 
       $window->document->body->insertAdjacentHTML("beforeEnd", $_[0]); 
      } 

      sub go { 
       _write("starting!<br/>"); 

       my $port = 12345; 
       #//system("start /b /NORMAL perl C:/development/plslog/clitest2.pl $port"); 
       Win32::Process::Create(my $Proc, "C:/perl/bin/perl.exe", "perl clitest2.pl 12345", 1, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, "C:/development/plslog"); 
       $window->alert("Hi! started!"); 

       if (defined (my $INPUT = util::CreateClient($port))) { 
        while(defined (my $line = <$INPUT>)) { 
         _write($line); 
         sleep(3); 
        } 
       } 

       _write("ending!"); 
      } 

      $window->setTimeout("go()",0); 
     </script> 
    </head> 
    <body> 
     <div id="content"></div> 
    </body> 
</html> 

我看過的在線文檔PerlScript這是非常稀疏。我正在尋找提示如何命令IE來觸發頁面渲染,響應這些html插入......等等。

在研究這個,我發現,我可以得到它呈現爲行被讀取if而不是onload,我使用div上的onclick。也許我沒有使用正確的事件,並且在子例程被觸發之前頁面沒有完全呈現?我對這裏的IE非常沮喪(第9節)。

是的,當我在命令行的情況下使用它時,所有事情都會像預期的那樣發生。 CreateServer/CreateClient只是用於客戶端和服務器的IO :: Socket :: INET的包裝器。

UPDATE(基於@Oleg V.沃爾科夫的答案):

我修改去,並增加了_read()函數讀取一行,然後將控制權返回給瀏覽器呈現。似乎做一個好工作。

sub _read() { 
    my $port = shift; 
    $INPUT = util::CreateClient($port) if ! $INPUT; 
    if (defined (my $line = <$INPUT>)) { 
    _write($line); 
    $window->setTimeout("_read($port)", 0); 
    } 
    else { 
    _write("Fin!"); 
    } 
} 
sub go() { 
    _write("starting!<br/>"); 
    my $port = 12345; 
    Win32::Process::Create(my $Proc, "C:/perl/bin/perl.exe", "perl clitest2.pl $port", 1, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, "C:/development/plslog"); 
    $window->alert("Hi! started!"); 
    $window->setTimeout("_read($port)", 0); 
} 

這似乎讓實時更新。

回答

2

大多數(如果不是全部的話)瀏覽器在您從託管腳本進程返回之前不重繪頁面。他們可以在某些操作上重新構造內部數據表示,但在您返回控制權之前,仍然不會花時間重新繪製數據。爲了允許瀏覽器重繪,您應該通過腳本中的setTimeoutreturn來安排下一步,稍後您應該將任務分解爲幾個步驟並稍後放棄。

在你的特殊情況下,取代sleep(3),無論如何你什麼都不做,下一次循環迭代在3秒後發生,這似乎是最好的方法。

+0

這樣做的竅門,謝謝! –

+0

我修改了go()爲: sub go { –

相關問題