问题是,当我调用window.close()或self.close()它没有关闭窗口时.现在似乎有一种信念,即在Chrome中你无法通过脚本关闭任何非脚本创建的窗口.这显然是错误的,但无论它应该仍然这样做,即使它需要弹出警报确认.这些都没有发生.
那么,是否有人使用真实的,功能性的,经过验证的关闭窗口的方法,使用类似的东西javascript:window.close()或者javascript:self.close()实际上做了预期的东西以及在非Chrome浏览器的每个浏览器中都能正常运行的东西?任何建议将不胜感激,我正在寻找Javascript特定的解决方案,没有JQuery或第三方实现.
更新:虽然所提出的大部分内容存在严重的局限性和可用性问题,但// @grant window.close在脚本标题中使用的最新建议(特定于TamperMonkey)通常会在通常无法处理close方法的选项卡上执行此操作.虽然不完全理想,并没有针对每种情况推广,但在我的情况下,这是一个很好的解决方案.
我有一个用于Firefox的greasemonkey脚本,昨天它运行得很好.我今天尝试使用它(没有代码被修改),我注意到它停止工作.经过进一步检查,脚本现在抛出以下错误:
Error: Permission denied to access property 'handler'
Run Code Online (Sandbox Code Playgroud)
以下代码块中抛出此错误:
$('body').click(function() {
// code here
});
Run Code Online (Sandbox Code Playgroud)
这个错误神奇地开始发生在今天脚本工作正常昨天.我不明白为什么只是尝试做一些基本的事情,例如在jQuery中添加事件处理程序时发生这种错误.
我的脚本使用的jQuery已经在脚本执行的页面中使用,因此我使用此代码使GM可以访问:
var $ = unsafeWindow.jQuery;
Run Code Online (Sandbox Code Playgroud)
如果需要,可供参考,以下是我在脚本中使用的以下Greasemonkey函数:
// @grant GM_getResourceText
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_getResourceURL
Run Code Online (Sandbox Code Playgroud)
我试过研究这个错误,我找不到任何答案.所有看起来可能有用的问题都涉及iframe,并且在我的代码或运行的网站中找不到单个iframe.我也尝试删除并重新安装脚本,但没有解决问题.
有一个页面http://example.com/1.php像往常一样包含javascript文件:
<script type="text/javascript" src="/util.js?1354729400"></script>
Run Code Online (Sandbox Code Playgroud)
这个文件包含名为exampleFunction的函数,我需要在我的用户脚本中使用它.我还有一个用户脚本:
// ==UserScript==
// @name SomeName
// @namespace http://example.com/userscripts
// @description Greets the world
// @include http://example.com/*
// ==/UserScript==
window.onload = function () {
console.log(exampleFunction);
alert("LOADED!");
}
Run Code Online (Sandbox Code Playgroud)
在Firefox中完美运行并在Chrome中返回错误:
Uncaught ReferenceError: exampleFunction is not defined
Run Code Online (Sandbox Code Playgroud)
我如何使其工作?
javascript greasemonkey google-chrome cross-browser userscripts
我现在正在摆弄chrome中的用户脚本,所以请忍受我潜在的无知/白痴.
在我正在编写脚本的页面中,有一个<script>声明变量的元素x.这是否意味着,在我的用户脚本中,我只能x从全局命名空间访问?
例如,如果我的用户脚本中的唯一一行是alert(x);,那应该按预期工作(假设x是一个字符串)?我知道chrome不支持unsafewindow,但由于某种原因,我发现无法弄清楚如何模仿功能.它甚至可能吗?
我想使用用户脚本在站点中加载另一个脚本文件.但是,js.onload事件无法正常工作.
用户脚本文件:
// ==UserScript==
// @name Code highlight
// @description Test
// @include http://localhost/*
// @version 1.0
// ==/UserScript==
var js = document.createElement('script');
js.src = "http://localhost/test/js/load.js";
document.getElementsByTagName("head")[0].appendChild(js);
js.onload = function(){
console.log(A)
}
Run Code Online (Sandbox Code Playgroud)
load.js文件:
var A = {
name:'aa'
}
Run Code Online (Sandbox Code Playgroud)
在Chrome中,控制台输出"undefined",但load.js已完全加载.
我在Firefox中进行了测试,输出A正确.
假设我正在使用以下网页:
<html>
<body>
<span id="click">click me</span>
<script>
var hello = function() {
alert('hello');
}
document.getElementById('click').addEventListener('click', function(e) {
hello();
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我的Greasemonkey脚本是:
// ==UserScript==
// @name My Script
// @include http://example.com/hello.html
// @version 1
// @grant none
// ==/UserScript==
window.hello = function() {
alert('goodbye');
}
Run Code Online (Sandbox Code Playgroud)
禁用Greasemonkey脚本后,单击#click页面上的元素将显示"hello"警报.启用脚本后,单击该元素将显示"再见"警报.
很简单.在hello从网页的功能正在由Greasemonkey的脚本功能所取代.
现在让我们说我想使用Greasemonkey API.当我将@grant值设置为除'none'之外的有效值(例如// @grant GM_setClipboard)[导致Greasemonkey将脚本作为"内容脚本"运行时,而不是像'none'那样在页面的范围内运行),Greasemonkey脚本无法工作.
window.hello 不再定位页面上的正确对象.
更换window.hello用unsafeWindow.hello看起来像它的工作,而是下面的错误是在JS控制台抛出:
错误:拒绝访问对象的权限
如何在@grant GM_setClipboard设置目标并替换hello页面上的原始函数时重写Greasemonkey脚本?
系统信息:
这是来自用户脚本的代码示例:
var ExampleObj = {
somevar1:'value1',
somevar2:'value2',
somevar3:'value3',
somefunction1:function(){
//do sth
},
somefunction2:function(){
//do sth else
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从脚本调用我的函数时:一切正常,但我无法从浏览器控制台访问:
(参考错误:未定义 ExampleObj)
我的 Greasemonkey/Tampermonkey 设置(元数据):
// ==UserScript==
// @name [this is my secret]
// @version 1
// @run-at document-end
// @include [this is my secret]
// @grant none
// ==/UserScript==
Run Code Online (Sandbox Code Playgroud)
脚本有效;我只需要从浏览器控制台访问这些功能。
我尝试搜索这个,但是出现的唯一结果是双击,而不是如何自动双击某些东西.(触发双击.)
我可以点击一次,并尝试两次"创建"双击但失败.我假设这是因为时间,这就是为什么我设置一个计时器,看看我的双击之间有多少时间.
是否有双击的自动方式?我没有使用jQuery所以请在答案中避免使用它.
所以我点击使用:
document.getElementyById("somethinbg").click();
Run Code Online (Sandbox Code Playgroud)
我尝试双击:
document.getElementById("something").dblclick();
Run Code Online (Sandbox Code Playgroud)
没有成功.
请注意,仅调用
history.pushState()orhistory.replaceState()不会触发popstate事件。该popstate事件将通过执行浏览器操作触发,例如单击后退或前进按钮(或调用history.back()或history.forward()在 JavaScript 中)。
我需要一种在 URL 更改时通过不触发popstate事件的方式(例如history.replaceState())来执行某些代码的方法。最好使用 MutationObserver API [1],并且绝对不要每 x 秒轮询一次 URL。
此外,hashchange不会这样做,因为我必须对URL 中的每个更改采取行动,而不仅仅是哈希部分。
那可能吗?
[1]在另一个问题上解释了为什么 MutationObserver API 对此不起作用。
(其他)相关问题:
我用以下代码编写了 Greasemonkey/Tampermonkey 脚本:
var on = true;
function doSomething(){
if(on){
//do stuff
}
}
setInterval(doSomething,1000);
Run Code Online (Sandbox Code Playgroud)
通常该功能是活动的,但在某些情况下,我想从浏览器中的 JavaScript 控制台禁用它。
我不想在网页上添加额外的切换按钮。
我怎样才能实现这个目标?在控制台中输入on = true不起作用,因为on“未定义”。
我想更改网页显示的部分内容,是否可以用usercript覆盖一个函数?
下面是我想覆盖的功能(也可以在这里找到):
function StartDrawing() {
if ((typeof (systemsJSON) != "undefined") && (systemsJSON != null)) {
var stellarSystemsLength = systemsJSON.length;
$('#mapDiv').empty();
if (stellarSystemsLength > 0) {
InitializeRaphael();
var i = 0;
for (i = 0; i < stellarSystemsLength; i++){
var stellarSystem = systemsJSON[i];
DrawSystem(stellarSystem)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将允许我运行自己的绘图算法.
如何使用chrome(或Firefox)中的用户脚本执行此操作?
简而言之,我不想将警报 URL 和响应正文发送到我的应用程序。此代码有效,但除非我授予它,否则我无法使用 GM_xmlhttpRequest。
不做任何改变,代码就会神奇地崩溃。我不确定发生了什么变化以及如何修复它。我以为我可以使用console.log数据并将其复制/粘贴到我的应用程序中,但 Facebook 禁用了 console.log。
我想过做 xmlhttpRequest 但这也被某种方式阻止了。我通过在控制台中执行代码进行测试。这 3 行似乎在除了 Facebook 域之外的任何地方都有效。我认为这与CORS有关。
// ==UserScript==
// @name FBTest
// @namespace test
// @include https://*.facebook.com/*
// @version 1
// @grant none
// ==/UserScript==
//change none to GM_xmlhttpRequest
(function() {
var proxied = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, url) {
alert(url);
return proxied.apply(this, [].slice.call(arguments));
};
})();
Run Code Online (Sandbox Code Playgroud) 无论如何可以从 Greasemonkey 脚本访问安全 cookie?
我编写了使用该document.cookie.split函数的脚本。它返回一个 cookie 列表,但不包括安全 cookie。
javascript ×12
greasemonkey ×9
tampermonkey ×5
userscripts ×4
firefox ×3
console ×1
cookies ×1
double-click ×1
events ×1
facebook ×1
jquery ×1
script-tag ×1