从Firefox 57开始过时。根据需要使用[greasemonkey-4]或[tampermonkey]。如果使用其他浏览器用户脚本引擎,请使用[userscripts]。
我正在通过外部服务使用 HTML 文档页面,该服务在 HTML 页面中呈现 JSON 片段。 HTML 源代码如下所示: { “产品链接”:“https://example... 我正在通过外部服务使用HTML文档页面,该服务在HTML页面中呈现JSON片段。 HTML 源代码如下所示: <pre>{ "product-link": "https://example.com/product-link", "teaser_image": "https://example.com/teaser-image", "product_image_first": "https://example.com/product-image-first", "headline": "Example headline", }</pre> JSON 块呈现 没有 语法突出显示。 由于我不控制外部服务,我想通过用户脚本将语法突出显示(颜色)应用于 JSON 片段。 我找到了Greasemonkey,但仍然缺少如何注入语法荧光笔库的要点。 感谢 xander 这是我基于 code-prettify 的用户脚本的第一个工作版本: (function(d) { stylizePreElements = function() { var preElements = document.getElementsByTagName("pre"); for (i = 0; i < preElements.length; ++i) { var preElement = preElements[i]; preElement.className += "prettyprint"; } }; injectPrettifyScript = function() { var scriptElement = document.createElement('script'); scriptElement.setAttribute("src", "https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"); document.head.appendChild(scriptElement); }; stylizePreElements(); injectPrettifyScript(); })(document) 谢谢你让我的一天变得更加美好! 跟进这个答案,如果您在格式化运行后更改元素的文本内容,PR.prettyPrint();将不会重新格式化它。 Code-prettify 将类 prettyprinted 添加到其格式化为标记的元素中,以便不重新处理它们。 以下是更改内容后删除标记的示例: const url = "https://jsonplaceholder.typicode.com/posts"; fetch(url) .then(response => { if (!response.ok) { throw Error(response.statusText); } return response.text(); }) .then(data => { const pre = document.querySelector("pre"); pre.textContent = data; pre.classList.remove("prettyprinted"); PR.prettyPrint(); }) .catch(err => console.error(err)); body, pre { overflow: scroll; margin: 0; } <script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js?skin=sons-of-obsidian"></script> <pre class="prettyprint">{"foo": 42}</pre> 如果您不是可用样式的忠实粉丝,请考虑hljs。
如何在 Chrome 中模仿 Greasemonkey/Firefox 的 unsafeWindow 功能?
我现在只是在 chrome 中摆弄用户脚本,所以请容忍我潜在的无知/白痴。 在我正在为其编写脚本的页面中,有一个 元素声明...</desc> <question vote="7"> <p>我现在只是在 chrome 中摆弄用户脚本,所以请容忍我潜在的无知/白痴。</p> <p>在我正在为其编写脚本的页面中,有一个 <pre><code><script></code></pre> 元素声明了一个变量 <pre><code>x</code></pre>。 这是否意味着,在我的用户脚本中,我只能从全局命名空间访问<pre><code>x</code></pre>?</p> <p>例如,如果我的用户脚本中的唯一行是 <pre><code>alert(x);</code></pre>,它是否应该按预期工作(假设 <pre><code>x</code></pre> 是一个字符串)?我知道 chrome 不支持 unsafewindow,但由于某种原因,我发现不可能弄清楚如何模仿该功能。还可能吗?</p> </question> <answer tick="false" vote="13"> <p>这将为您提供对窗口对象的引用(如 p):</p> <pre><code>var p = unsafeWindow; if(window.navigator.vendor.match(/Google/)) { var div = document.createElement("div"); div.setAttribute("onclick", "return window;"); p = div.onclick(); }; </code></pre> </answer> <answer tick="false" vote="11"> <p><strong>更新:</strong><br/> <pre><code>onclick</code></pre> 漏洞在最新的 Chrome 版本中不再起作用。</p> <p>要在 Chrome 中获得 <pre><code>unsafeWindow</code></pre> 功能,最好的选择是安装并使用 <a href="https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo" rel="nofollow noreferrer">Tampermonkey</a> ——无论如何,你应该明智地这样做。 Tampermonkey 完全支持 Greasemonkey API,并且脚本管理更加简单。</p> <p>Greasemonkey 脚本和 Tampermonkey 脚本几乎总是完全兼容,但对于普通 Chrome 用户脚本来说并非如此。</p> <p>放弃 Tampermonkey,唯一仍然有效的替代方案是使用某种形式的 <a href="https://stackoverflow.com/a/13485650/331508">脚本注入</a>。</p> <p><br/></p> <hr/> <p><strong>以下内容现已过时:</strong> </p> <p><a href="https://stackoverflow.com/a/10828021/331508">Chrome 现在为用户脚本/内容脚本<pre>定义了 </pre><code>unsafeWindow</code></a>,但 Chrome 的 <pre><code>unsafeWindow</code></pre> 仍然不允许访问目标页面创建的 JS 对象。</p> <p>以下是如何提供适当的不安全,<pre><code>unsafeWindow</code></pre>——以跨浏览器的方式,使用<a href="https://stackoverflow.com/a/1294765/331508"><em>特征检测</em>(好)与<em>浏览器嗅探</em>(坏)</a>:</p> <pre><code>/*--- Create a proper unsafeWindow object on browsers where it doesn't exist (Chrome, mainly). Chrome now defines unsafeWindow, but does not give it the same access to a page's javascript that a properly unsafe, unsafeWindow has. This code remedies that. */ var bGreasemonkeyServiceDefined = false; try { if (typeof Components.interfaces.gmIGreasemonkeyService === "object") { bGreasemonkeyServiceDefined = true; } } catch (err) { //Ignore. } if ( typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) { unsafeWindow = ( function () { var dummyElem = document.createElement('p'); dummyElem.setAttribute ('onclick', 'return window;'); return dummyElem.onclick (); } ) (); } </code></pre> </answer> <answer tick="true" vote="9"> <p><pre><code>contentWindow</code></pre> 在 Chrome 3 中可用,但 <a href="http://groups.google.com/group/chromium-extensions/browse_thread/thread/a4ff886cfecf80ca" rel="nofollow noreferrer">在 Chrome 4 中被删除</a>。 Chrome 4 唯一可能的解决方案:</p> <pre><code>location.href="javascript:(function(){ alert('Hello'); })()" </code></pre> </answer> <answer tick="false" vote="1"> <p>如果您想与页面 JavaScript 交互,则必须将脚本插入页面中。 (当然,除非您想使用本页建议的任何技巧。)我已经编写了一个函数来为我自己的脚本执行此操作,我会将其发布在这里,以防有人想要使用它。</p> <pre><code>/* @description This function will insert the given code as a <script> or <style> block into a page. @param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS). @param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'. @return The HTML element that was inserted, or FALSE on failure */ function insert(z,t){ var j,f,x,c,i,n,d d=document c=d.createElement i=d.head.appendChild a=d.createTextNode if(typeof z==='function') j=!0,f=!0; if((t=='js'||!t)&&!f){j=!0,f=!1} if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')} if(j){x=c('script');x.setAttribute('type','text/javascript')} if(f) n=a('('+z+')()');else n=a(z) x.appendChild(n) if(x){return i(x)}else{return !1} } </code></pre> <p>几个需要澄清的例子:</p> <pre><code>//Inserting a JavaScript function var func=function(){ stopAds(); startFileDownload(); } insert(func); //Inserting JavaScript as a string var strJS="prompt(\"Copy:\",someVariableAtThePage);"; insert(strJS); //Or with an OPTIONAL 2nd parameter: insert(strJS,'js'); //Inserting CSS var strCSS=".ad{display:none !important} #downloadButton{display:block}"; insert(strCSS,'css');//Specifying 2nd parameter as "css" is required. </code></pre> </answer> <answer tick="false" vote="0"> <p>好的,这是一个想法,您可以使用地址栏注入脚本...</p> <pre><code>javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm); </code></pre> <p>然后你可以用你的javascript在窗口中运行你想要的任何内容</p> </answer> <answer tick="false" vote="0"> <p>@Johan 的答案中的脚本非常酷且有用。但我需要它并且想看到它<strong>去混淆</strong>。</p> <p>对于那些像我一样想要查看它或以可读格式使用它的人,就在这里。这是 <strong>same</strong> 函数,只是为了清晰起见进行了一些重构。这可能有助于更快地理解甚至分叉:</p> <pre><code>function insert(code, tipo) { let isJS, isFunc, x, n; if (typeof code === "function") { isJS = true; isFunc = true; } if ((tipo === "js" || !tipo) && !isFunc) { (isJS = true), (isFunc = false); } if (tipo === "css" && !isJS) { x = document.createElement("style"); x.setAttribute("type", "text/css"); } if (isJS) { x = document.createElement("script"); x.setAttribute("type", "text/javascript"); } if (isFunc) n = document.createTextNode("(" + code + ")()"); else n = document.createTextNode(code); x.appendChild(n); if (x) { return document.head.appendChild(x); } else { return false; } } </code></pre> </answer> </body></html>
欺骗 xmlhttprequest (greasemonkey)
我阻止了来自greatmonkey的XMLHttpRequest,但是当它没有得到响应时页面会出现错误。所以我尝试欺骗,就好像收到了回复一样。不幸的是,XMLHttpRequest 似乎已读取字段...
我正在尝试使用 JavaScript(使用 Greasemonkey)从我自己的网站中提取数据来自定义另一个网站。我使用的代码如下: 函数 getURL(url, func) { var xhr = 新的 XMLHttpRequ...
我想使用 Firefox 3.5 中引入的 Web Worker 工具来增强我正在开发的 Greasemonkey 脚本。 这可能吗? 我做了一些实验,但我无法通过......
我有一个如下所示的用户脚本: document.querySelector('[title="选择:此选项"]').checked = true document.querySelector('[title="点击继续"]').click() 之后...
使用 JavaScript/GreaseMonkey 存储到文件中
我已经使用 Greasemonkey 从页面捕获了数据列表。 通用汽车脚本 var hit = GM_getValue("hit") || 0; var _url = "http://localhost:8080/test?p=$$pageNo$$"; _url = _url.replace("$$pageNo$$",...
如何使用 GreaseMonkey/ViolentMonkey 从字符串中检索全局上下文变量?
当尝试从 Javascript 中的字符串检索全局上下文(通常是窗口)中定义的变量时,我知道您可以简单地这样做: var 测试变量 = 123; console.log(窗口["testVa...
问题涉及特定网站:NS.nl 上的门票订购。该页面上有一个用于输入电子邮件的文本输入字段,并且该字段已禁用 Ctrl-V(粘贴)。 问题:什么油猴
如何使用 Greasemonkey 在 javascript 中设置创建的事件的 `isTrusted` 属性
我想通过 Greasemonkey 中的用户脚本创建并触发 KeyPress 事件,但我观察到 createEvent 的 isTrusted 始终设置为 false。 isTrusted 是只读属性...
我的目标是使用 Firefox 中的 Greasemonkey 扩展将 menu.html 中的数组选项内的值从 a 更改为 d,但我的问题是我尝试选择/访问的元素被加载为...
脚本开头“(function() {”的用途(仅限 GreaseMonkey?)
我对 JavaScript 还很陌生,我正在自学。我目前正在创建和调整 GreaseMonkey 脚本。我注意到大多数简单的脚本(即那些不需要命名函数的脚本......
在 Mozilla Firefox 的每个页面上运行自定义 Javascript
我有一段自定义的Javascript,我想在特定域的每个网页上运行它,或者只是在每个网页上运行。 (如果您想知道:这不是恶意的。它允许
HackerNews (https://news.ycombinator.com/) 将已访问链接的颜色与未访问链接的颜色相似。我想将访问的链接设置为对比色。 我是 Tampermonkey 的新手(以及
HackerNews (https://news.ycombinator.com/) 将已访问链接的颜色与未访问链接的颜色相似。我想将访问的链接设置为对比色。 我是 Tampermonkey 的新手(以及
如何从 Greasemonkey 脚本拦截 XMLHttpRequest?
我想使用 Greasemonkey 捕获 AJAX 请求的内容。 有人知道该怎么做吗?
无法让 GM_notification 函数在 Tampermonkey 用户脚本(chrome、OSX)中工作
我正在尝试重写一些 Tampermonkey 脚本以使用一些内置的 TM/GM 函数,但我无法让它们工作。 GM_Notification 函数就是一个例子。 我正在使用它进行测试...
使用greasemonkey拦截并更改网站的javascript
假设有一个网站在 html 脚本标记中包含外部 .js 文件,如下所示: 我想让greatmonkey拦截每个这样的脚本,并改变一些......</desc> <question vote="12"> <p>假设有一个网站在 html 脚本标记中包含外部 .js 文件,如下所示:</p> <pre><code><script src="somescript.js"> </code></pre> <p>我希望greasemonkey拦截每个这样的脚本,并在执行之前更改其中的一些值。例如,我想将其中所有出现的值“400”更改为“300”,然后继续加载页面,就好像脚本使用这些值而不是原始值一样。目前我在greasemonkey中使用以下代码:</p> <pre><code>function replaceTargetJavascript (scriptNode) { var scriptSrc = scriptNode.textContent; scriptSrc = scriptSrc.replace ( /'400'/, "'300'" ); addJS_Node (scriptSrc); } document.addEventListener("beforescriptexecute", function(e) { checkForBadJavascripts ( [ [false, /'400'/, replaceTargetJavascript] ] ); }, true); </code></pre> <p>根据我的消息来源,这是正确的方法,但它不起作用。谁能帮我解决这个问题吗?</p> </question> <answer tick="true" vote="23"> <p>老问题,但我最近需要这样做。 这是我使用 GreaseMonkey 的方法。</p> <p>您添加 beforescriptexecute 侦听器,然后等待目标脚本加载,检查 src 标记以识别正确的脚本。</p> <p>然后您停止加载该脚本并使用 GM_xmlhttpRequest 自行获取脚本源。</p> <p>然后您可以随意修改脚本并将其插入回 DOM 中。</p> <pre><code>// ==UserScript== // @name Test // @namespace Test // @description TEST // @include http://the.website.com/* // @version 1 // @grant GM_xmlhttpRequest // @run-at document-start // ==/UserScript== function addScript(text) { text = text.replace(/replaceThis();/g, ""); var newScript = document.createElement('script'); newScript.type = "text/javascript"; newScript.textContent = text; var head = document.getElementsByTagName('head')[0]; head.appendChild(newScript); } window.addEventListener('beforescriptexecute', function(e) { src = e.target.src; if (src.search(/script_to_modify\.js/) != -1) { e.preventDefault(); e.stopPropagation(); GM_xmlhttpRequest({ method: "GET", url: e.target.src, onload: function(response) { addScript(response.responseText); } }); } }); </code></pre> </answer> <answer tick="false" vote="1"> <p>老问题,但我最近需要这样做,并且接受的答案使用非标准功能<pre><code>beforescriptexecute</code></pre>。</p> <p>它与已接受的答案基本相同,但使用 <a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver" rel="nofollow noreferrer"><pre><code>MutationObserver</code></pre></a> 作为暗示的评论,另请参阅<a href="https://stackoverflow.com/a/59518023/1214236">此答案</a>了解重复的问题。</p> <pre><code>new MutationObserver(async (mutations, observer) => { let oldScript = mutations .flatMap(e => [...e.addedNodes]) .filter(e => e.tagName == 'SCRIPT') .find(e => e.src.match(/old-script.js/)) if (oldScript) { observer.disconnect() oldScript.remove() let text = await fetch(oldScript.src).then(e => e.text()) .then(e => e.replace(/hijack-part/g, "profit")) let newScript = document.createElement('script') newScript.type = 'module' // or text/javascript depending on what you hijack newScript.textContent = text document.querySelector('head').appendChild(newScript) } }).observe(document, { childList: true, subtree: true, }) </code></pre> <p>不过,我并不能 100% 确定突变和脚本加载/执行方面的事情发生的顺序。所以我不知道是否存在在观察者发生突变之前脚本已经执行的极端情况。 AFAICT <pre><code>MutationObserver</code></pre> 只是一个观察者,并不能严格阻止节点被添加,只需立即删除它们即可。</p> <p>就我而言,它确实有效。</p> </answer> </body></html>
我的公司有一个状态屏幕,我们可以通过 PLEX 访问该屏幕,以直观地了解整个工厂车间的机器状态。我们通过...
我正在学习如何使用 Greasemonkey,并且想知道 @namespace 元数据 id 的用途。 它必须是网址吗?或者它可以是我计算机上的文件夹/目录吗? 难道还...