1

我的脚本打开一个新窗口,然后写入其内容。目标窗口按预期显示“Hello World”,但 URL 与脚本运行的窗口相同,我不明白为什么。

有没有办法在不使用旧 URL 的情况下构建新窗口?

function doTest() {
    var impl = document.implementation;
    var tempDoc = impl.createHTMLDocument("Hello");
    var tempBody = tempDoc.getElementsByTagName("body")[0];
    var tempDiv = tempDoc.createElement('div');
    var tempMsg = tempDoc.createTextNode('Hello World.');
    tempDiv.appendChild(tempMsg);
    tempBody.appendChild(tempDiv);

    var destWindow=window.open("about:blank", "title", null, false);
    var destDoc=destWindow.document;
    destDoc.open();
    destDoc.write("<html>"+tempDoc.documentElement.innerHTML+"</html>");    
    destDoc.close();
}


var btnTest = document.createElement( 'input' );
btnTest.setAttribute( 'value', 'Test' );
btnTest.setAttribute( 'type', 'button' );
btnTest.addEventListener('click',doTest,true);
document.body.appendChild( btnTest );


我正在使用 Firefox 20 和 Greasemonkey 1.8。

4

1 回答 1

2

我不认为你能做到这一点。这可能是一项安全功能;请参阅错误 337344,“默认禁用位置栏隐藏,以使 chrome 欺骗更加困难”和相关错误。

我认为,一旦父窗口 javascript 尝试更改内容,反欺骗保护就会将位置强制到开启者的 URL。即使您使用 URL 以外的 URL 打开窗口也是如此about:blank

您可以通过将设置更改dom.disable_window_open_feature.location为 true in 来about:config隐藏地址栏,然后通过传入location=false来隐藏地址栏window.open
但如果你这样做了,那么开瓶器的 URL 将被添加到标题栏。

您可能不得不忍受这一点,并感谢网络钓鱼要困难得多。;-) 或者,如果您可以提出令人信服的理由来说明为什么您应该能够更改或空白该位置:(1) 将其添加到您的问题中并 (2) 向 Mozilla 提出错误或功能请求。


解决方法:
您可以将脚本设置为也触发 on about:blank,然后让 GM 从空白实例而不是打开实例创建页面。有关几乎相同的场景/解决方案,请参阅此答案

确保使用显式打开窗口about:blank,如下所示:

var destWindow = window.open("about:blank", "title", null);
于 2013-05-05T03:51:47.197 回答