【问题标题】:How to check if a frame is loaded using javascript? - not onload, not iframe如何检查是否使用javascript加载了框架? - 不是 onload,不是 iframe
【发布时间】:2016-04-14 21:06:05
【问题描述】:

问题:无论出于何种原因,旧知识库软件的链接已损坏。它是一系列嵌套的框架。有些指向正确的目标,有些没有,还有很多只是坏了。当它不能顺利工作时,它会使知识库的使用变得很麻烦

我要完成的工作:我想确定特定框架何时加载,然后解析框架的文档,用正确的 href 和目标替换锚标记。

资源和限制:我可以访问一些 .aspx 页面。我现在的目标包含一个加载知识库文档的框架集。然而,这个框架的 src 似乎不是一个实际的 .aspx 页面(物理文件)——不确定它是如何生成的,也不确定文档是如何存储的。我看到列出的 src,但在我有权访问的网络服务器上找不到它。

基本信息:页面是使用 .aspx 加载的(我不太了解其中的部分内容,也无法访问更深入的内容)。 .aspx 页面有一个在页面加载时生成的框架集。

.aspx 文件中的示例框架集代码:

    <FRAMESET id="FrameSetMainView" runat="server" border="0" framespacing="0" frameborder="0">
    <!-- This frame set is defined and generated in the code -->
    </FRAMESET>

我尝试在FRAMESET 标签中添加onload(这会导致页面在尝试加载时出错)。框架集接管了正文,因此我无法将内联脚本添加到页面底部以使其在加载后运行。

此外,产品年龄的 b/c - 它被强制进入兼容模式。因此必须使用 IE7 等效支持。 (没有addeventlistener 选项)

当前策略:我认为我可以开始工作,但感觉很花哨 - 将脚本添加到 &lt;head&gt;。大致如下:

    <SCRIPT>
    function load(){
        var frameset = window.frames;
        if(frameset.length > 0){ // frames have loaded - commence replacement

        }else{ // frames not loaded
            setTimeout(load,1000); // wait 1 sec, try again
        }
    }

    load();
    </SCRIPT>

其他解决方案?

【问题讨论】:

  • 您是否看过 1998 年的这篇文章:devx.com/tips/Tip/12741 它看起来可以解决您的问题。
  • @damo-s - 正如帖子中提到的,我不是真正加载框架的人,而且这个框架用于各种嵌套框架,所以这段代码实际上并没有用。我很感激,但老实说,我在寻找任何不适用于现代浏览器的好东西时遇到了麻烦。无论如何,在下面标记答案。
  • 哦,我错过了帖子中的那部分。不过很高兴您找到了解决方案。

标签: javascript frame compatibility


【解决方案1】:

使用 onreadystatechange 事件

是的,有一种可靠的方法可以解决这个问题,而无需借助计时器或其他滴答声。当页面加载时,为每个框架的“onreadystatechange”事件分配一个处理程序。而且您还必须调用它一次以确保它应用于已经加载的帧。下面的代码在 IE 兼容模式 5、7、8、9、10 下进行了测试,并按预期工作(在 IE11 中失败)。它还通过慢速加载帧进行了测试,没有问题。

参考资料:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=7" />
  <title>Demo</title>
  <script type="text/javascript">
    window.onload = function() {
      for (var i = 0; i < window.frames.length; i++) {

        (function(frame) {

          // called whenever a frame is loaded or reloaded
          frame.onreadystatechange = function() {
            if (frame.readyState === 'complete') {
              updateLinks(frame);
            }
          }

          // call once to apply to already loaded frames
          frame.onreadystatechange();

        })(window.frames[i].frameElement);
      }
    }

     // modify the links within the frame
    function updateLinks(frame) {
      var i, links, doc;
      doc = frame.contentDocument || frame.contentWindow.document;
      links = doc.getElementsByTagName('A');
      for (i = 0; i < links.length; i++) {
        // modify the links here
        links[i].href += '?time=' + (new Date()).getTime();
      }
      console.info('modified ' + links.length + ' links in frame ' + frame.src);
    }
  </script>
</head>
<frameset cols="*,*">
  <frame src="frameLeft.html">
    <frame src="frameRight.html">
</frameset>

</html>

【讨论】:

  • 很好 - 这看起来很完美,而且肯定更符合我的目标。谢谢你的提示。我已经有代码来修复底层框架中的锚点 - 只是无法掌握何时顺利运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多