昨天我在Internet Explorer上遇到了一个有趣的问题。一个脚本在Chrome,Firefox,Safari上完美运行,但是使用Internet Explorer 11它并没有做任何事情。如果我打开调试器它运行顺利,一切都是应该的,但是当我关闭调试器时它停止工作,我不知道为什么会这样。我的第一个想法是IE扩展,但我禁用它们没有面纱。我尝试使用管理员权限在安全模式下运行,但似乎没有任何效果。
总结一切:IE - 脚本仅在调试器打开时运行。没有错误产生,它只是不起作用。
我会很高兴有任何想法我能做些什么。提前谢谢。
-------------- EDIT --------------- 这是没有运行的脚本。
for (var i = 0; i < AllStrategyGrids.length; i++) {
try {
isChange = true;
var data = $("#objectives").data("kendoGrid").select().data();
if (AllStrategyGrids[i].ID == data.uid) {
var jsonData = new Object();
jsonData.StrategicID = "1";
jsonData.ObjectiveID = $("#ObjectiveID").val();
jsonData.HeaderID = "00000000-0000-0000-0000-000000000000";
jsonData.PeriodID = "00000000-0000-0000-0000-000000000000";
jsonData.Strategic = "Please enter strategic";
jsonData.TaskStatus = "";
jsonData.TaskStatusID = "1";
jsonData.Position = "";
jsonData.Sorted = "1";
jsonData.SessionID = "00000000-0000-0000-0000-000000000000";
tmpGrid = AllStrategyGrids[i].Grid.data("kendoGrid");
var dataRows = tmpGrid.items();
var rowIndex = dataRows.index(tmpGrid.select());
$.ajax({
url: "CreateStrategy",
type: 'POST',
data:
{
strategics: jsonData,
VersionID: $("#VersionUID").val(),
index: rowIndex
},
success: function () {
tmpGrid.dataSource.read();
}
});
}
} catch (e) { }
}
答案 0 :(得分:3)
只是一个猜测,这可能是因为你在那个脚本中有一个console.log而在IE中,如果你的调试器被关闭,控制台对象就不存在......我们都在那里:)
一个简单的解决办法就是尽可能早地在你的网站上添加小垫片...除了IE之外的任何浏览器都不会做任何事情,只会停止可能阻止你的其他JS代码的执行错误运行...
<script>
if(!console)console={log:function(){}};
</script>
这里有一个更强大的解决方案:
'console' is undefined error for Internet Explorer
----编辑
好的,我可以从你的代码中看到的一件事是,你将会默默地失败,因为你已经使用了try catch但却没有做任何事情。这将捕获您遇到的任何异常(阻止它到达您的窗口,从而使您看起来没有错误)。我可能会在测试时至少警告错误消息(因此您不需要打开调试器)并查看是否有任何内容被抛出......
我自己怀疑你的ajax请求..或IE8中的未定义..所以添加一些日志警报(我知道的蛮力)来测试你在某些点的假设,例如
alert("Reach here and data="+data);
或者,我也可以看到你的ajax请求没有成功的回调,这可能是添加到你的通话中的好主意。可能是成功并不是出于某种原因......
$.ajax({
url: "CreateStrategy",
type: 'POST',
data:
{
strategics: jsonData,
VersionID: $("#VersionUID").val(),
index: rowIndex
},
success: function () {
tmpGrid.dataSource.read();
}
})
.fail(function() {
alert( "error" );
//handle a failed load gracefully here
})
.always(function() {
alert( "complete" );
//useful for any clean up code here
});
最后的思考。
因为你正在检查一个项目的DOM,我不知道什么时候调用这个代码但是以防万一它在页面重新加载后直接调用..并且让我们假设IE中的某些内容尚未准备就绪'点,可能是DOM尚未准备好被查询了吗?尝试在DOM准备好时执行此代码..很多方法可以实现这个$ .ready,setTimeout(f(){},1)或vanilla ...但是你明白了......
答案 1 :(得分:1)
注意:使用开发人员工具调试脚本:MSDN
为所有Internet Explorer实例启用脚本调试 在“Internet选项”菜单中,单击“高级”选项卡。然后,在 浏览类别,取消选中禁用脚本调试(Internet 资源管理器)选项,然后单击确定。要使更改生效, 关闭所有Internet Explorer实例,然后重新打开它们。