我有一段代码,这段代码作为在 Backbone 应用程序中更改路由的一部分执行:
mediaMatchUnRegister: function () {
if (this.mediaMatchState.registered) {
enquire.unregister(this.mediaMatchState.tabletAndUpQuery)
.unregister(this.mediaMatchState.mobileQuery);
this.mediaMatchState.registered = false;
}
}
除了在以下条件下,这一切都运行良好:
- 应用正在 Chrome 中运行
- 我单击了该页面上的"打印"按钮,该按钮打开了Chrome打印预览对话框。
如果我还没有打开Chrome打印预览对话框,那么它运行良好。没有此对话框的FF和IE对此没有任何问题。
问题出在 enquire.js
中,特别是在clear()
方法中:
clear : function() {
each(this.handlers, function(handler) {
handler.destroy();
});
this.mql.removeListener(this.listener);
this.handlers.length = 0; //clear array
},
如果我还没有触发打印预览对话框,this.mql
是一个MediaQueryList
.如果我触发了它,那么this.mql
现在是一个MediaQueryListEvent
.然后它会失败,因为此对象似乎没有 removeListener 方法。
还有其他人遇到过这种情况吗?Chrome 打印预览对话框是红鲱鱼吗?
我有同样的问题。我找不到合理的解释,所以我只是在打电话给removeListener()
之前检查一下:
if(this.mql.removeListener)
它远非理想,但至少可以阻止代码中断。