私はITで働き始めたばかりなので(インターンシップは約2か月前に始まりました)、私を助けるために必要なすべての情報を提供しようと思います。
LongPollingを使用してサーバーから新しいデータ(私の場合はメッセージ)を受信するMVC4アプリケーションがあります。メッセージの種類に応じて、クライアント側での処理が異なります。
これらのメッセージの1つは、システムメッセージです。
私には2つの見方があります。1つのビューにはボタンがあり、もう1つのビューにはテキストがあります。
ボタンをクリックしてから
- コントローラにいくつかのプロパティを設定し、
- 他のビューでページを強制的にリロードし、新しいコンテンツ(一部のテキストボックスなど)を作成します
これで、これら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に新しいバグレポートを提出しました。