2013-08-12 94 views
3

我打開一個新窗口,當點擊一個按鈕,然後將該窗口的內容附加到已打開的窗口時,我正在使用的jQuery代碼是:從子窗口訪問父窗口的內容

$(".printBtn").on("click", function() { 
     var w = window.open("", "Purchase Report", "width=800, height=1100"); 
     var wi = $(window); 

     $(w.document.body).append(wi.find("#datatable_example")); 

     return false; 
    }); 

問題是,新窗口會打開,但父窗口的內容未被追加到新打開的窗口。然後我試圖追加wi.find("#datatable_example").html(),但那也沒用。

任何人都可以請看看,並告訴我我在做什麼錯在這裏?

UPDATE

試圖從「複製問題」以下,但沒有奏效:

$(".printBtn").on("click", function() { 
     var w = window.open("", "Purchase Report", "width=800, height=1100"); 

     $(w.document).ready(function() { 
      $(w.document.body).contents().append($(window).find("#datatable_example")); 
     }); 

     return false; 
    }); 
+0

普羅蒂普,如果你想檢查是否選擇匹配的東西,看長(爲0如果沒有找到):'的console.log(wi.find(「#datatable_example 「).length)' – xec

+0

可能重複[如何訪問子窗口的dom樹?](http://stackoverflow.com/questions/1258563/how-can-i-access-the-dom-tree-兒童窗戶) – oleq

+0

@oleq!爲什麼是這樣?我正在用完全不同的方式來實現這一點。 - 打開一個空白的URL窗口,即一個沒有內容的窗口,所以不需要任何時間加載,是不是? - 我試圖訪問父窗口的內容,它與子窗口沒有任何關係,但仍然存在無法檢索子項的問題。 –

回答

1

的問題,我是用var wi = $(window),而不是var wi = $(window.document)。這裏是工作代碼:

$(".printBtn").on("click", function() { 
    var w = window.open("", "Purchase Report", "width=800, height=1100"); 
    var wi = $(window.document); 

    $(w.document.body).append(wi.find("#datatable_example")); 

    return false; 
}); 
0

你的問題的根源是相同的起源政策,不會讓你觀察加載外部域的事件。如果你嘗試這種在開發者控制檯同時瀏覽SO,一切都很好:

var child = window.open('http://stackoverflow.com'); 

child.onload = function() { 
    alert('Popup loaded!'); // Fired! 
}; 

不過,如果你嘗試從其他域打開一個網頁,它失敗:

var child = window.open('http://stackexchange.com'); 

child.onload = function() { 
    // It's not gonna be fired unless you run it from stackexchange.com. 
    alert('Popup loaded!'); 
}; 

同樣的事情發生在你打電話window.open()window.open(''),因爲它會嘗試加載about:blank頁面,該頁面超出了您的域的範圍,這就是爲什麼您的瀏覽器不會觸發附加事件(與child.addEventListener('load')相同)。還要注意協議也必須匹配。

解決方法介紹setTimeout運行在一個單獨的JS線程的回調,有望後期足有DOM準備在那個時候:

var child = window.open(); 

setTimeout(function() { 
    var doc = child.document, 
     p = doc.createElement('p'); 

    p.innerHTML = 'Hello world!'; 
    doc.body.appendChild(p); 
}); 

它在最新的Chrome對我的作品,但是不同的瀏覽器有時會做怪在這種邊緣情況下,所以你可能需要用更大的延遲,順序檢查或其他的東西來調整這些代碼,如果在你的情況下失敗了。

所以,儘管告訴我們,如果它爲你工作,因爲我很好奇,這樣的解決辦法是罰款,生產代碼;)