【问题标题】:"Permission Denied" error in IE doesn't seem to match the javascript codeIE 中的“Permission Denied”错误似乎与 javascript 代码不匹配
【发布时间】: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


【解决方案1】:

好的,我解决了这个问题。尽管我可以猜到,但我不确定为什么此修复程序有效。似乎通过重写方法以避免在选择对象上使用选项数组,一切正常。我只引用它一次以获得长度......它允许。但如果我尝试通过assetList.options[i].anything 获取特定选项,那么我会被拒绝。

我仍然认为这是 IE11 的同源代码中的一个错误,但对我来说幸运的是,似乎 MS 没有重用代码,所以同一个错误并没有“保护”所有访问选择选项的方法.只需通过数组属性。或者,也许还有其他事情正在发生。我只知道这对我有用。

//By changing the value attribute, we change the current selection.  
assetList.value = currentAsset.toUpperCase();
if(assetList.selectedIndex == -1) {
    //this means the current asset wasn't in the list.
    if(assetList.options.length >= 1000) {
        //not allowed to add more than 1000. And if so, set the selectedIndex back
        alert("The Active Asset List contains the maximum of 1000 entries. \n" +
        "The current Asset ID '" + currentAsset + "' was not added to the Active Asset List.");
        assetList.selectedIndex = currentSelectedIndex;
        return;
    } else {
        var option = document.createElement("OPTION");
        option.value = currentAsset;
        option.text = currentAsset;
        assetList.add(option, 0);
        assetList.selectedIndex = 0;
    }
}

【讨论】:

  • 感谢您发布此问题的解决方案。您可以在 48 小时后将您的答案标记为已接受的答案,此时可以标记。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2011-12-11
  • 1970-01-01
  • 2014-04-15
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多