Firefox в настоящее время поддерживает the beforescriptexecute event (по состоянию на Version 4, released on March 22, 2011) ‡.
С этим событием и the // @run-at document-start
directive, Firefox и Greasemonkey теперь, похоже, делают хорошую работу, перехватывая специфические <script>
теги.
Это еще не возможно для Chrome + Tampermonkey. Для чего угодно, кроме Firefox + Greasemonkey, вам нужно будет использовать методы, как показано в других ответах ниже, о написании полного расширения браузера.
The checkForBadJavascripts
function инкапсулирует это. Например, предположим, что страница имела <script>
тег как так:
<script>
alert ("Sorry, Sucka! You've got no money left.");
</script>
Вы можете использовать checkForBadJavascripts
так:
checkForBadJavascripts ([
[ false,
/Sorry, Sucka/,
function() {
addJS_Node ('alert ("Hooray, you\'re a millionaire.");');
}
]
]);
получить гораздо приятнее сообщение. (^_^)
См. Встроенную документацию, в checkForBadJavascripts, для получения дополнительной информации.
Чтобы увидеть демонстрацию полного сценария, первый визит this page at jsBin. Вы увидите 3 строки текста, два из которых добавлены JS.
install this script (View source; также находится внизу.) И перейдите на страницу. Вы увидите, что GM-скрипт удалил один плохой тег и заменил другой нашим «хорошим» JS.
‡ Обратите внимание, что только Firefox поддерживает beforescriptexecute
событие. И он был удален из спецификации HTML5 без указанной эквивалентной возможности.
Complete GM Пример сценария (То же, как тот, на GitHub и jsBin):
Учитывая этот HTML:
<body onload="init()">
<script type="text/javascript" src="http://jsbin.com/evilExternalJS/js"></script>
<script type="text/javascript" language="javascript">
function init() {
var newParagraph = document.createElement ('p');
newParagraph.textContent = "I was added by the old, evil init() function!";
document.body.appendChild (newParagraph);
}
</script>
<p>I'm some initial text.</p>
</body>
Используйте этот Greasemonkey скрипт:
// ==UserScript==
// @name _Replace evil Javascript
// @include http://jsbin.com/ogudon*
// @run-at document-start
// ==/UserScript==
/****** New "init" function that we will use
instead of the old, bad "init" function.
*/
function init() {
var newParagraph = document.createElement ('p');
newParagraph.textContent = "I was added by the new, good init() function!";
document.body.appendChild (newParagraph);
}
/*--- Check for bad scripts to intercept and specify any actions to take.
*/
checkForBadJavascripts ([
[false, /old, evil init()/, function() {addJS_Node (init);} ],
[true, /evilExternalJS/i, null ]
]);
function checkForBadJavascripts (controlArray) {
/*--- Note that this is a self-initializing function. The controlArray
parameter is only active for the FIRST call. After that, it is an
event listener.
The control array row is defines like so:
[bSearchSrcAttr, identifyingRegex, callbackFunction]
Where:
bSearchSrcAttr True to search the SRC attribute of a script tag
false to search the TEXT content of a script tag.
identifyingRegex A valid regular expression that should be unique
to that particular script tag.
callbackFunction An optional function to execute when the script is
found. Use null if not needed.
*/
if (! controlArray.length) return null;
checkForBadJavascripts = function (zEvent) {
for (var J = controlArray.length - 1; J >= 0; --J) {
var bSearchSrcAttr = controlArray[J][0];
var identifyingRegex = controlArray[J][1];
if (bSearchSrcAttr) {
if (identifyingRegex.test (zEvent.target.src)) {
stopBadJavascript (J);
return false;
}
}
else {
if (identifyingRegex.test (zEvent.target.textContent)) {
stopBadJavascript (J);
return false;
}
}
}
function stopBadJavascript (controlIndex) {
zEvent.stopPropagation();
zEvent.preventDefault();
var callbackFunction = controlArray[J][2];
if (typeof callbackFunction == "function")
callbackFunction();
//--- Remove the node just to clear clutter from Firebug inspection.
zEvent.target.parentNode.removeChild (zEvent.target);
//--- Script is intercepted, remove it from the list.
controlArray.splice (J, 1);
if (! controlArray.length) {
//--- All done, remove the listener.
window.removeEventListener (
'beforescriptexecute', checkForBadJavascripts, true
);
}
}
}
/*--- Use the "beforescriptexecute" event to monitor scipts as they are loaded.
See https://developer.mozilla.org/en/DOM/element.onbeforescriptexecute
Note that it does not work on acripts that are dynamically created.
*/
window.addEventListener ('beforescriptexecute', checkForBadJavascripts, true);
return checkForBadJavascripts;
}
function addJS_Node (text, s_URL, funcToRun) {
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
//--- Don't error check here. if DOM not available, should throw error.
targ.appendChild (scriptNode);
}
Можете ли вы показать нам код и указать строку, которую вы хотите отключить? – hookedonwinter
Вы можете просто загрузить JS, изменить его локально и выполнить там? – Rudu
Я разместил решение здесь: http: // stackoverflow.com/a/9699686/6355 Так как это немного больше, чем ссылка здесь, она снова повторяется: http://userscripts.org/scripts/show/125936 – Sarien