1

我最近遇到了这个奇怪的错误。这是整个过程的流程。

  1. 有一个将刷新 div 内容的网站的 JQuery ajax 发布调用。它将参数传递给该网站并返回 HTML 脚本。
  2. 如果发布成功,它将首先清除 div 并使用从该网站检索到的返回值重写它。

错误发生在第 2 点。

这是奇怪的事情:

在我的机器上它工作正常(Windows 8),在虚拟机(Windows 10)中也是如此。我对两者都使用了相同的浏览器(IE 11 和 Edge)。但是,我的同事无法执行第 2 点,因为他收到客户端错误SCRIPT70:权限被拒绝。他正在使用Edge。

我将在下一次更新中发布部分代码。但到目前为止,我已经在安全性方面对其进行了检查,但实际上没有。

我该如何解决这个问题?

更新

这是通过 JQuery Ajax Post 调用一个网站(或 aspx)并检索和更新 div 的代码。

function RefreshDiv(isChild) {
  var data = {
    ActionType: "AJAX",
    Action: "Refresh"
  };

  $.post("RefreshDivContents.aspx", data, function (result) {
    if(result != '') {
      var divItems;

      if(isChild) {
          divItems = window.parent.$("#TopDiv").find("#DivItems");
      }
      else {
          divItems = $("#DivItems");
      }

      divItems.empty(); // error hit here.
      divItems.append(result);
    }
  });
}

更新 #2 我更新了示例代码以获取更多信息。另外,我把错误放在了发生的地方,但我不知道它为什么会出现在那里。它应该只清除项目。

更新#3 根据 Jacob 的回复,我很好奇这两个 iframe src 的协议和端口号是什么。以下是基于控制台的结果。

在此处输入图像描述

4

1 回答 1

1

这看起来有问题:

divItems = window.parent.$("#TopDiv").find("#DivItems");

我从这个片段中了解到,关键问题在于Same-origin policy。一个来源的文档不能更新另一个来源的内容。例如,在这种情况下,您的代码可能正在运行iframe并尝试更新父文档中的 div。如果两个文档具有相同的来源,则没有问题。

这就是我询问 URL 的原因。必须考虑两个文档的 URL 是什么,以找到使脚本正常工作的解决方案:

如果是文档 A 来自http://example.com和文档 B 来自 的问题http://www.example.com,则文档 B 只需运行document.domain = 'example.com';以更改来源。

如果两个文档具有不同的端口号但域和协议相同,则它们都可以将它们设置document.domain为相同的域以从其源中清除端口号,从而使它们兼容。

如果一个使用 HTTPS 而另一个使用 HTTP,那么令人惊讶的是,非安全框架完全加载了,即使加载了,您也很难访问另一个文档。

如果两者的域名完全不兼容,则必须实施CORS

总而言之,您需要了解同源策略,这确实很痛苦,但可以保护用户免受恶意脚本的侵害,然后构建您的应用程序以适应它。

于 2016-10-14T03:42:15.347 回答