将iframe中的html加载到iframe的父级时,为什么浏览器会挂起?

时间:2011-08-09 17:50:45

标签: jquery html

所以我“解决”了我的实际问题,并改变了问题“为什么这是一个问题?”

我在这里有这个代码:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>iFrame Page Loading</title>
  <script type='application/javascript' src='http://code.jquery.com/jquery-latest.js'></script>
  <script type='application/javascript'>
    $(document).ready(function() {
      var $form = $('form');
      var $target = $('#target');

      // Create an invisible iframe right after the form.
      var $iframe = $('<iframe name="_hidden"></iframe>').hide();
      // Change this line to the commented version after it to fix all problems:
      $target.append($iframe);
//      $target.parent().append($iframe);

      // Make the form target the iframe.
      $form.attr('target', '_hidden');
      // Make the form action the 'ajax_load' value.
      $form.attr('action', $form.find('.ajax_load').attr('value'));
      // On form submit, create an event to replace $target with iframe's
      // contents on iframe load.
      $form.submit(function() {
        $iframe.bind('load', function() {
          $target.html($iframe.contents().find('*').html());
          // Uncommenting this line fixes Firefox but not Safari - see below
//          $target.append($iframe);
          $iframe.unbind('load');
        });
      });
    });
  </script>
</head>
<body>
  <form method='get' action=''>
    <input type='hidden' class='ajax_load' value='test.html' />
    <input type='submit' value='Load' />
  </form>
  <div id='target'></div>
</body>
</html>

(应该可以通过将“test.html”更改为其他内容来测试此内容,只要它是本地文件;由于跨域限制,google.com将无效)

它完全符合我的要求:首先它在#target中创建一个不可见的iframe,然后更改表单,以便抓取新的URL并定位iframe。在提交时,iframe会加载抓取的内容。加载时,iframe中的html替换#target中的html。

问题是,在浏览器加载iframe后,它会继续加载......某些东西。 Firefox并没有说出什么,并愉快地继续喋喋不休。 Safari说出了问题并且停止了,我可以得到的最好的信息是iframe加载会发生某种疯狂的递归。这不太理想。

当我将隐藏的iframe放在目标之外时,问题就消失了。只有在确保在加载html后再次将iframe附加到目标时,它才会在Firefox中消失。

所以,我不再有实际问题了,但我非常想知道为什么我正在做的事情确实是一个问题:从隐藏的iframe加载HTML并使用它来替换HTML的内容那个iframe的父节点。

1 个答案:

答案 0 :(得分:0)

您可以在代码中添加一些消息,以确定我们确切地挂在哪一行。这应该可以缩小故障范围。