使用Javascript(相同域)在iframe范围内声明和初始化全局变量

时间:2016-12-15 12:47:11

标签: javascript html iframe scope global-variables

有人问过如何在iframe中访问全局变量。我想知道如何在父级的iframe范围内声明和初始化全局变量。我知道我可以使用document.myGlobalVariable从iframe访问变量,但我希望只能通过说myGlobalVariable,前面没有document.来引用它。< / p>

这是我的HTML:

<html>
    <head>...</head>
    <body>
        ...
        <iframe src="myFrame.html"></iframe>
        <script type="text/javascript">
            var iframe = document.querySelector('iframe');
            var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
            iframeDocument.myGlobalVariable = "Hello";
        </script>
    </body>
</html>

myFrame.html

<html>
    <body>
        ...
        <script type="text/javascript">
            // wait for document to load so parent script can finish running
            $(function() {
                console.log(document.myGlobalVariable); // <-- This works
                console.log(myGlobalVariable); // <-- But this doesn't (and I want this one)
            });
        </script>
    </body>
</html>

谢谢!

2 个答案:

答案 0 :(得分:2)

你有3个问题。

  1. 在尝试修改DOM之前,您还没有等待iframe中的文档加载
  2. 在尝试阅读之前,您并没有等待设置该属性
  3. 您在document上设置了该属性,但正尝试从window
  4. 中读取该属性

    所以:

    <html>
        <head>...</head>
        <body>
            ...
            <iframe src="myFrame.html"></iframe>
            <script type="text/javascript">
                var iframe = document.querySelector('iframe');
                iframe.addEventListener("load", function () { 
                    var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
                    iframeDocument.myGlobalVariable = "Hello";
                });
            </script>
        </body>
    </html>
    

    <html>
        <body>
            ...
            <script type="text/javascript">
            setInterval(function () {
                console.log(document.myGlobalVariable);
            }, 1000);
            </script>
        </body>
    </html>
    

答案 1 :(得分:0)

回答我自己的问题:

我试图将变量添加到文档范围,如下所示:

document.myGlobalVariable

但是将它添加到文档范围意味着,为了从iframe的JS中引用变量,您必须将myGlobalVariable附加到变量的前面:iframe.contentWindow.myGlobalVariable = "Hello";

但正如我的问题所述,我希望能够仅通过变量名称来引用它:try { Assert.assertNotEquals(actualValue, expectedValue); } catch (Exception e) { // Thread the excpetion here }

为此,您只需将其添加到窗口范围,而不是:

self.polygon