Если вы используете 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';
Я уверен, что есть прямой способ (вызов функций непосредственно на вашем расширении или использование классов 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);
В это сообщение Google Groups показано другим способом. Короче говоря, вы можете попытаться определить, успешно ли загружается значок расширения. Это может быть полезно, если расширение, которое вы проверяете, не является вашим.
Ваше расширение может взаимодействовать с веб-сайтом (например, изменять переменные), и ваш сайт может обнаружить это.
Но должен быть лучший способ сделать это. Интересно, как Google делает это в своей галерее расширения (уже установленные приложения отмечены).
Изменить:
В галерее используется chrome.management.get . Пример:
chrome.management.get("mblbciejcodpealifnhfjbdlkedplodp", function(a){console.log(a);});
Но вы можете получить доступ только к этому методу со страниц с правильными разрешениями.
Я использовал метод 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';
}
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/*"]
},
Если у вас есть контроль над расширением 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 здесь. Сомнительно, что этот метод скоро перестанет работать.
Многие ответы здесь до сих пор относятся только к Chrome или несут накладные расходы HTTP. Решение, которое мы используем, немного отличается:
{
"matches": ["https://www.yoursite.com/*"],
"js": [
"install_notifier.js"
],
"run_at": "document_idle"
}
Это позволит запустить код на install_notifier.js на этом сайте (если у вас еще нет разрешений).
Добавьте что-то подобное в 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
}, "*");
})();
Ваше сообщение может сказать что угодно, но полезно отправить версию, чтобы вы знали, с чем имеете дело. Тогда ...
Добавьте это на свой сайт где-нибудь:
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 или манипулирует стр.
Я думал, что поделюсь своими исследованиями по этому вопросу. Мне нужно было определить, было ли установлено определенное расширение для некоторого файла: /// ссылки для работы. Я столкнулся с этой статьей здесь . Это объясняет метод получения 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) для обнаружения установки любого количества расширений.
У вас может быть расширение установить cookie , и ваши сайты JavaScript проверяют, присутствует ли этот файл cookie и соответствующим образом обновляется. Это и, возможно, большинство других упомянутых здесь методов, конечно же, может быть вызвано пользователем, если вы не попробуете, чтобы расширение создало пользовательские файлы cookie в зависимости от временных меток и т. Д., И попросите ваше приложение проанализировать их на стороне сервера, чтобы убедиться, что это действительно пользователь с расширение или кто-то притворяется, что он модифицировал свои файлы cookie.
Еще одно возможное решение, если вы владеете сайтом, - использовать встроенную установку .
if (chrome.app.isInstalled) {
// extension is installed.
}
Я знаю, что это старый вопрос, но этот способ был введен в Chrome 15, и поэтому я думал, что Id перечислил его для всех, только теперь ищет ответ.
Вы также можете использовать метод кросс-браузера, который я использовал. Использует концепцию добавления div.
в вашем скрипте содержимого (всякий раз, когда загружается скрипт, он должен это делать)
if ((window.location.href).includes('*myurl/urlregex*')) {
$('html').addClass('ifextension');
}
на вашем сайте вы утверждаете что-то вроде
if (!($('html').hasClass('ifextension')){}
И введите соответствующее сообщение.
Веб-страница взаимодействует с расширением через фоновый скрипт.
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>