新打开的窗口显示我的动态内容,但位置错误

时间:2013-05-05 01:25:05

标签: javascript url greasemonkey window.open

我的脚本打开一个新窗口,然后写入其内容。目标窗口按预期显示“Hello World”,但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。

1 个答案:

答案 0 :(得分:2)

我认为你不能这样做。这可能是一个安全功能;请参阅Bug 337344, "Disable location bar hiding by default, to make chrome spoofing harder"及相关错误。

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

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

您可能不得不忍受这种情况,并感激网络钓鱼更加困难。 ;-)或者,如果您能够提出一个令人信服的案例,说明为什么您应该能够更改或删除该位置:(1)将其添加到您的问题中;(2)使用Mozilla打开错误或功能请求。


解决方法:
您可以将脚本设置为同时触发about:blank,然后让GM从空白实例创建页面,开放实例。有关几乎相同的方案/解决方案,请参阅this answer

请务必使用明确的about:blank打开窗口,如下所示:

var destWindow = window.open("about:blank", "title", null);