在IE6

2008-10-28 45 views
3

新打開的窗口設置OnLoad事件我需要爲新彈出的窗口onload屬性。 下面的代碼工作的Firefox:在IE6

<a onclick="printwindow=window.open('www.google.com');printwindow.document.body.onload=self.print();return false;" href='www.google.com'> 

然而,當我嘗試這個在IE中,我得到一個錯誤 - 「printwindow.document.body空或不是定義」

的目標是流行開來一個新的窗口,並打開該窗口打開對話框後,打開它

任何關於如何使這項工作的線索? 重要的是不要在目標頁面上的其他地方使用javascript,因爲我沒有控制它,所有的功能必須包含在我上面發佈的鏈接中

01子文件完成加載之前執行線;

回答

0

你是靠「printwindow.document.body.onload = self.print()」。我認爲你不能保證這一點。

這裏有一個想法:準備HTML或有什麼,但你在一個iframe需要的頁面一個頁面。這個頁面將有body.onload = self.print()。

+0

不幸的是,我有工作是這個鏈接。不過,我明白你的觀點。 我試圖做一個「setTimeout('printwindow.print()',3000);」,但是,它聲稱printwindow是不確定的,當我這樣做。有任何想法嗎? – SocialCensus 2008-10-29 10:52:01

0

的onload是,如果窗口對象,而不是身體的元素,儘管什麼HTML屬性可能導致你相信一個屬性。這是參考:

printwindow.onload 

但是,在這種情況下,你不能傳遞它的JavaScript字符串 - 你需要給它一個函數。因此,像完整的腳本看起來像這樣

printwindow.onload=function(){self.print();} 

現在,把他們放在一起

<a href="www.google.com" onclick="var printwindow=window.open(this.href,'printwindow');printwindow.onload=function(){self.print();};return false;" >try it</a> 

無論其!這對您的網址「www.google.com」不起作用。瀏覽器安全模型阻止父窗口訪問子窗口的窗口對象,除非它們都駐留在相同的域名。

+0

感謝您的簡潔回答。 這適用於Firefox,但不幸的是不在IE或Safari。這就好像printwindow.onload不是訪問這些瀏覽器的onload函數的正確方法。 您有其他建議嗎? – SocialCensus 2008-10-29 10:48:20

1

這是不可能的,除非這兩個網頁位於同一個域。您的代碼在FF中不起作用,而是打印當前頁面。如果網頁位於同一個域,那麼你可以這樣寫:

printwindow=window.open('/mypage.html'); 
printwindow.onload = function() { 
    printwindow.focus(); 
    printwindow.print(); 
} 
-1

,對所有的瀏覽器工作的最後(當然,可憐的)解決方案是使用setTimeout和調用印刷()的方式,而不是修改onload屬性:

<a onclick="self.printwindow=window.open('print.html');setTimeout('self.printwindow.print()',3000);return false;" href='print.html'> 
4

雖然前面的答案正確地指出了新的窗口必須來自同一個域,他們回答不正確,爲什麼他得到了錯誤「printwindow.document.body空或沒有定義」。這是因爲IE不會從window.open()返回任何狀態,這意味着你可以打開一個頁面並嘗試訪問它,然後纔可以使用onload。

出於這個原因,你需要使用類似的setTimeout檢查。例如:

printwindow = window.open('print.html'); 
var body; 
function ieLoaded(){ 
    body = printwindow.document.getElementsByTagName("body"); 
    if(body[0]==null){ 
     // Page isn't ready yet! 
     setTimeout(ieLoaded, 10); 
    }else{ 
     // Here you can inject javascript if you like 
     var n = printwindow.document.createElement("script"); 
     n.src = "injectableScript.js"; 
     body.appendChild(n); 

     // Or you can just call your script as originally planned 
     printwindow.print(); 
    } 
} 
ieLoaded(); 

這是進一步討論here