在Firefox浏览器中,window.open(url)和window.location.href = url有什么区别?

12

我正在尝试构建一个书签小程序,将当前的网址作为参数传递给另一个网址。

然而我发现这个

javascript:(function(){window.open("http://www.somesi.te/some/thing?url="+encodeURIComponent(window.location.href))})()

不起作用,而这个

javascript:(function(){window.location.href = "http://www.somesi.te/some/thing?url="+encodeURIComponent(window.location.href)})()

除了window.open打开一个新窗口,window.location.href改变位置的明显区别外,为什么后者有效,而前者只是打开另一个窗口到原始位置?

这是在Firefox上的情况。有趣的是,在Chrome上一切正常。

这是一种安全问题吗?


“this does not work” - 新窗口没有被打开?如果是,请检查 Firefox 是否阻止了弹出窗口。 - Boaz
javascript:链接几乎总是有害的。请代表您的用户,不要使用它们! - lonesomeday
2
@lonesomeday 虽然我有同感,但是在书签脚本方面没有其他选择。 - Boaz
哦,是的确实。非常正确。 - lonesomeday
所以,看起来这个 javascript:(function(){var w = window.open(""); w.location.href = "http://www.somesi.te/some/thing?url="+encodeURIComponent(window.location.href)})() 是有效的。不是弹出窗口阻止的问题。 - simone
1个回答

8
window.open()window.location.href之间的区别在于,open()是窗口类的一个方法,而window.location是窗口类的一个属性

1. window.open()是窗口类上的一个方法

调用window.open()方法实际上会创建一个窗口对象,该对象可存储在变量中,并根据程序要求进行操作。

为了证明window.open()实际上返回一个窗口对象,请考虑以下代码:

var mywindow = window.open("http://google.com");
mywindow.name = "Awesome Window";
console.log(typeof(mywindow)); // --> "object"
console.log(mywindow.name); // --> "Awesome Window"

你的代码打开了一个意外的窗口,是因为你调用了 window.open(),它唯一的目的就是打开一个新窗口。

2. window.location 是 window 类的一个只读属性。

虽然 window.location 是只读属性,但是 window.location 内置了一个快捷功能,使得可以将其赋值,这与调用 window.location.assign() 有相同的效果,该方法不返回窗口对象,但使用根窗口对象将新的 URL 分配给当前窗口,从而在调用分配位置的 JavaScript 的浏览器窗口中加载新分配的 URL。

如果你正在创建一个书签脚本,那么使用 window.location 是获取当前窗口的 URL 并将其指定为程序 URL 字符串的更好方式。

你可能会发现在不同的浏览器中,你会遇到意想不到的行为,这是因为没有为 window 对象设置官方公共标准,所以每个浏览器选择如何在幕后实现它可能会有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接