【问题标题】:Unsafe javascript attempt not caught by try block不安全的 javascript 尝试未被 try 块捕获
【发布时间】:2012-08-21 12:29:38
【问题描述】:

我的主页中嵌套了一个 iframe。 iframe 包含以下脚本:

var adfoxPlaceholderId = 'placeholder';
var adfoxWindow = window;
var adfoxDocument = window.document;
var adfoxPlaceholder = adfoxDocument.getElementById(adfoxPlaceholderId);

try {
    while((adfoxPlaceholder == null) && (adfoxWindow != window.top)) {
        adfoxWindow = adfoxWindow.parent;
        adfoxDocument = adfoxWindow.document;
        adfoxPlaceholder = adfoxDocument.getElementById(adfoxPlaceholderId);
    }
} catch(ex) {
    console.log('catch-block');
}

由于安全策略(iframe 和主页来自不同的 url),脚本在adfoxDocument = adfoxWindow.document; 行中断。 我的问题是为什么这个错误没有被 catch 块捕获,就好像它没有被放入 try-catch 块一样?谢谢你。

【问题讨论】:

  • 请通过格式化代码使您的问题可读。
  • 您有两行带有adfoxDocument = adfoxWindow.document 的行,其中一行在try/catch 块中。你确定第一个是它正在破坏的那个吗?
  • 我确信这不会发生在 IE、Chrome、Safari 和 FF 上。您收到此错误的浏览器/版本是什么?
  • 尝试将 try catch 放在 while 中,并在 catch 中设置 adfoxPlaceholder = null。我不知道这是否会工作,因为没有工作小提琴。但是通常跨域警告在 javascript 中是可以捕获的,我已经做了几次,不是使用 while 循环,而是使用 setInterval。
  • “adfoxDocument = adfoxWindow.document”这一行在这里只有一次,在 try 块中。 “var adfoxDocument = window.document;”是对的。

标签: javascript try-catch


【解决方案1】:

发生这种情况是因为它不是javascript 异常。这是一个浏览器安全功能。发生这种情况是因为您的 iframe 和您的网站没有相同的 URL。

同源策略的来源可以在here找到。

话虽如此,有办法通过第三方工具或javascript 技巧“规避”此政策

这里有几个选项"

easyXDM

ways-to-circumvent-the-same-origin-policy

希望对你有帮助

【讨论】:

  • 领先信息:why isn't this error caught by catch block by OP.
  • 尽管由于同源策略您仍然收到错误消息。阅读源代码。它可能会澄清一点。
  • 是的,你会得到这个错误,提问者知道这一点。但问题是 为什么 try/catch 块没有捕捉到这个错误(实际上它被捕捉到了)。这些问题不是为了防止错误。
  • 抱歉误导,Eric,我对我测试过的浏览器只字未提。 Opera 没有在控制台中显示“catch-block”字符串,IE 工作正常(捕获异常),FF,Chrome 都显示,“catch-block”和抛出错误。感谢您的回答,我会阅读。
  • 根据我的经验,try/catch 块没有捕获到错误,这看起来像是浏览器中的一个缺陷,因为它们没有提供优雅处理情况的选项(不停止整个脚本),并且唯一的解决方法是将潜在危险的代码包装在另一个代码条件中,绕过 try/catch 并浪费其所有功能。这不是很荒谬吗?
【解决方案2】:

这在我的测试中没有发生。在 IE、FF、Chrome 和 Safari 上进行测试。错误不在您在问题中发布的代码中。

http://jsfiddle.net/hg2cs/1/

【讨论】:

  • 不管怎样,你在控制台中有一个抛出的错误。我该如何预防?
  • 如果阻止您的意思是“阻止错误显示在控制台中”,则不能。反正这没什么大不了的,用户是不会看到的,只是另一个好奇的开发者。
  • 是的,我的意思是这个。不幸的是,这对我来说是一个重要的问题,因为我与其他开发人员和好奇的用户一起工作。如果有的话,能否请您显示一些链接,以确认无法阻止控制台显示?
  • 链接?没有链接,您的代码就是证明。浏览器中的控制台行为没有标准 ISO。是否在控制台中显示错误由浏览器供应商决定。 IE 和 FF 不显示,因为您发现了错误。即使在您的代码捕获异常之前,Safari e Chrome 也会显示它。我怀疑这是一种 Webkit 行为。控制台中这样的错误不是问题,除非你正在做一些你不应该做的事情......
猜你喜欢
  • 2020-05-09
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 1970-01-01
  • 2015-03-31
  • 2010-09-12
  • 1970-01-01
相关资源
最近更新 更多