由于我刚刚开始在 IT 领域工作(实习大约在 2 个月前开始),我会尽力为您提供帮助我所需的所有信息。
我有一个 MVC4 应用程序,它使用 LongPolling 从服务器接收新数据(在我的情况下是消息)。根据消息的类型,它会在客户端以不同的方式处理它。
其中一种消息是系统消息:
我有两种看法。一个视图有一个按钮,另一个只有一些文本。
然后点击按钮
- 在控制器中设置一些属性和
- 强制在另一个视图上重新加载页面,从而产生新的内容(例如一些文本框)
现在,如果我在新窗口中打开这两个视图,它会正常工作(在 Firefox、IE 和 Chrome 中)。
但如果我在新标签页中打开它们,它只能在 IE 和 Chrome 中运行。Firefox 会收到消息,但不会调用回调方法。
$(document).ready(function () {
ReadChat();
})
这将初始化对 ReadChat() 的第一次调用。
正如我之前提到的,它在 IE 和 Chrome 的选项卡中运行良好,但仅在 Firefox 的新窗口中运行。
如果我检查 FireBug,来自服务器的响应会到达,我可以查看 JSON 内部。由于某种原因,它只是不调用回调。
我的第一个想法是尚未加载所有内容,因此我在第一次调用中添加了超时。
如果我这样写:
$(document).ready(function () {
setTimeout(ReadChat, 1000);
}
它也适用于 Firefox,只要我不将其设置为低于 ~1000。
有没有人遇到过同样的问题?为什么 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 中,将使用给定的参数调用 read 函数:
$.post(receiveURL, { id: myID }, function(response) {
if($.isFunction(settings.callback) {
settings.callback(response);
}
}
编辑2:
正如 Diesel337 所说,我现在正在使用
$(this).ready(function () {
ReadChat();
});
在新标签中打开:进行此调整后,我对其进行了更多测试,乍一看它运行良好。然后我注意到,如果我点击视图,应该重新加载,在点击按钮之前,它不会工作。(消息已收到,但未调用回调函数)
另一方面,如果我忽略了应该重新加载的视图,并直接单击按钮,则页面将重新加载而没有问题。
这听起来很奇怪,我知道,但如果我在单击按钮之前不查看视图,它会起作用。
我还提交了一份关于 bugzilla 的新错误报告。