2014-03-26 70 views
1

我有一些userscripts使用document.write()的不userscript工作與Firefox

var tab = window.open('', '_blank'); 
tab.document.write(myCustomHtml); 
tab.document.close(); 

顯示輸出給用戶(myCustomHtml是我以前在代碼中定義了一些有效的HTML)。它從27版開始在Firefox中工作,現在我只能得到一個空文檔。沒有任何控制檯錯誤。

當與Firefox」控制檯

<html> 
    <head></head> 
    <body> 
    </body> 
</html> 

而源代碼是空的檢查的新打開的文檔僅有此內容。

該代碼在Chrome中運行。

我是否需要對較新的Firefox版本(27+)和更新的Greasemonkey(1.15)進行任何修改?我還沒有發現任何近期向Firefox報告的有關此問題的錯誤。

這是一個測試腳本

// ==UserScript== 
// @name   document.write() test 
// @namespace  stackoverflow.com 
// @description tests document.write() 
// @include  https://stackoverflow.com/questions/22651334/* 
// @include  http://stackoverflow.com/questions/22651334/* 
// @version  0.0.1 
// ==/UserScript== 

var tab = window.open('', '_blank'); 
tab.document.write('<html><head></head><body><ul><li>a</li><li>b</li><li>c</li></ul></body></html>'); 
tab.document.close(); 
+1

'document.write()的'可以在渲染過程中有各種各樣的不良影響。最好將你的元素直接添加到DOM。 – 2014-03-26 04:16:20

+0

我知道這是一個討厭的功能,我意識到風險,但它讓我省了很多線。我寧願保留它,考慮到我從一個空白文檔開始,使用「離線」數據和一個非常簡單的佈局。 – berbt

+0

我有一個簡單的HTML標記'「

  • 一個
  • b
  • Ç
」'測試你的腳本在Firefox 28和工作對我來說,也許這是一些涉及到HTML你」重新嘗試使用....等一下你的greasemonkey中的配置?:我已經在純html網頁上測試過了。 – Allende

回答

2

我不知道如果Greasemonkey的或Firefox已經雞姦這一點,但window.open到一個空白頁,從Greasemonkey的腳本,現在觸發Same Origin Policy衝突。
同時,Page範圍,控制檯範圍和Firebug控制檯都可以正常工作。

Greasemonkey的範圍給出:

SecurityError: The operation is insecure

是否@grant none使用或不使用。

這加上一般無用的GM_openInTab(),讓我懷疑它是一個Greasemonkey錯誤。我現在沒有時間查看它,但是如果你願意的話,file a bug report

爲了得到這個在Firefox(28.0)和Greasemonkey的(1.15)最新發布的工作,這是我必須做的:

  1. 告訴我的彈出窗口攔截到(臨時)允許計算器彈出窗口。 COM。
  2. 將彈出代碼注入頁面範圍。
  3. 使用明確的about:blank作爲URL。
  4. 等待新窗口加載。

下面是最新的FF + GM 發佈工作一個完整的腳本:

// ==UserScript== 
// @name  document.write() test 
// @description tests document.write() 
// @include  http://stackoverflow.com/questions/22651334/* 
// ==/UserScript== 

function fireNewTab() { 
    var newTab = window.open ('about:blank', '_blank'); 
    newTab.addEventListener (
     "load", 
     function() { 
      //--- Now process the popup/tab, as desired. 
      var destDoc = newTab.document; 
      destDoc.open(); 
      destDoc.write ('<html><head></head><body><ul><li>a</li><li>b</li><li>c</li></ul></body></html>'); 
      destDoc.close(); 
     }, 
     false 
    ); 
} 

addJS_Node (null, null, fireNewTab); 

function addJS_Node (text, s_URL, funcToRun, runOnLoad) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    if (runOnLoad) { 
     scriptNode.addEventListener ("load", runOnLoad, false); 
    } 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 
+0

謝謝,特別是對於功能完整的代碼片段。我認爲這是「我是否需要對新版Firefox進行任何修改?」的結論性答案。我會爲Greasemonkey的人寫一張票。 – berbt

-1

嘗試使用tab.document.body.innerHTML代替tab.document.write()tab.document.close(),即,

var tab = window.open('', '_blank'); 
tab.document.body.innerHTML = '<ul><li>a</li><li>b</li><li>c</li></ul>'; 

(我使用的是Firefox v24.4.0與Greasemonkey的V1.15和適用於我)

我不知道這個問題的根本原因,但是當我把document.write()封入try-ca tch塊我從alert()得到以下錯誤信息。

The operation is insecure.

可能相關的:Bug 663406 - document.write does not work in devtools scratchpad and console

+0

這個bug並不是太相關,無論如何它已經在大約3個版本之前解決了。 –

相關問題