2012-12-12 61 views
0

我想首先指出,我知道這可能是因爲跨域限制而失敗 - 只是希望確認。Javascript:檢索window.open innerHTML

我有一個窗口,我用javascript打開。然後,我使用Ajax請求來提取站點的內容,並在該窗口中回顯(包括在基礎href鏈接中強制它相對工作)。

的想法是,我可以刮JS渲染HTML,看看該網站是真正運行我們的橫幅或不

我打開窗戶這個(我們有一個懷疑,他們都沒有!):

msaScrape.msaWin = window.open ('null.php', 'msa_weed', "scrollbars=yes,toolbar=no,status=no,width=1000,height=1000"); 

這將加載新的窗口與目標頁面的內容,並正確地加載和呈現JS燒製的東西(橫幅是IM後)。

我已經試過msaScrape.msaWin.document.body,msaScrape.msaWin.document.body.innerHTML和許多其他許多組合,但沒有人會讓我回到完全呈現的HTML。

當我從Ajax請求的原始緩衝區運行測試時,我可以檢測嵌入的字符串 - 但由於橫幅正在通過JS加載,所以我需要將它們加載到DOM,然後才能搜索HTML橫幅ID。

是我想要做的事情或者我想做的事情不能做到嗎?我覺得奇怪的是,我可以寫入這個彈出窗口,並且我可以掃描(並找到匹配)原始的,未渲染的緩衝區。它一旦我允許彈出頁面呈現掉落的HTML,我就無法獲取源代碼。

如果需要,我可以發佈整個(小)JS位,我試圖做刮和匹配 - 只要與客戶端檢查,如果他們介意我這樣做(其私人客戶端,並不想他們心裏難受)

+0

爲什麼你需要在瀏覽器中做到這一點?它會像預期的那樣失敗。 – Christophe

+0

如果你找回了一些HTML(但不是所有的「呈現」HTML - 記住,它不是呈現給HTML,而是從HTML和JavaScript呈現的表示形式是DOM),那麼它就是*不是*跨域腳本問題。啊,你想得到確認,對吧?我應該將確認作爲答案嗎? – hakre

+0

我想我應該澄清: 我要求一個頁面的PHP,給我原始的HTML代碼,需要執行一些JavaScript來加載橫幅。 我不能只是掃描原始緩衝區 - 它需要由瀏覽器呈現才能看到橫幅。我需要body的innerHTML,以便我可以在請求期間測試其中一個橫幅。 我的問題可以被翻譯爲:如果我將一個遠程頁面的整個輸出加載到一個popupwindow(whos URL是我的網站上的抓取遠程以使域名匹配的php頁面)是否仍會由於跨域協議? –

回答

0

這是我如何得到它來掃描遠程加載窗口的innerHTML:

  setTimeout(function(){ 
       window.parent.document.getElementById('stopScraper').focus(); 
       if(window.parent.msaScrape.msaWin.document.body.innerHTML.match(window.parent.msaScrape.msaTest)){ 
        window.parent.msaScrape.msaHits++; 
       } 
      }, 1000); 
      window.parent.focus(); 

stopScraper只是一個形式的輸入,讓我給焦點返回到調用頁面。

這個問題是由彈出沒有足夠的時間來渲染其Dom(加上我不得不注入基礎href =「http://www.example.com」時,我把內容作爲一個字符串PHP,以確保路徑工作時,我將字符串echo'n返回null.php)

我運行它,請求之間的間隔爲8.5秒,然後再給彈出的另一秒完全加載它的Dom之前試圖閱讀由頁內JS文件加載的內容。從活,跨域測試

最終結果:

要求:4024個 擦傷:4024(didnt錯過任何一個節拍!) 點擊數:147(一直在尋找大教堂特定橫幅)

如果人們想要更多的解釋我是如何做到這一點,那麼它可能會更好地給我發電子郵件,我只是給你發送整個引擎 - 它有一個內置的測試模式來測試它,然後再嘗試在你的其他域!有幾個文件 - 加上我不太確定我在做什麼的合法性,所以不要認爲我應該公開全部答案!

簡而言之,如果您使用PHP file_get_contents通過相同的域加載內容,請添加基礎href(如果缺少),將回顯作爲null.php的內容(使用JavaScript打開此窗口,如頂部所示問題) - 這裏的代碼將匹配對滿載大教堂

測試串

我想在這一點上,我需要測試一切(包括外部JS文件加載橫幅強調),所以不得不使瀏覽器中的原始HTML導致JS觸發。我也看過PhantomJS,但最終並不需要它!管理解決問題只有JS :)