2012-01-30 42 views
1

下面的函數旨在獲取/處理jQuery選擇器或URL的HTML。如果傳入一個URL,它會生成一個iframe,並在iframe加載後抓取iframe的HTML。 (注意:我不使用外部URL,只是在同一網站上的其他頁面。獲取iframe內容導致TypeError:'undefined'不是對象

無論何時我傳入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

做你的面和iframe坐在相同的域? – Hadas 2012-01-30 07:05:42

+0

是的,iframe src和其他所有內容都在我的單個域中。 – supertrue 2012-01-30 07:14:21

+0

我希望你不介意編輯,但是我會放入行號,以便答案可以輕鬆地引用代碼的某些部分。 – nnnnnn 2012-01-30 07:44:06

回答

2

我希望你不介意,但我編輯你的問題行號添加到代碼爲便於參考,而不是重複所有的代碼在這裏。

無論如何,我相信問題是與else if分支上線10開始執行的序列將是:

  • 12行 - 附加的IFRAME
  • 第13行 - 使AJAX​​請求
  • 第18/19行 - 分支的末端
  • 第22-24行 - 您有關於做什麼的評論,此時myHTML尚未分配一個值(因此您得到的錯誤)
  • 25行 - 從功能

然後返回時,異步 Ajax請求返回後:

  • 行16 - 你所提供的回調函數體。

這是異步代碼的工作方式 - 不管請求的速度有多快,直到其他代碼執行完畢後纔會調用回調。第16行的return聲明不會從您的mynamespace.html()函數返回,它將從該回調函數返回(並且沒有注意返回)。

你可以嘗試稍微調整你的代碼使用同步 Ajax請求,在這種情況下執行將在13號線暫停,直到反應回來,而是爲用戶提供一個糟糕的體驗,因爲瀏覽器會同時沒有反應。

更好地重組以堅持標準aysnc Ajax,並允許我上面描述的執行順序。不知道你的mynamespace.html()被稱爲我不知道我可以建議。

我相信你已經在"Same Origin Policy"上擱淺了,有時也被稱爲「跨域安全策略」或其他變體。

你不說什麼類型的URL你輸入,但從一般意義上說,運行在一個框架中的JavaScript不能訪問另一個框架的內容,如果源是來自不同的域。

(有一些變通辦法來獲得跨域框架相互通信,但只有在兩個正在合作 - 這不會是這裏的情況)

+0

是的,我意識到這些問題 - 我實際上只是使用單個域,與腳本位於同一個域。 – supertrue 2012-01-30 07:12:00

+0

哦,對不起。讓我編輯... – nnnnnn 2012-01-30 07:24:27

+0

謝謝,這是非常翔實的。該功能只是在點擊事件上調用。我如何重組來解釋執行的順序?我想一種方法是將HTML從HTML處理中分離出來,比如my.HTMLget()和my.HTMLprocess(),並在iframe .load()調用中使my.HTMLprocess()成爲回調函數。 – supertrue 2012-01-30 08:07:41

相關問題