【发布时间】:2014-07-11 11:59:22
【问题描述】:
我们在 IE11 上的 Web 应用程序中遇到了一个非常奇怪的问题(其他 IE 版本工作正常)。 该应用程序基于 SmartGWT (http://www.smartclient.com/product/smartgwt.jsp) - SmartClient javascript 框架上的 GWT 包装器。
IE11 进入永无止境的循环。 它非常随机地发生,我们没有步骤来重现它。我们应用程序的复杂性使得无法发布代码示例。 最常见的情况发生在用户使用应用程序时,然后他们最小化浏览器窗口并在一段时间后恢复它并尝试继续工作。
无休止的循环是由奇怪的比较结果引起的,当表达式 'true === true' 结果为假时。
对比代码为:
$wnd.isc.isA.Canvas(obj) === true
代码在包含由 GWT 编译的 javascript 的 iframe 范围内执行。
$wnd 是加载 SmartClient javascripts 的 Web 应用程序的主(顶部)窗口。
isc.isACanvas(..) 是一个返回 true 或 false 的方法,取决于作为参数传递的对象是否属于 Canvas 类型 - Canvas 是 SmartClient 框架中的一个特殊类,而不是 HTML Canvas 元素。
isc.isA.Canvas = function (object) {
return (object != null && object._isA_Canvas);
}
在创建对象时,对象上的_isA_Canvas 设置为true(布尔值true 不是字符串形式的'true')。
我已经在使用有问题的比较的部分添加了一些测试代码 - 这是一个简化版本:
var trueCheckCount = 0;
function isCreated(id){
var obj = $wnd.window[id]; // objects are stored in window by id
var comparisonResult = $wnd.isc.isA.Canvas(obj) === true;
if (!comparisonResult ) {
if ($wnd.isc.isA.Canvas(obj) == true) {
alert("TRUE != TRUE (was OK: " + trueCheckCount + "x before)");
} else {
trueCheckCount++;
}
}
return comparisonResult;
}
在不同的测试运行中,警报会在不同的通过次数后显示。例如。第一次通过了 358 698 次,第二次通过了 330 125 次……
有人知道可能是什么问题吗? 'true !== true' 怎么可能发生?
环境:
IE11 (Windows7/8)
SmartGWT: v9.0p_2014-03-02/LGPL Development Only (built 2014-03-02)
GWT: 2.4
在屏幕截图中可以看到一些额外的调试信息: https://drive.google.com/file/d/0B8h18b-AMFzXa3NZZ2dOX2txb1k/edit?usp=sharing
【问题讨论】:
-
等一下.. 我没有阅读所有内容,但这很有趣。您是说如果您在控制台中执行 true !== true 会显示为 true?
-
您也应该提醒
$wnd.isc.isA.Canvas(obj)的值,以确保它在这些时刻设置为true。
标签: javascript gwt smartgwt internet-explorer-11