3

HTML の親ウィンドウと iFrame のコンテンツは、同じ Web サーバー上に存在する場合、互いを認識し、自由に通信します。それらが DVD に保存されると、iFrame がローカル ファイルとしてトップに接続しようとすると、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.
                   }
           }
4

2 に答える 2

0

最終的に、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);
}
于 2012-05-08T18:19:07.460 に答える
0

window.location.protocolを確認するだけで、Web サーバー ( http: ) またはローカル ( file: ) で実行されているかどうかにかかわらず、さまざまな動作を行うことができます。

ただし、ブラウザによってこれらの権限が異なることに注意してください。そのため、ユーザーのブラウザも確認する必要があります。

于 2012-03-07T00:21:33.990 に答える