JavaScript检查Chrome、Firefox和Opera浏览器扩展是否已安装

6
我想在我们的网站上显示自定义栏(类似通知:“安装我们的插件。”),如果尚未安装扩展程序,适用于Chrome、Firefox和Opera。如果已安装扩展程序,则不会显示任何内容。 思路如下
1. 用户访问我们的网站时,将出现一条带有消息的栏 - “嘿,安装我们的扩展程序”。
2. 用户点击安装,扩展程序将被安装。用户无需打开它。
3. 用户再次访问我们的网站时,由于已安装了扩展程序,栏将不再出现。
我们只谈论安装检查,不涉及cookies。 到目前为止,我只能找到Chrome的解决方案:http://blog.kotowicz.net/2012/02/intro-to-chrome-addons-hacking.html和Firefox:http://webdevwonders.com/detecting-firefox-add-ons/,Opera从未提到过。
基于检查作为扩展程序一部分的本地资源的想法,有没有办法在Opera上做到这一点:
chrome-extension://--Extension ID--/blank.gif
Firefox chrome://firebug/content/blank.gif
或者:有没有一种简单的方法来检查Chrome、Firefox和Opera是否安装了扩展程序?

1
如果扩展愿意合作,那就很容易了。 - John Dvorak
或者如果那个扩展在全局作用域中留下了某些东西 - 这就是我所说的合作。 - John Dvorak
@user1990249 如果这个条形菜单被添加到 DOM 中,那么从扩展程序外部找到它应该很容易。 - John Dvorak
@Jan Dvorak 我已经更新了用户故事的问题描述。希望现在这个想法更清晰了。<br /> 我正在寻找从浏览器页面与扩展程序建立连接,而不是相反的方式。 - user1990249
这个回答解决了你的问题吗?检查用户是否安装了第三方Chrome扩展程序 - Michael Freidgeim
显示剩余5条评论
1个回答

4

如果扩展程序愿意合作,它可以轻松地向文档广告其存在。例如:


扩展程序可以执行

window.$$myExt = ...

然后您可以通过以下方式检测扩展名:

if(typeOf $$myExt !== 'undefined'){...

(或任何其它变体)

获取页面window有点棘手,至少需要一些技巧


扩展程序可以执行以下操作:

document.body.classList.add("myExt-visited")

然后您可以通过以下方式检测扩展名:

if(document.body.classList.contains("myExt-visited")){...

这个扩展能够做什么

document.body.innerHTML += "<div id='myExt-toolbar'>..."
// or $('body').append("<div id='myExt-toolbar'>...");

那么您可以通过以下方式检测文件扩展名:

if(document.getElementByID("myExt-toolbar")){...
// or if($("#myExt-toolbar").length){...

或者,你可以这样做

<div id="myExt-replacement">
   ...

并且这个扩展程序会执行。
var replacement = document.getElementByID("myExt-replacement");
replacement && replacement.remove();

或者你可以这样做

function onMyExtExists(){
  ...
}

扩展程序将执行以下操作

onMyExtExists && onMyExtExists();

好的,这显然是唯一可能的解决方案,因为在Opera浏览器中,浏览器js无法检查扩展是否已安装。我希望稍后能够写回详细的解决方案。 - user1990249
在扩展架构中,window.$$myExt = ... 应该放在哪里? - bgadoci
@bgadoci 尽快让它可检测。也就是说,尽早让它可见,因为扩展检测无法在扩展自身变得可见之前运行。 - John Dvorak
扩展程序中的 'window' 对象与网站中的 'window' 不同,它们无法通过该通道进行通信。 - geedew
@geedew,unsafeWindow 对于那个目的管用吗?如果不行,还有什么其他方法? - John Dvorak
@geedew被打击了。我应该完全删除这段落吗? - John Dvorak

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