Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.
apt-get install ack-grep
Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже
cd /
ack-grep "find my keyword"
Расширения 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');
});
});
Это не работает, потому что 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"
.
У меня была такая же проблема, и я не хотел переписывать код, поэтому я написал функцию для изменения кода и создания встроенных декларируемых событий:
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.
<script src="javascript.js"></script>
– David 27 November 2012 в 22:31Like this.
– joe_young 5 July 2015 в 19:22