Расширение Chrome: как определить, установлено ли расширение с помощью скриптов содержимого
Я задаю этот вопрос после просмотра нескольких связанных вопросов на stackru. Я начал с того, как определить, установлено ли расширение. Я выбрал метод, в котором я добавляю div к телу, используя скрипты содержимого на некоторых страницах. Вот как я это сделал...
manifest.json
{
"name": "Install Check",
"content_scripts": [
{
"matches": ["http://host.com/*"],
"js" : ["insert_node.js"]
}
],
"permissions": [
"tabs", "host.com/*"
]
}
insert_node.js (скрипт содержимого)
var insert_node = document.createElement('div');
insert_node.id = "HOST_SITE";
document.body.appendChild(insert_node);
главная страница
<html>
<head>
</head>
<body>
<h1>This is a host site. Welcome!!!</h1>
<script src="jquery.js"></script>
<script src="notification.js"></script>
</body>
</html>
скрипт установки расширения
$(document).ready(function() {
if ($('#HOST_SITE').length > 0) {
alert("you have our extension installed");
} else {
alert("not installed");
}
});
Моя проблема в том, что предупреждение с сообщением not_installed
всегда появляется, прежде чем chrome сможет внедрить узел в DOM. Я читаю о run_at
атрибут в manifest.json здесь. Но это тоже не решило проблему. Я перепробовал все три document_start
, document_idle
, document_end
ценности. Что я здесь не так делаю?
3 ответа
Похоже, у вас есть расширение и веб-сайт, и в этом случае будет проще использовать Inline Installation.
if (typeof chrome !== "undefined" && typeof chrome.app !== "undefined" && chrome.app.isInstalled) {
// extension is installed.
}
Я не уверен, как это сделать с JQuery, как $("#something")
кажется только обыскивать голову и тело?... а нам нужно document.documentElement
, Причина в том, что мы вставляем что-то в document_start, и тогда нет body / head, но есть documentElement.
manifest.json
{
"name": "Install Check",
"content_scripts": [
{
"matches": ["HOST"],
"js" : ["myscript.js"],
"run_at":"document_start"
}
],
"permissions": [
"tabs", "HOST"
],
"version":"1.0"
}
myscript.js
var insert_node = document.createElement('div');
insert_node.id = "HOST_SITE";
document.documentElement.appendChild(insert_node);
notification.js
if (document.documentElement.querySelector("#HOST_SITE")) {
alert("Installed");
} else {
alert("Not Installed");
};
Я получил это работает...
- Сделайте расширение вставки скрипта содержимого после загрузки DOM, но до загрузки других ресурсов, таких как изображения
manifest.json (добавлено "run_at": "document_end"
)
{
"name": "Install Check",
"content_scripts": [
{
"matches": ["http://host.com/*"],
"js" : ["insert_node.js"],
"run_at": "document_end"
}
],
"permissions": [
"tabs", "host.com/*"
]
}
- использование
window.onload
вместо$(document).ready
insert_node.js (изменил $(document).ready
в window.onload
)
window.onload = function() {
if ($('#HOST_SITE').length > 0) {
alert("you have our extension installed");
} else {
alert("not installed");
}
};
Тем не менее, я не совсем понимаю, почему с помощью window.onload
работает и $(document).ready
не.
Может быть, кто-то может пролить свет на это?
Также я согласен с @abraham, что с помощью chrome.app.isInstalled
это лучший способ сделать это (ответ на мой комментарий будет глазурью на торте):)