2014-03-26 2 views
1

와 userscript에서 작동하지 않는 나는 (myCustomHtml 내가 코드에서 이전에 정의 된 일부 유효한 HTML되는) 사용자에게 출력을 보여document.write를() 파이어 폭스

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

을 사용하는 일부 userscripts 있습니다. 그것은 버전 27부터 파이어 폭스에서 일해 버렸습니다. 이제 빈 문서 만 생깁니다. 콘솔 오류는 전혀 없습니다. 파이어 폭스 콘솔

<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에 직접 추가하는 것이 좋습니다. –

+0

나는 그것이 싫어하는 기능이며 위험에 대해 알고 있음을 알고 있지만, 많은 라인을 절약 해줍니다. '오프라인'데이터와 매우 간단한 레이아웃을 사용하여 빈 문서부터 시작한다고 생각하여 보관하는 것이 좋습니다. – berbt

+0

내가 간단한 HTML 마크 업' "

  • B
  • C
"'를 함께 파이어 폭스 (28)에 스크립트를 테스트하고 나를 위해 작동 한, 어쩌면 html로 당신 '에 관련된 뭔가 greasemonkey의 설정에 대해 잠시 기다려주십시오. : 순수한 html 웹 페이지에서 테스트했습니다. – Allende

답변

2

나는 그리스 몽키 또는 Firefox이를 봤나 경우 잘 모르겠지만, window.open 빈 페이지로하는 그리스 몽키 스크립트에서, 지금 Same Origin Policy 위반을 트리거 :

The operation is insecure.

은 아마 관련.
한편 페이지 범위, 콘솔 범위 및 방화 광구의 콘솔이 모두 정상적으로 작동합니다.

그리스 몽키 범위 준다 : 사용되지 않거나

SecurityError: The operation is insecure

@grant none 여부.

일반용 쓸데없는 것 GM_openInTab()을 더하여, 그것이 내가 Greasemonkey 버그라고 의심하게 만듭니다. 지금 당장 들여다 볼 시간이 없지만 원하는 경우 file a bug report.

것은이 파이어 폭스 (28.0)과 그리스 몽키 (1.15)의 최신 버전에서 작동하도록하기 위해, 여기에 내가해야 할 일을했을 것입니다 :

  1. 는 (일시적으로) 유래의 팝업을 허용 내 팝업 차단기를 알려주십시오. com.
  2. 페이지 범위에 팝업 코드를 주입하십시오.
  3. URL에 명시적인 about:blank을 사용하십시오.
  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 버전을 수정해야합니까?"에 대한 결정적인 대답이라고 생각합니다. 그리스 몽키 녀석들을위한 티켓을 쓸거야. – berbt

-1

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

(나는 그리스 몽키 v1.15로하고 있음을 파이어 폭스 v24.4.0를 사용하고, 즉, 대신 tab.document.write()tab.document.close()tab.document.body.innerHTML를 사용해보십시오 테스트 스크립트입니다 나를 위해 작동합니다.)

이 문제의 근본 원인에 대해서는 잘 모르겠지만 시도해 보면 document.write() tch 블록 alert()에서 다음과 같은 오류 메시지가 나타납니다. Bug 663406 - document.write does not work in devtools scratchpad and console

+0

그 버그는 (너무) 관련이 없으며 어쨌든 3 버전 전에 해결되었습니다. –