2010-06-08 42 views
2

我目前正在寫一個bookmarklet加載和在當前窗口追加一個新的<script>標籤執行遠程js文件,像這樣:書籤,JS注入和彈出問題

javascript:(function() { 
    if(typeof __bml_main != "undefined") return __bml_main.init(); 
    var s= document.createElement('script'); 
    s.type= 'text/javascript'; 
    s.src= 'http://127.0.0.1:8000/media/bookmarklet.js'; 
    void(document.body.appendChild(s)); 
})();

我的書籤需要執行一些dom操作以便從正在查看的頁面提取數據,然後打開一個新的彈出窗口來列出它們。

問題是:如果我想繞過彈出窗口阻止程序,我無法從注入的腳本打開新窗口。我需要從小書籤代碼的開頭開始,並在需要時稍後訪問它。

我試圖做服用點是這樣的:

javascript:var my_popup = window.open('http://127.0.0.1:8000/resources/manage/new/', 'newResourcePopup',config='height=200,width=400,toolbar=no,menubar=no,scrollbars=no,resizable=no,location=no,directories=no,status=no'); 
(function() { 
// script injection (...) 
})();

但如果我再嘗試從我的遠程加載腳本訪問my_popup,大多數瀏覽器將彈出安全警告,不會讓我訪問窗口對象。這是可以理解的,因爲腳本不是來自顯示頁面的同一個域名,但我有點卡住了...

解決方法是使用div覆蓋,但我更願意打開窗口在這種情況下。

任何提示?

回答

3

你可以在你的bookmarklet.js文件中加載窗口的標記爲一個字符串,然後使用window.open而沒有URL(或者用「about:blank」,我忘記了哪個更適合跨瀏覽器),並使用my_popup.document.write將標記寫入新窗口。

您可能會發現即使沒有跨域問題,您也無法在以後打開窗口,除非您直接回應用戶操作  —這可能是件好事。 :-)

+0

謝謝你的接吻! :) 這是一種醜陋的,但它工作得很好。其實,我想我會使用document.createElement()而不是document.write()來創建頁面的dom。 about:blank頁面沒有任何文檔類型,但聽起來更符合標準,操作節點而不是將標記附加爲字符串。 – Denis 2010-06-08 01:34:42

+0

@Neewok:很高興幫助。你知道,自從我最後一次處理創建彈出窗口已經很長時間了,'document.write'仍然更可靠,而且我沒有更新我的想法。我從來沒有在空白文檔中從頭開始創建DOM,但我原則上無法想象爲什麼它不應該工作,好的想法。 :-) – 2010-06-08 06:47:18