tinyMCEPopup.close轻松让IE 9 RC崩溃

昨天,微软发布了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

posted @ 2011-02-12 12:57  dudu  阅读(3547)  评论(15编辑  收藏  举报