Причина
Это не работает, потому что Chrome запрещает любой встроенный код в расширениях через политику безопасности контента. .
Встроенный JavaScript не будет выполняться. Это ограничение запрещает как встроенные <script>
блоки, и встроенные обработчики событий (например, <button onclick="...">
).
Как обнаружить
Если это действительно проблема, Chrome выдаст в консоли следующую ошибку:
Отказался от выполнения встроенного сценария, поскольку он нарушает следующую директиву политики безопасности содержимого: script-src 'self' chrome-extension-resource :. Для включения встроенного выполнения требуется ключевое слово 'unsafe-inline', хэш ('sha256 -...') или одноразовый номер ('nonce -...').
Чтобы получить доступ к консоли JavaScript всплывающего окна (которая полезна для отладки в целом), щелкните правой кнопкой мыши кнопку расширения и выберите Проверить всплывающее окно из контекстного меню.
Дополнительную информацию об отладке всплывающих окон можно найти здесь.
Как исправить
Необходимо удалить весь встроенный JavaScript. В документации Chrome есть руководство.
Предположим, оригинал выглядит так:
<a onclick="handler()">Click this</a> <!-- Bad -->
Необходимо удалить атрибут onclick
и присвоить элементу уникальный идентификатор:
<a id="click-this">Click this</a> <!-- Fixed -->
А затем прикрепите слушателя из сценария (который должен быть в файле .js
, предположим, popup.js
):
// Pure JS:
document.addEventListener('DOMContentLoaded', function() {
document.getElementById("click-this").addEventListener("click", handler);
});
// The handler also must go in a .js file
function handler() {
/* ... */
}
Обратите внимание на обертку в событии DOMContentLoaded
. Это гарантирует, что элемент существует во время выполнения. Теперь добавьте тег скрипта, например, в <head>
документа:
<script src="popup.js"></script>
Альтернатива, если вы используете jQuery:
// jQuery
$(document).ready(function() {
$("#click-this").click(handler);
});
Ослабление политики
В: В ошибке упоминаются способы разрешения встроенного кода. Я не хочу / не могу изменять свой код, как мне включить встроенные скрипты?
A: Несмотря на сообщение об ошибке, вы не удается включить встроенный скрипт:
Не существует механизма для снятия ограничения на выполнение встроенного JavaScript. В частности, установка политики сценария, включающей 'unsafe-inline'
, не будет иметь никакого эффекта.
Обновление. Начиная с Chrome 46, можно добавить в белый список определенные встроенные блоки кода:
Начиная с Chrome 46, встроенные скрипты можно добавить в белый список, указав в политике хеш исходного кода в кодировке base64. Этот хэш должен иметь префикс используемого алгоритма хеширования (sha256, sha384 или sha512). См. Использование хеша для <script>
элементов для примера.
Однако я не вижу причин для использования этого, и он не будет включать встроенные атрибуты, такие как onclick="code"
.
person
Community
schedule
08.09.2014