以下函数用于获取/处理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 }
答案 0 :(得分:2)
我希望你不要介意,但我编辑了你的问题,在代码中添加行号以便于参考,而不是在这里重复所有代码。
无论如何,我认为问题出在第10行开始的else if
分支。执行顺序为:
.load()
请求myHTML
尚未分配值(因此您得到的错误)然后,在异步 Ajax请求返回后:
这是异步代码的工作方式 - 无论请求有多快,回调都不会在其他代码执行完毕之后被调用。第16行的return
语句不会从您的mynamespace.html()
函数返回,它会从该回调返回(没有注意到该返回)。
您可以尝试稍微重新构建代码以使用同步 ajax请求,在这种情况下,执行将在第13行暂停,直到响应返回,但这为用户提供了糟糕的体验,因为浏览器在同一时间内没有响应。
最好重组以坚持使用标准的 aysnc Ajax,并允许我上面描述的执行顺序。如果不知道您的mynamespace.html()
是如何被调用的,我不确定我是否会就此提出建议。
我相信你已经对"Same Origin Policy"搁浅,有时候也称为“跨域安全政策”#34;或该主题的其他变体。
您不会说出要输入的URL类型,但一般而言,如果源来自不同的域,则在一帧中运行的JavaScript无法访问另一帧的内容。
(有一些解决方法可以让跨域框架相互通信,但前提是两者都是合作的 - 这不是这里的情况。)