3

私はITで働き始めたばかりなので(インターンシップは約2か月前に始まりました)、私を助けるために必要なすべての情報を提供しようと思います。

LongPollingを使用してサーバーから新しいデータ(私の場合はメッセージ)を受信するMVC4アプリケーションがあります。メッセージの種類に応じて、クライアント側での処理が異なります。


これらのメッセージの1つは、システムメッセージです。

私には2つの見方があります。1つのビューにはボタンがあり、もう1つのビューにはテキストがあります。
ボタンをクリックしてから

  1. コントローラにいくつかのプロパティを設定し、
  2. 他のビューでページを強制的にリロードし、新しいコンテンツ(一部のテキストボックスなど)を作成します

これで、これら2つのビューを新しいウィンドウで開いた場合、正常に機能します(Firefox、IE、およびChromeの場合)。
ただし、新しいタブで開いた場合は、IEとChromeでのみ機能します。Firefoxはメッセージを受信しますが、コールバックメソッドを呼び出しません。

$(document).ready(function () { 
    ReadChat();
}) 

これにより、ReadChat()への最初の呼び出しが初期化されます。
前述したように、IEとChromeのタブでは完全に正常に機能しますが、Firefoxの新しいウィンドウでのみ機能します。
FireBugで確認すると、サーバーからの応答が届き、JSONの内部を調べることができます。何らかの理由でコールバックを呼び出さないだけです。

私が最初に考えたのは、まだすべてがロードされているわけではないということで、最初の呼び出しにタイムアウトを追加しました。

私がこのように書くと:

$(document).ready(function () { 
    setTimeout(ReadChat, 1000);
}

〜1000より低く設定しない限り、Firefoxでも機能します。


誰かが同じ問題に遭遇しましたか?Firefoxがここで違いを生むのはなぜですか?

編集:

function ReadChat() {
    $.fn.messaging({
        receiveURL: '@Url.Action("myAction", "myMethod")',
        myID: '@Model.myID',
        callback: function(data) {
            $.each(data.messages, function(k, v) {
                if(v.kind == 3) {
                    location.reload(true);
                }
            });
            ReadChat();
        }, timeout: 25000
    }, 'read');
}

$ .fn.messaging内で、読み取り用の関数が指定されたパラメーターで呼び出されます。

$.post(receiveURL, { id: myID }, function(response) {
    if($.isFunction(settings.callback) {
        settings.callback(response);
    }
}

EDIT2:

Diesel337が言ったように、私は今使っています

$(this).ready(function () {
    ReadChat();
});

新しいタブで開く:この調整を行った後、もう少しテストしましたが、一見すると完全に機能しました。次に、ボタンをクリックする前に、再ロードする必要がある[ビュー]をクリックすると、機能しないことに気付きました。(メッセージは受信されますが、コールバック関数は呼び出されません)

一方、ビューを無視してリロードする必要があり、ボタンを直接クリックすると、ページは問題なくリロードされます。

それは本当に奇妙に聞こえます、私は知っています、しかし私がビューを見ないならば、ボタンをクリックする前に、それは働きます。

また、これについてbugzillaに新しいバグレポートを提出しました。

4

2 に答える 2

1

この問題を引き起こしたのは Firefox ではなく、Firebug であることが判明しました。
今日もう一度このエラーを再現しようとしましたが、幸運にも Firebug がアクティブではなかったので、うまくいきました。
これがなぜなのかについての情報を得るために再度オンにした後、同じエラーが発生しました。

注: $(document).ready() で AJAX 呼び出しを必要とするものを開発している場合は、Firebug を有効にしないでください。何らかの理由で混乱するからです。

于 2012-07-25T08:14:01.310 に答える
0

$(document)の代わりに$(this)を使おうとしましたか?

$(this).ready(function() {
   ReadChat();
});

また

$(function() {
   ReadChat();
});
于 2012-06-07T20:45:17.563 に答える