Остановить выполнение функции с расширением Chrome - PullRequest
5 голосов
/ 19 февраля 2012

Вот простая страница:

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test page</title>
    <script type="text/javascript">
        function foo (num) {
            alert(num);
        }
    </script>
</head>
<body>
    Hello World
    <script type="text/javascript">
        foo(2);
    </script>
</body>
</html>  

Я хотел бы написать расширение Chrome, чтобы предотвратить выполнение нижнего сценария (foo(2)).
Я попытался написать содержимоескрипт, который удаляет последний тег скрипта с:

document.body.removeChild(document.body.lastChild);  

, но не работает.

Я думаю, это может быть связано с тем, что скрипт контента запускается после выполнения последней строки скрипта.затем я попытался установить run_at на document_start или document_end, но ни один из них не работает для меня ..

Ответы [ 2 ]

4 голосов
/ 19 февраля 2012

Я столкнулся с той же проблемой во время разработки Не отслеживать меня Google Пользовательский скрипт / расширение.

Важное примечание

К объекту window в содержимом Chrome нельзя получить прямой доступ.
Я протестировал много методов, и надежный метод only внедряет код через динамически создаваемый тег сценария. Посмотрите этот ответ или исходный код моего расширения для получения дополнительной информации.

Я решил это с помощью Object.defineProperty. С помощью этого метода вы можете определить свойство и указать информацию о дескрипторах метода получения, установки и свойства. В вашем случае:

Object.defineProperty(window, 'foo', {
    value: function(){/*This function cannot be overridden*/}
});

Или, если вы хотите захватить переменную и использовать ее позже:

(function() {
    var originalFoo = function(){/*Default*/};
    Object.defineProperty(window, 'foo', {
        get: function(){
            if (confirm('function logic')) return function(){/*dummy*/};
            else return originalFoo;
        },
        set: function(fn){originalFoo = fn;}
    });
})();

<ч />

Ошибка в Chrome 17 Ошибка # 115452 Исправлено!

В Chrome 17, используя V8 3.7.12.12 (но не в Chrome 16, используя V8 3.6.6.19), Объявления функций переопределяют дескрипторы свойств .
См http://jsfiddle.net/bHUag/
Обратите внимание, что эта ошибка кажется не применимой, когда объявление функции и метод дескриптора свойства находятся в одном и том же блоке. Это ложно, хотя. Эффект не виден, потому что объявления функций всегда оцениваются перед блоком кода. Итак, сначала вычисляется function foo(){}, а затем остальная часть кода.

<script>
Object.defineProperty(window, 'foo', {value: function(){return 5;} });
</script><script>
function foo(){return 1};
alert(foo()); // Shows 5 in all browsers except for Chrome v17
</script>
0 голосов
/ 07 июня 2016

Я думаю, что стоит упомянуть относительно новый элемент метаданных // @unwrap, который вынимает скрипт пользователя из песочницы, в которой обычно запускаются скрипты пользователя. Подробнее:

https://wiki.greasespot.net/Metadata_Block#.40unwrap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...