【发布时间】:2021-07-01 10:30:28
【问题描述】:
在 IE 中运行是一个使用框架构建的遗留应用程序,它使许多跨框架引用,如 parent.header.blah.blah 和 parent.sidebar.so.and.so。在旧的 IE 兼容模式下工作正常。适用于铬和边缘(铬)。
但是在没有打开兼容模式的常规 IE 中,它会在第 43 行抛出权限被拒绝错误。问题是,它会在控制台中抛出错误,无论第 43 行是什么!!!我添加了多余的代码行以将其他代码向下推,取出代码以将其他代码向上移动。没关系,控制台总是说它在第 43 行。
我在其中设置了断点,并注意到直到 javascript 完成运行后,该错误才真正添加到控制台。该页面非常大,包含大量 javascript,并且很难在不破坏页面的情况下将某个部分注释掉以试验可能导致权限被拒绝的原因。
据我所知,Permission Denied 应该表示同源违规,但是所有帧和文件都通过同一个 URL 上的同一个 servlet,只有参数发生变化。我把每一帧的document.domain都打印出来了,都是一样的。
所以..我什至不确定现在该做什么来缩小范围。我怎样才能找出真正有问题的代码段......甚至部分?
更新 - 所以看起来错误实际上来自另一个框架中的一个函数,从这个框架被调用(顺便说一下,离第 43 行不远)。该功能正在管理选择列表中的选项。实际错误在这里:
for (var k=0; k < assetListz.options.length; k++) {
if (assetListz.options[k].value == currentAsset) { //permission denied!
inList = true;
assetListz.options[k].selected = true;
break;
}
}
assetListz 上没有“z”,直到我这样做以确保我不会意外地获得其他资产列表的范围。我可以测试assetList 的长度,但是只要我检查第二行的值,kaboom。想法?
更新 2 -
我更改了代码以获取每个引用中的资产列表。没有存储它。在同一个地方爆炸。
for (var k=0; k < document.getElementById('assetList').options.length; k++) {
if (document.getElementById('assetList').options[k].value == currentAsset) {
inList = true;
document.getElementById('assetList').options[k].selected = true;
break;
}
}
【问题讨论】:
-
没有看到代码我们只能推测。除了 CORS 问题,还有 Permission denied 错误的用例。对 DOM 元素的过时引用可能会在 IE 中触发此错误。也就是说,您将引用(对 iframe 中的元素)存储到变量,然后重新创建元素(例如设置 innerHTML),变量中的引用已过时,不再可访问。
-
而不是特定于 javascript,这可能是特定于 IE,例如 support.microsoft.com/en-us/topic/…
-
@Teemu - 该应用程序确实经常引用选项数组。这给了我一些寻找的东西。这是我需要的。很抱歉没有把 js 放上去,但是由于错误所在的行是在说谎,我不得不粘贴数百行 javascript ......这不会很有帮助。找到问题出在哪里是我的问题。
-
IE 在错误消息中的行号一直不准确,但并不是那么不准确。确保页面未缓存,并仔细检查消息中的源文件,可能它指向 html 文件中的内联事件侦听器属性,其中调用了导致错误的实际函数。
-
@Teemu - 您的第一个建议引导我找到我在上面的“更新”部分添加的信息。还有什么想法吗?
标签: javascript internet-explorer internet-explorer-11