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