获取iframe内容会导致TypeError:'undefined'不是对象

时间:2012-01-30 06:51:23

标签: jquery iframe

以下函数用于获取/处理jQuery选择器或URL的HTML。如果传入了网址,则会生成iframe,并在加载iframe后抓取iframe的HTML。 (注意:我没有使用外部网址,只使用同一网站上的其他网页。

每当我传入一个URL时,该函数都会抛出TypeError: 'undefined' is not an object (evaluating 'myHTML.find')。我不明白为什么。有什么突出的吗?

1   mynamespace.html: function ( source ) {
2   // Grabs and processes the HTML of a jQuery selector or URL.
3      
4      var myHTML;
5
6         if ( $(source).is('iframe') ) {
7            // if it's an iframe, use .contents() 
8            myHTML = $(source).contents().find('html').clone();
9
10        } else if (source.indexOf('http://') === 0 ) {
11           // if it's a URL, load an iframe
12           $(document.body).append('<iframe id="printiframe" src="'+source+'"></iframe>');   
13           $('#printiframe').load(function() {
14               // once loaded, send it back into this function,
15               // where it can then be processed as an iframe
16               return mynamespace.html ('#printiframe');
17           });
18
19        } else {
20           myHTML = $(source).clone();
21        }   
22      
23        // Do stuff to the HTML here, such as myHTML.find('bla')...
24
25        return myHTML.html();
26   }

1 个答案:

答案 0 :(得分:2)

我希望你不要介意,但我编辑了你的问题,在代码中添加行号以便于参考,而不是在这里重复所有代码。

无论如何,我认为问题出在第10行开始的else if分支。执行顺序为:

  • 第12行 - 附加iframe
  • 第13行 - 制作ajax .load()请求
  • 第18/19行 - 分支的结尾
  • 第22-24行 - 您在那里有关于做事情的评论,此时myHTML尚未分配值(因此您得到的错误)
  • 第25行 - 从函数返回

然后,在异步 Ajax请求返回后:

  • 第16行 - 您提供的回调函数的主体。

这是异步代码的工作方式 - 无论请求有多快,回调都不会在其他代码执行完毕之后被调用。第16行的return语句不会从您的mynamespace.html()函数返回,它会从该回调返回(没有注意到该返回)。

您可以尝试稍微重新构建代码以使用同步 ajax请求,在这种情况下,执行将在第13行暂停,直到响应返回,但这为用户提供了糟糕的体验,因为浏览器在同一时间内没有响应。

最好重组以坚持使用标准的 aysnc Ajax,并允许我上面描述的执行顺序。如果不知道您的mynamespace.html()是如何被调用的,我不确定我是否会就此提出建议。

我相信你已经对"Same Origin Policy"搁浅,有时候也称为“跨域安全政策”#34;或该主题的其他变体。

您不会说出要输入的URL类型,但一般而言,如果源来自不同的域,则在一帧中运行的JavaScript无法访问另一帧的内容。

(有一些解决方法可以让跨域框架相互通信,但前提是两者都是合作的 - 这不是这里的情况。)