昨天,微软发布了IE 9 RC。我们立即下载安装,测试它浏览博客园的兼容性。在测试中,我们发现使用代码着色功能时,会引起IE 9 RC崩溃。而这个问题在其他浏览器(包含其他版本的IE浏览器)中不存在。
本文主要是分享一下崩溃发生的场景及解决方法。
首先看一下引起崩溃的js代码:
$.ajax({
url: '/ws/UtilService.asmx/CodeHighlight',
data: '{"codeHighlighter":' + $.toJSON(codeHighlighter) + '}',
type: 'post',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
cache: false,
success: function (data) {
tinyMCEPopup.editor.execCommand('mceInsertContent', false, data.d);
tinyMCEPopup.close();
}
});
这是一个很简单的ajax调用代码,客户端将代码文本发送至服务端,服务端将着色后的代码返回给客户端。tinyMCEPopup.editor.execCommand将代码插入到TinyMCE编辑器中,然后通过tinyMCEPopup.close()关闭当前窗口(该方法的代码在tiny_mce_popup.js中)。崩溃就发生在执行tinyMCEPopup.close()的时候。
接着参观一下崩溃场景:
在插入代码窗口,点击提交之后,IE 9 RC立即出现崩溃窗口,见下图:
点击Debug启动VS2010进行调试,可以看到调试信息:
由于知识所限,不能根据调试信息作出进一步分析,这里只是展现一下崩溃现场。
最后,就是解决方法:
将tinyMCEPopup.close放在计时器中执行,代码如下:
$.ajax({
url: '/ws/UtilService.asmx/CodeHighlight',
data: '{"codeHighlighter":' + $.toJSON(codeHighlighter) + '}',
type: 'post',
dataType: 'json',
contentType: 'application/json; charset=utf-8',
cache: false,
success: function (data) {
tinyMCEPopup.editor.execCommand('mceInsertContent', false, data.d);
setTimeout(close, 100);
}
});
function close() {
tinyMCEPopup.close();
}
这个解决方法是我们摸索出来的,问题的真正原因目前还不清楚。
如果想体验一下IE 9 RC崩溃,请用IE9 RC访问:http://www.cnblogs.com/ie9rc_test.htm