как определить, установлено ли расширение chrome с помощью jquery [duplicate]

Если вы используете wamp 3.0.6 или любую другую версию, отличную от версии 2.5, вы можете столкнуться с этой проблемой, во-первых, проблема связана с sql. вы должны указать поля соответственно. но есть другой способ, с помощью которого вы можете его решить. нажмите зеленую иконку wamp. mysql-> mysql settings-> sql_mode-> none. или с консоли вы можете изменить значения по умолчанию.

mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
71
задан Yehuda Katz 17 January 2013 в 01:10
поделиться

12 ответов

Я уверен, что есть прямой способ (вызов функций непосредственно на вашем расширении или использование классов JS для расширений), но косвенный метод (пока не появится что-то лучше):

У вас есть Расширение Chrome ищет определенный DIV или другой элемент на вашей странице с очень конкретным идентификатором.

Например:

<div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>

Сделайте getElementById и установите innerHTML на номер версии вашего расширения или что-то еще. Затем вы можете прочитать содержимое этой клиентской стороны.

Опять же, вы должны использовать прямой метод, если есть один доступный.


EDIT: найден прямой метод! !

Используйте методы соединения, найденные здесь: https://developer.chrome.com/extensions/extension#global-events

Не проиндексирован, но вы должен быть в состоянии сделать ...

var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);
37
ответ дан Community 26 August 2018 в 06:26
поделиться

В это сообщение Google Groups показано другим способом. Короче говоря, вы можете попытаться определить, успешно ли загружается значок расширения. Это может быть полезно, если расширение, которое вы проверяете, не является вашим.

3
ответ дан Beau 26 August 2018 в 06:26
поделиться

Ваше расширение может взаимодействовать с веб-сайтом (например, изменять переменные), и ваш сайт может обнаружить это.

Но должен быть лучший способ сделать это. Интересно, как Google делает это в своей галерее расширения (уже установленные приложения отмечены).

Изменить:

В галерее используется chrome.management.get . Пример:

chrome.management.get("mblbciejcodpealifnhfjbdlkedplodp", function(a){console.log(a);});

Но вы можете получить доступ только к этому методу со страниц с правильными разрешениями.

3
ответ дан Carl Manaster 26 August 2018 в 06:26
поделиться

Я использовал метод cookie:

В моем файле manifest.js я включил скрипт содержимого, который работает только на моем сайте:

 "content_scripts": [
        {
        "matches": [
            "*://*.mysite.co/*"
            ],
        "js": ["js/mysite.js"],
        "run_at": "document_idle"
        }
    ], 

в моем js / mysite. js У меня есть одна строка:

document.cookie = "extension_downloaded=True";

и на моей странице index.html Я ищу этот файл cookie.

if (document.cookie.indexOf('extension_downloaded') != -1){
    document.getElementById('install-btn').style.display = 'none';
}
2
ответ дан Chase Roberts 26 August 2018 в 06:26
поделиться

Chrome теперь имеет возможность отправлять сообщения с веб-сайта на расширение.

Так что в расширении background.js (content.js не будет работать) добавьте что-то вроде:

chrome.runtime.onMessageExternal.addListener(
    function(request, sender, sendResponse) {
        if (request) {
            if (request.message) {
                if (request.message == "version") {
                    sendResponse({version: 1.0});
                }
            }
        }
        return true;
    });

Это позволит вам сделать звонок с веб-сайта:

var hasExtension = false;

chrome.runtime.sendMessage(extensionId, { message: "version" },
    function (reply) {
        if (reply) {
            if (reply.version) {
                if (reply.version >= requiredVersion) {
                    hasExtension = true;
                }
            }
        }
        else {
          hasExtension = false;
        }
    });

Затем вы можете проверить переменную hasExtension. Единственный недостаток - это асинхронный вызов, поэтому вам нужно как-то обойти это.

Изменить: Как уже упоминалось ниже, вам нужно добавить запись в manifest.json перечисление доменов, которые могут сообщать ваш аддон. Например:

"externally_connectable": {
    "matches": ["*://localhost/*", "*://your.domain.com/*"]
},
84
ответ дан guiomie 26 August 2018 в 06:26
поделиться

Если у вас есть контроль над расширением Chrome, вы можете попробовать, что я сделал:

// Inside Chrome extension
var div = document.createElement('div');
div.setAttribute('id', 'myapp-extension-installed-div');
document.getElementsByTagName('body')[0].appendChild(div);

И затем:

// On web page that needs to detect extension
if ($('#myapp-extension-installed-div').length) {

}

Он немного взломан, но я не могли заставить другие методы работать, и я беспокоюсь о том, что Chrome меняет свой API здесь. Сомнительно, что этот метод скоро перестанет работать.

0
ответ дан gwg 26 August 2018 в 06:26
поделиться

Многие ответы здесь до сих пор относятся только к Chrome или несут накладные расходы HTTP. Решение, которое мы используем, немного отличается:

1. Добавьте новый объект в список манифеста content_scripts следующим образом:

{
  "matches": ["https://www.yoursite.com/*"],
  "js": [
    "install_notifier.js"
  ],
  "run_at": "document_idle"
}

Это позволит запустить код на install_notifier.js на этом сайте (если у вас еще нет разрешений).

