停止执行Javascript函数(客户端)或调整它
我想停止执行站点中的一行,以便浏览器可以读取除该行之外的整个页面。或者浏览器可能只是跳过该javascript函数的执行 或 有没有办法调整javascript,使javascript中的随机数生成函数不会生成随机数,而是生成我想要的数字停止执行Javascript函数(客户端)或调整它,javascript,greasemonkey,Javascript,Greasemonkey,我想停止执行站点中的一行,以便浏览器可以读取除该行之外的整个页面。或者浏览器可能只是跳过该javascript函数的执行 或 有没有办法调整javascript,使javascript中的随机数生成函数不会生成随机数,而是生成我想要的数字 我无法访问脚本所在的站点,因此所有这些都需要在客户端完成。您可以使用所谓的bookmarklet 构建要在另一个站点上运行的js文件:your.js 使用以下代码创建HTML页面: <html> <body> <a href=
我无法访问脚本所在的站点,因此所有这些都需要在客户端完成。您可以使用所谓的bookmarklet 构建要在另一个站点上运行的js文件:your.js 使用以下代码创建HTML页面:
<html>
<body>
<a href="javascript:(function(){var s=document.createElement('SCRIPT');s.src='/url/to/your.js?'+(Math.random());document.getElementsByTagName('head')[0].appendChild(s);})()">
Drag'n Drop this to your bookmarks
</a>
</body>
</html>
将/url/to/your.js替换为js文件的路径
在浏览器中加载该小页面,然后将链接拖放到书签栏
转到你想要破解的网站,单击你刚刚创建的书签。这将在页面中加载你的.js并运行代码
注意:“+Math.random”部分是为了避免缓存js,这不是强制性的,但在开发.js时会很有帮助。答案取决于未提供的详细信息确切的页面和代码行最好,但一般情况下,您可以这样做: 如果在加载DOMContentLoaded后没有立即触发有问题的JS代码,那么可以使用Greasemonkey替换有问题的代码。例如:
var scriptNode = document.createElement ("script");
scriptNode.textContent = "Your JS code here";
document.head.appendChild (scriptNode);
完成了
如果JS代码立即启动,那么它会变得更复杂。
首先,获取脚本的副本并对其进行所需的更改。在本地保存此文件
问题脚本是在文件中还是在主页中HTMLFirefox目前支持的截至-- 通过这次活动,Firefox和Greasemonkey现在似乎在拦截特定标签方面做得很好 这对于Chrome+Tampermonkey仍然是不可能的。对于除Firefox+Greasemonkey之外的任何东西,您都需要使用下面关于编写完整浏览器扩展的其他答案中所示的技术 封装了这个。例如,假设页面有这样一个标记:
<script>
alert ("Sorry, Sucka! You've got no money left.");
</script>
为了得到更好的信息^_^
有关更多信息,请参阅checkForBadJavascripts中的内联文档
要查看完整脚本中的演示,请首先访问。您将看到3行文本,其中两行是由JS添加的
现在;它也在下面。并重新访问该页面。你会看到GM脚本删除了一个坏标签,并用我们的好JS替换了另一个
——请注意,只有Firefox支持beforescriptexecute事件。它从HTML5规范中删除,但没有指定等效功能
完整的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>
用猴子?您需要在TamperMonkey标题中的//@授权下方添加的全部内容是//@requirehttp://urlofyoursite.com/myfile.js. 例如,下面是我的TamperMonkey想法的顶部:
// ==UserScript==
// @name Project
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://docs.google.com/presentation/*
// @grant none
// @require http://cdnjs.cloudflare.com/ajax/libs/annyang/2.1.0/annyang.min.js
// ==/UserScript==
方法1:使用MutationObserver
beforescriptexecute不再适用于Firefox,也不适用于Chrome。幸运的是,有一个替代方案,使用,它得到了广泛的支持。一般的想法是在pageload的开头添加一个MutationObserver,每当向DOM中添加新节点时,它都会运行回调。在回调中,检查是否存在要更改或删除的标记。如果它存在,您可以修改它,比如更改它的文本内容,或者将它的src点放在其他地方。只有在回调完成后,新添加的脚本标记才会运行,因此这是拦截和更改页面上Javascript的有效方法。下面是一个实时片段示例:
//这是在pageload开头运行的userscript代码
//假设我们想阻止加载下面的jQuery脚本标记:
新的变异观察者,观察者=>{
const jqueryScriptTag=document.querySelector'script[src*=jquery];
如果jqueryScriptTag{
log“找到jQuery脚本标记;正在删除它!”;
jqueryScriptTag.remove;
//我们已经做了我们需要做的,不再需要MutationObserver:
观察者:断开连接;
}
}
.observedocument.documentElement,{childList:true,子树:true};
示例内容
在jQuery脚本标记后面加上console.log。如果操作正确,$应该是未定义的:';
console.logtypeof$;
你能给我们看一下代码并指出你想禁用的行吗?你可以下载JS,在本地修改它,然后在那里执行它?我在这里发布了一个解决方案:因为它只不过是一个链接,所以它再次出现了:2016年4月,由于FF是唯一的供应商,所以在HTML5标准中删除了before/afterscriptexecute,不幸的是,方法1在Firefox中不起作用,$仍然被定义为Firefox不关心您如何处理添加的外部脚本元素,它将加载并执行它,而不考虑任何修改。不过这种技术对内联脚本有效。很抱歉,它对你不起作用,b
但当我在FF中试用时,它对我很好。见截图:怪异。我正在用Firefox81.0进行测试,也用80.0进行测试,但似乎不起作用。我还在自己的PoC代码中尝试了DOM突变观察者方法,无论我如何处理脚本标记,删除它,更改src、type或defer属性,它仍然会被加载和执行。你确定这是有效的,并且没有其他原因会在你的屏幕截图上被阻止。例如,有一个大通知说来自其他域的被阻止的JS,这似乎不是来自你的代码?您使用的是哪个版本的Firefox?
<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>
// ==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);
}
// ==UserScript==
// @name Project
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @match https://docs.google.com/presentation/*
// @grant none
// @require http://cdnjs.cloudflare.com/ajax/libs/annyang/2.1.0/annyang.min.js
// ==/UserScript==