【问题标题】:Run script before iframe loads在 iframe 加载之前运行脚本
【发布时间】:2022-01-25 19:18:05
【问题描述】:

我正在使用嵌入在应用程序中的帮助系统。

帮助的重要部分尝试使用相同的 document.domain 值,但子 iframe 似乎在父 iframe 之前运行其 document.domain 设置。这是一个问题,因为它会引发安全错误并停止 javascript 执行。为了给出正确的想法,这基本上是 html 的样子:

<html>
    <head>
        <!--Occasionally runs second-->
        <script src="change-document-domain.js"></script>
    </head>

    <body>
        <iframe>
            <html>

                <head>
                    <!--Occasionally runs first-->
                    <script src="change-document-domain.js"></script>
                </head>

            </html>
        </iframe>
    </body>
</html>

帮助受到构建它的程序的很大限制。我可以对父脚本或父脚本标记进行任何更改以使其在 iframe 或其脚本之前加载吗?

如果您有任何问题,请告诉我,并一如既往地感谢您!

【问题讨论】:

    标签: javascript html iframe asynchronous


    【解决方案1】:

    您可以做的一件事是在脚本加载后设置 iFrame 的来源。

    因此,创建一个在页面加载时加载脚本的函数,然后在脚本完成后,您可以设置一个回调函数,该函数将在脚本加载完成后执行。

    function loadScript( url, callback ) {
      var script = document.createElement( "script" )
      script.type = "text/javascript";
      if(script.readyState) {  //IE
        script.onreadystatechange = function() {
          if ( script.readyState === "loaded" || script.readyState === "complete" ) {
            script.onreadystatechange = null;
            callback();
          }
        };
      } else {  //Others
        script.onload = function() {
          callback();
        };
      }
    
      script.src = url;
      document.getElementsByTagName( "head" )[0].appendChild( script );
    }
    
    
    // call the function...
    loadScript('change-document-domain.js', function() {
      //executes after the script is laoded.
      document.getElementById("myFrame").src = "sourceOfIFrame.html"
    });
    

    【讨论】:

    • 虽然我没有将此作为我的解决方案,但我在其他地方使用了类似的机制。这是最完整的答案。谢谢!
    【解决方案2】:

    不确定您是否想要这种解决方案。但是为此目的使用 javascript 或 jquery 可能是一种解决方法。

    <iframe id="frame" src="">
    </iframe>
    

    而您只需在加载父内容 javascript 后触发 iFrame 加载...

     $("#frame").prop("src", "http://iframe-url.com/");
    

    【讨论】:

      【解决方案3】:

      尝试创建一个单独的页面,其中包含 iframe 的内容并喜欢它,这可能会稍微慢一些,但会按顺序加载。

      【讨论】:

        【解决方案4】:

        根据 runco​​rn 的回答(我没有这样做),通过包装一个函数来添加时间延迟(一秒):

        setTimeout(function() { 
        $("#frame").prop("src", "http://iframe-url.com/");;
        }, 1000);
        

        【讨论】:

          猜你喜欢
          • 2017-01-13
          • 2018-08-16
          • 1970-01-01
          • 2021-05-26
          • 2021-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多