2009-11-20 101 views
1

我不知道如何彈出窗口的DOM樹和它們從opener窗口的操作工作。什麼是正確的方式來實現我想要做的事情(如下所述)?如何用AJAX請求替換彈出窗口的內容?

我有一個正常的瀏覽器窗口,其中JavaScript函數收集所選元素並從中創建POST數據字符串。 然後我打開一個帶有佔位符內容的彈出窗口,將一個函數綁定到執行AJAX請求的window.ready,然後嘗試用AJAX結果替換彈出窗口中的HTML。

在代碼中,這是在JavaScript中運行的開啓器窗口:


function showMessages(queryParams, width, height) { 
    var mailWindow = window.open('html/blankwithdoctype.html', 'foo', 'resizable=yes,scrollbars=yes,height='+height+',width='+width); 
    var params = queryParams.substring(1); 
    $(mailWindow.document).ready(function() { 
     doPostRequest(params, mailWindow); 
    }); 
    return mailWindow; 
} 

function doPostRequest(queryParams, mailWindow) { 
    function callback(data, textStatus) { 
     var mv = mailWindow; 
     $(mv.document).find("html").html(data); 
    }; 
    $.post('MailFile.do', queryParams, callback); 
} 

$(mv.document).find("html").html(data);與Chrome開發者工具或Firefox +螢火打破,我注意到,暫時結果顯示,但JQuery的調用棧展開($.post('MailFile.do', queryParams, callback);後)後,再一次顯示的原始空白頁。

如果沒有調試器,我注意到結果頁面的渲染至少已經啓動,但它很快被原始佔位符頁面替換。

有趣的是肯定會在這裏。

回答

0

我懷疑jQuery庫沒有加載到彈出窗口中。然後,當執行彈出窗口中就緒事件之後的代碼時,$函數是未知的,導致錯誤。我可能是錯的,我從來沒有在一個交叉窗口的方式使用ready()(總是在document,而不是window)

編輯:你也可以做(而不包括jQuery的,在打開的窗口)什麼是替代每個$在打開的窗口中與window.opener.$。但這是相當醜陋的,現在,不是嗎?;-)

+0

不加載jQuery庫不是問題的根源。我原來的問題沒有解釋,所有這些操作都是在opener窗口中完成的,因此在打開的窗口中缺少JQuery應該不成問題。 – Eonwe 2009-11-20 10:00:12

+0

我意識到這一點。但是,如果我沒有弄錯,傳遞給打開窗口的'ready()'的匿名函數會在打開的窗口的全局上下文中執行。這就是爲什麼我認爲可能存在可視性問題。你真的嘗試過了嗎?可能是因爲關閉,'$'可見,但是,我不太確定。 – 2009-11-20 11:21:29

0

我實際上正在尋找一種方法來解決這個問題我自己。我猜測瀏覽器出於安全原因阻止訪問修改子窗口的DOM。 (我希望它給了某種錯誤,但我從來沒有得到一個)

在任何情況下,我不需要一個已經存在的頁面打開,我的應用程序確實需要一個單獨的彈出,但適應多個屏幕。

window.open(null, null, "...options...")打開彈出窗口後,我簡單地調用了document.write("...FULL HTML FOR POPUP..."),並基本上從頭開始構建了整個彈出窗口。從那時起,我可以訪問任何我想從父窗口執行的DOM操作。

這裏就是我談論的例子:

// using null for the URL (defaults to about:blank in some browsers) 
// using null for the Window Name (allowed me to have multiple popups) 
var popup = window.open(null, null, "width=600,height=600"); 

// overwrite the entire document with our own HTML 
popup.document.write('<!DOCTYPE html><html><head></head><body></body></html>'); 

// Using jQuery for DOM manipulation here 
var $popup = $("body", popup.document); 

我才真正在Chrome和Firefox測試這一點,很遺憾。而且,即使設置標籤也不會改變彈出窗口的標題。這不是一個完美的解決方案,但它適用於我的情況。