3

Webブラウザ内の3Dウィンドウを更新するには、コマンドがtxtファイルに書き込まれているかどうかを確認する必要があります。これは、クライアントに通知するための「プッシュ」手法またはロングポーリングとして知られているものです。ブラウザはInternetExplorerでなければならないので、私は少し制限があります。

txtファイルをチェックするために毎秒リロードするphpスクリプトを呼び出す隠しiframeを使用する解決策を考え出しました。

<iframe noresize scrolling="no" frameborder="0" name="loader" src="loader.php">  

loader.phpは基本的にこれを行います:

//check txt and get commands
<body onLoad="window.setInterval('location.reload()',1000);"></body>

私が見る唯一の問題は、Webブラウザで毎秒リロードボタンが点滅することです。ウィンドウは点滅していませんが、ボタンだけですが、それでも少し面倒です。

IEと互換性がありながら、この問題のより良い解決策はありますか?

4

1 に答える 1

5

最後に、何度も試した後、私はそれをうまく機能させることができました。これは、最適な標準ソリューションである、長いポーリングajaxソリューションです。これはIE7で多くの問題を引き起こすので、以下にコードを貼り付けます。

まず、私のPHPファイル。これは、txtを読み取り、JSONをテキストとともにエコーします。

<?php
$commandFile = fopen("./command.txt","r");

fseek($commandFile, 0);
$command = fscanf($commandFile, "%s\n"); //reads the command
fclose($commandFile);

if($command[0] != "")
{
  $commandFile = fopen("./command.txt","w"); //delete first line
  fclose(commandFile);    
  echo json_encode($command[0]);  
}
?>

ここで、HTMLメインページには、このPHPファイルを起動して回答をチェックする関数を再帰的に呼び出すメカニズムが必要です。私の機能はこんな感じです。

<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<script type="text/javascript">
function longPolling()
{
    $.ajaxSetup({ cache: false }); //This line is THE KEY to work under Internet Explorer
    $.ajax({                
        type: "GET",
            url: "loader.php",
        dataType: 'json',
        async: true,

        success: function(response){                                
            if(response!=""){
                sendCommand(response);  //could be any other function           
            }
            //longPolling();
            setTimeout(longPolling,1000);
                },
        error: function(){
            //longPolling();            
            setTimeout(longPolling,1000);
        }

           });
    };

$(document).ready(function(){   /*waits till the whole page loads*/
    longPolling(); /*start the initial request*/
});
</script> 
</body>
于 2013-03-26T09:52:26.253 に答える