2. Отправьте сообщение на каждый сайт в вышеприведенном ключе манифеста.

Добавьте что-то подобное в install_notifier.js (обратите внимание, что это использование закрытия, чтобы переменные не были глобальными, но это не обязательно):

// Dispatch a message to every URL that's in the manifest to say that the extension is
// installed.  This allows webpages to take action based on the presence of the
// extension and its version. This is only allowed for a small whitelist of
// domains defined in the manifest.
(function () {
  let currentVersion = chrome.runtime.getManifest().version;
  window.postMessage({
    sender: "my-extension",
    message_name: "version",
    message: currentVersion
  }, "*");
})();

Ваше сообщение может сказать что угодно, но полезно отправить версию, чтобы вы знали, с чем имеете дело. Тогда ...

3.

Добавьте это на свой сайт где-нибудь:

window.addEventListener("message", function (event) {
  if (event.source == window &&
    event.data.sender &&
    event.data.sender === "my-extension" &&
    event.data.message_name &&
    event.data.message_name === "version") {
    console.log("Got the message");
  }
});

Это работает в Firefox и Chrome, и не несет накладных расходов HTTP или манипулирует стр.

2
ответ дан mlissner 26 August 2018 в 06:26
поделиться

Я думал, что поделюсь своими исследованиями по этому вопросу. Мне нужно было определить, было ли установлено определенное расширение для некоторого файла: /// ссылки для работы. Я столкнулся с этой статьей здесь . Это объясняет метод получения manifest.json расширения.

Я немного скорректировал код и придумал:

   function Ext_Detect_NotInstalled(ExtName,ExtID) {
   console.log(ExtName + ' Not Installed');
   if (divAnnounce.innerHTML  != '')
   divAnnounce.innerHTML = divAnnounce.innerHTML + "<BR>"

   divAnnounce.innerHTML = divAnnounce.innerHTML + 'Page needs ' + ExtName + ' Extension -- to intall the LocalLinks extension click <a href="https://chrome.google.com/webstore/detail/locallinks/' + ExtID +'">here</a>';
  }

  function Ext_Detect_Installed(ExtName,ExtID) {
    console.log(ExtName + ' Installed');
  }

  var Ext_Detect = function(ExtName,ExtID) {
    var s = document.createElement('script');
    s.onload = function(){Ext_Detect_Installed(ExtName,ExtID);};
    s.onerror = function(){Ext_Detect_NotInstalled(ExtName,ExtID);};
    s.src = 'chrome-extension://' + ExtID + '/manifest.json';
    document.body.appendChild(s);
  }

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

 if (is_chrome==true)
 {
  window.onload = function() { Ext_Detect('LocalLinks','jllpkdkcdjndhggodimiphkghogcpida');};
 }

С этим вы сможете использовать Ext_Detect (ExtensionName, ExtensionID) для обнаружения установки любого количества расширений.

17
ответ дан Nato 26 August 2018 в 06:26
поделиться

У вас может быть расширение установить cookie , и ваши сайты JavaScript проверяют, присутствует ли этот файл cookie и соответствующим образом обновляется. Это и, возможно, большинство других упомянутых здесь методов, конечно же, может быть вызвано пользователем, если вы не попробуете, чтобы расширение создало пользовательские файлы cookie в зависимости от временных меток и т. Д., И попросите ваше приложение проанализировать их на стороне сервера, чтобы убедиться, что это действительно пользователь с расширение или кто-то притворяется, что он модифицировал свои файлы cookie.

3
ответ дан Niklas 26 August 2018 в 06:26
поделиться

Еще одно возможное решение, если вы владеете сайтом, - использовать встроенную установку .

if (chrome.app.isInstalled) {
  // extension is installed.
}

Я знаю, что это старый вопрос, но этот способ был введен в Chrome 15, и поэтому я думал, что Id перечислил его для всех, только теперь ищет ответ.

7
ответ дан PAEz 26 August 2018 в 06:26
поделиться

Вы также можете использовать метод кросс-браузера, который я использовал. Использует концепцию добавления div.

в вашем скрипте содержимого (всякий раз, когда загружается скрипт, он должен это делать)

if ((window.location.href).includes('*myurl/urlregex*')) {
        $('html').addClass('ifextension');
        }

на вашем сайте вы утверждаете что-то вроде

if (!($('html').hasClass('ifextension')){}

И введите соответствующее сообщение.

0
ответ дан Prakash Palnati 26 August 2018 в 06:26
поделиться

Веб-страница взаимодействует с расширением через фоновый скрипт.

manifest.json:

"background": {
    "scripts": ["background.js"],
    "persistent": true
},
"externally_connectable": {
    "matches": ["*://(domain.ext)/*"]
},

background.js:
chrome.runtime.onMessageExternal.addListener(function(msg, sender, sendResponse) {
    if ((msg.action == "id") && (msg.value == id))
    {
        sendResponse({id : id});
    }
});

page.html:

<script>
var id = "some_ext_id";
chrome.runtime.sendMessage(id, {action: "id", value : id}, function(response) {
    if(response && (response.id == id)) //extension installed
    {
        console.log(response);
    }
    else //extension not installed
    {
        console.log("Please consider installig extension");
    }

});
</script>
18
ответ дан Xan 26 August 2018 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: