Chrome-расширение Javascript не загружается [дубликат]

Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.

apt-get install ack-grep

Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже

cd /
ack-grep "find my keyword"
54
задан Xan 8 September 2014 в 10:02
поделиться

4 ответа

Расширения Chrome не позволяют иметь встроенный JavaScript ( documentation ). Вам нужно будет сделать что-то похожее на это.

Назначить идентификатор ссылки (<a onClick=hellYeah("xxx")> становится <a id="link">) и использовать addEventListener , чтобы связать мероприятие. Поместите в файл popup.js следующее:

document.addEventListener('DOMContentLoaded', function() {
    var link = document.getElementById('link');
    // onClick's logic below:
    link.addEventListener('click', function() {
        hellYeah('xxx');
    });
});
96
ответ дан Rob W 23 August 2018 в 00:56
поделиться
  • 1
    Есть ли ошибки в консоли разработчика? – David 27 November 2012 в 22:22
  • 2
    Я не уверен, могу ли я форматировать материал в комментариях, извините за это. Невозможно заставить его работать со следующим: & lt;! Doctype html & gt; & Lt; & HTML GT; & Lt; & головка GT; & Lt; & название GT; Начало всплывающего окна расширения & lt; / title & gt; & lt; script src = "popup.js" & gt; & lt; / script & gt; & lt; script type = "text / javascript" & gt; & gt; & gt; & gt; window.onload = function () {var link = document.getElementById (& quot; link & quot;); link.addEventListener (& Quot; OnClick & Quot;, Hellyeah (& Quot; ххх & Quot;), ложно); } & lt; / script & gt; & Lt; / головка & GT; & Л; тело & GT; & lt; div id = "текстовый держатель" & gt; & gt; га & lt; / div & gt; & lt; br / & gt; & lt; div id = "link" & gt; hyhy & lt; / div & gt; & Lt; / тело & GT; & Lt; / HTML & GT; – teeZee 27 November 2012 в 22:24
  • 3
    Я получил что-то вроде этого: «Отказался от выполнения встроенного скрипта, потому что он нарушает следующую директиву политики безопасности контента:« script-src »self 'chrome-extension-resource: & quot ;. & quot; – teeZee 27 November 2012 в 22:25
  • 4
    Javascript не может быть в вашем файле HTML для расширений. Вы должны загрузить весь javascript из внешнего источника. Что-то вроде <script src="javascript.js"></script> – David 27 November 2012 в 22:31
  • 5
    @teeZee Для дальнейшего использования поместите обратные элементы (`) вокруг вашего кода, чтобы отформатировать его в комментариях. Like this. – joe_young 5 July 2015 в 19:22

Причина

Это не работает, потому что Chrome запрещает любой тип встроенного кода в расширениях через политику безопасности контента.

Встроенный JavaScript не будет выполняться. Это ограничение запрещает как встроенные блоки <script>, так и встроенные обработчики событий (например, <button onclick="...">).

Как обнаружить

Если это действительно проблема, Chrome выполните следующую ошибку в консоли:

Отказано в выполнении встроенного скрипта, поскольку оно нарушает следующую директиву политики безопасности контента: «script-src» self 'chrome-extension-resource: ». Для включения встроенного выполнения требуется либо ключевое слово «небезопасное-встроенное», либо хэш («sha256 -...»), либо nonce («nonce -...»).

Чтобы получить доступ к консоли JavaScript для всплывающих окон (что полезно для отладки в целом), щелкните правой кнопкой мыши кнопку вашего внутреннего абонента и выберите «Осмотреть всплывающее окно» в контекстном меню.

Доступна дополнительная информация об отладке всплывающего окна здесь .

Как исправить

Нужно удалить все встроенные JavaScript. Существует руководство в документации Chrome .

Предположим, что оригинал выглядит так:

<a onclick="handler()">Click this</a> <!-- Bad -->

Нужно удалить атрибут onclick и дать элемент уникальный id:

<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".

29
ответ дан 3 revs, 2 users 99% 23 August 2018 в 00:56
поделиться
  • 1
    если я хочу сделать это с именем класса вместо Id. Я пытался, но не повезло " – Ratan Paul 28 October 2016 в 23:16
  • 2
    Любые мысли о том, как можно анонимизировать это решение, чтобы оно могло работать для углового приложения с генерируемыми именами div? Я не могу создавать прослушиватели событий, потому что имена кнопок должны быть уникальными для каждого элемента в моем повторе ng ... :( – itchyspacesuit 29 April 2017 в 18:02

У меня была такая же проблема, и я не хотел переписывать код, поэтому я написал функцию для изменения кода и создания встроенных декларируемых событий:

function compile(qSel){
    var matches = [];
    var match = null;
    var c = 0;

    var html = $(qSel).html();
    var pattern = /(<(.*?)on([a-zA-Z]+)\s*=\s*('|")(.*)('|")(.*?))(>)/mg;

    while (match = pattern.exec(html)) {
        var arr = [];
        for (i in match) {
            if (!isNaN(i)) {
                arr.push(match[i]);
            }
        }
        matches.push(arr);
    }
    var items_with_events = [];
    var compiledHtml = html;

    for ( var i in matches ){
        var item_with_event = {
            custom_id : "my_app_identifier_"+i,
            code : matches[i][5],
            on : matches[i][3],
        };
        items_with_events.push(item_with_event);
        compiledHtml = compiledHtml.replace(/(<(.*?)on([a-zA-Z]+)\s*=\s*('|")(.*)('|")(.*?))(>)/m, "<$2 custom_id='"+item_with_event.custom_id+"' $7 $8");
    }

    $(qSel).html(compiledHtml);

    for ( var i in items_with_events ){
        $("[custom_id='"+items_with_events[i].custom_id+"']").bind(items_with_events[i].on, function(){
            eval(items_with_events[i].code);
        });
    }
}

$(document).ready(function(){
    compile('#content');
})

Это должно удалить все встроенные события из выбранного узла и вместо этого создайте их с помощью jquery.

1
ответ дан sergio0983 23 August 2018 в 00:56
поделиться
  • 1
    этот код не выполняется должным образом, пожалуйста, направляйте меня правильно – employeegts 24 September 2015 в 12:10
0
ответ дан Elias EstatisticsEU 5 November 2018 в 22:38
поделиться
Другие вопросы по тегам:

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