如何在“之前测试浏览器的权限”;不安全的JavaScript试图访问URL为“的帧”;(镀铬局部框架)?

如何在“之前测试浏览器的权限”;不安全的JavaScript试图访问URL为“的帧”;(镀铬局部框架)?,javascript,google-chrome,iframe,local,cross-site,Javascript,Google Chrome,Iframe,Local,Cross Site,当HTML父窗口和iFrame内容位于同一web服务器上时,它们相互了解并自由通信。当它们被保存到DVD时,当iFrame试图以本地文件的形式与top联系时,Chrome会抛出一个“不安全的JavaScript尝试使用URL访问框架” 下面的catch捕获权限错误,但该错误仍由浏览器注册并对用户可见 在尝试访问之前,是否可以先测试是否允许此访问,以排除不安全的JavaScript错误 // Called from script in an iframe

当HTML父窗口和iFrame内容位于同一web服务器上时,它们相互了解并自由通信。当它们被保存到DVD时,当iFrame试图以本地文件的形式与top联系时,Chrome会抛出一个“不安全的JavaScript尝试使用URL访问框架”

下面的catch捕获权限错误,但该错误仍由浏览器注册并对用户可见

在尝试访问之前,是否可以先测试是否允许此访问,以排除不安全的JavaScript错误

           // Called from script in an iframe
           function findSiblingIFrame(sibId) {
                 try {
                       var sibFrame = top.document.getElementById(sibId);
                       if (sibFrame != null) {
                           alert("found sibling iframe");
                       } else {
                           alert("did not find sibling iframe");
                       }
                   }
                   catch (err) {
                      alert("not allowed to find sibling iframe");
                      // Would rather test if permission first to prevent
                      // browser from registering the error.
                   }
           }

只需检查window.location.protocol,您就可以在web服务器(http:)或本地(文件:)上执行不同的行为


您应该知道,不同的浏览器对这些内容有不同的权限,因此您也应该检查用户的浏览器。

我最终使用HTML5消息传递在iframe层次结构上下传递潜在的沙盒请求

例如,嵌套iframe层次结构中的每个html页面都可以访问以下javascript。如果捕获的HTML5消息请求无法在本地执行,则消息将传递给父级。父级还可以将消息向下传递给iFrame。这仅仅是因为所有页面都可以访问相同的javascript文件

// function to handle message request
function messageHandler(argJSON) {
    // A collection of available functions for inbound messages
    var msgFunctionMap = new Object();
    msgFunctionMap.removeBorder = removeBorder;
    msgFunctionMap.restoreBorder = restoreBorder;
    // ...more
    // try execute request
    try {
        var jsonObj = JSON.parse(argJSON.data);
        msgFunctionMap[jsonObj.request](jsonObj.args);
    }
    catch (err) {
        alert(" Request not supported: " + argJSON.data);
    }
};
// example function to remove object id x's border if it exists in "this" window, else pass request up
var removeBorder = function (jsonMsg, argObj) {
    var xiFrame = document.getElementById("x");
    if (xiFrame != null) {
        xiOrigWidth = xiFrame.style.borderWidth;
        xiFrame.style.borderWidth = '0px';
    }
    // Otherwise, pass message up else if (window.parent && window.parent.postMessage) {
        window.parent.postMessage(jsonMsg.data, "*");
    }
};
//... more
// pass predefined message request from child to parent
function messageUpHandler(message) {
    if (window.parent && window.parent.postMessage) {
        window.parent.postMessage(message.data, "*");
    }
};
// Listener for child messages
if (window.addEventListener) {
    window.addEventListener("message", messageUpHandler, true);
}

退房作为起点,它可能有帮助,也可能没有帮助。感谢链接,但检查浏览器权限级别无助于此情况。我正在寻找一种干净的方法来确定父节点是否与子节点在同一个域中,而不必通过parent.location.xyz调用生成跨站点脚本错误。这就像必须把手放在炉子上才能测试炉子是否热。解释FireFox在浏览器页面上的页面图标上出现的红色大错误意味着代码工作正常,这让人很不舒服。只是Chrome出现了(文件:)问题,但我担心(http:)也会开始限制iframe与父级通信。请参阅下面我发布的结果