MS Edge有一个window.chrome对象??打破浏览器检测

时间:2016-04-05 14:43:11

标签: javascript google-chrome microsoft-edge

MS Edge有一个名为window.chrome的对象与Google Chrome中的名称相同。

对我而言,这会破坏Chrome polyfill的浏览器检测代码。我想象这也会给别人带来麻烦。

使用:

边缘:25.10586.0.0

Edgehtml:13.10586

Edge window.chrome对象的内容较少。它唯一的子对象是window.chrome.app,而Chrome版本有app,webstore和runtime(Chrome版本49.0.2623.110,64位)。

他们为什么要这样做?我可以看到制作一个合适的window.chrome对象具有所有功能,但制作一个残缺的对象似乎会造成更多伤害而不是帮助任何东西。

有人遇到过这个吗?我环顾四周,无法找到任何东西。谢谢!

2 个答案:

答案 0 :(得分:7)

“你应该检查功能而不是浏览器”

像某人一样,从未遇到过多个浏览器中存在的功能,但在其出现的所有浏览器中都无法运行或功能相同。

我自己最近的案例,我有一个小功能,在所有浏览器中工作至少12年,因为在Chrome存在之前。该函数只会触发在客户端操作系统上注册的自定义URL以运行外部处理程序。因此,它只是在子_blank窗口中启动自定义URL并立即关闭该子窗口。

function foo(stuff,otherstuff) {
  t = window.open("myproto://"+stuff,"_blank");
  t.close();
  window.location.replace("path/to/...?"+otherstuff);
}

Chrome,只有Chrome,并且最近才在2016年左右的某个时候更改了window.open()以便它不再阻止,所以现在要解决我必须做的事情:

t = window.open("myproto://"+stuff,"_blank");
t.addEventListener('load',t.close());

好吧,不是世界末日,除了并非所有浏览器都有这个功能......

等等,不要告诉我......“测试FEATURE !!!!”

为什么我没想到这个?也许是因为,猜猜是什么,Edge有这个功能,而且行为不正确。

所以在这里,我正在谷歌搜索方法来检测Chrome,BY NAME,原因。

我是否不仅要测试该功能的存在,还要构建某种实际尝试调用该功能的测试,看看它是否正常工作?我正在测试的事情恰好是窗口打开和关闭行为。我不能弹出垃圾窗口,然后卡住并且不会自己关闭,每次加载该死的页面,或者每次用户点击需要该功能的该死的按钮时......

如果!!window.chrome不再可行,因为再一次是Edge,那么我想回到这个彻头彻尾的小丑:

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

答案 1 :(得分:1)

我知道您已经标记了以上答案,但是,如果您确实想通过Google检测到Google Chrome浏览器,我建议您使用以下方式:

var isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);