1

奇妙な問題を見つけました。

私は自分のウェブアプリでコメットへの第一歩を踏み出しています。簡単に言えば、PHPコントローラーから送信される別のスクリプトをポーリングする素敵な小さなスクリプトがあります。

後で、私は両方の方法で働きます。longpolling と同じように、または現在のように - JavaScript の間隔で。

Chrome での動作: 「準備完了」イベントで、最初のスクリプトは、コントローラーに ajax 要求を送信する関数の間隔を設定します (名前を「ping.php」にしましょう)。ajax が成功した場合、msg は div#wrapperForJs の html コンテンツを置き換える必要があります。

Ping.php は、データベースの更新をチェックし、スクリプト エコーで 1 つのスクリプト結果を満たしているかどうかを確認します。

上記のテキストはヒューマニスト向けでしたが、現在は tl;dr:

jQuery コード:

function pingThatApp(){
$.ajax({
        type: 'GET',
        url: '/ping', 
        success: function(msg){
            $('#pingWrapper').html(msg);
        }
    });
}
$(document).ready(function(){
window['pingLoop'] = setInterval(
    function(){
        pingThatApp(); 
    },4000
   );     
});

PHP エコー:

$timeScrpt = '<script>';
    foreach ($timers['p'] as $k => $v) {
        $timeScrpt .= "$('#project-{$k} .pTime').fadeOut().attr('title', 'Time spent already: {$v}').html('{$v_short}').fadeIn();";

    }
    foreach ($timers['t'] as $k => $v){
        $timeScrpt .= "$('#timeSpent-task-{$k} b').fadeOut().html('{$v}').fadeIn();";
    }
    $timeScrpt .= '</script>';

Chrome ではすべてがうまく機能します。ただし、Safari にはそのスクリプトに関するいくつかの問題があります。問題は、Safari が jQuery オブジェクトを見つけられないようです。

console.log テストを作成し、コードをチェックしました - 出力は良さそうです。

$k 変数を変更して int でハードコーディングするか、反復の開始時に $k 変数を上書きすると、Safari でも機能します (jQuery が要素を見つけます)。

また、見つかった要素の長さで console.log テストを作成します。

el = $('#project-$k .pTime'); console.log(el.length);

Chrome は (0,0,0,1,1,1,0) [0 not found, 1 - found0 のようなものを出力します。Safari は常に 0 を出力します。

その貴重なブラウザで何が起こっているのかわからないので、ここに書いています。多分誰かがここに解決策を持っています。

また、間隔はデータ更新の目的には適していないと私に納得させようとしないでください。私はそれを知っていますが、今のところそれが私が実装できる最高のものです。

4

2 に答える 2

0

Safari (一部のバージョン) は、DOM に挿入された JavaScript コードを実行しません。危険なものを使用するかeval()、javascript を ajax コールバック内に配置して、サーバーから返されたテキスト/json に基づいて変更することができます。

于 2013-03-18T19:42:01.070 に答える
0

OK、バグが見つかりました。あまりにも馬鹿げていたので、本当に申し訳ありませんでした。

前に言ったように、実際には JavaScript が実行されていました。ただし、プライマリ アカウントに関連する 2 番目のアカウントで Safari をテストしていました。

バグは、実際にはコントローラーモデルのアクセス許可にありました。私がテストしていたワークスペースは、プライマリ アカウントが所有しています。Ping は、ユーザーが所有するプロジェクトの更新情報のみを送信しています。

そのため、Safari は js を適切に実行していました。私の ajax リクエストは問題ありませんでした (パフォーマンスの問題にもかかわらず、これは別の将来の話です)。ping がすべての情報を送信していないため、getElementById は要素を取得できませんでした。

時間の無駄で申し訳ありません。ご協力いただきありがとうございます。

于 2013-03-21T22:53:54.473 に答える