我有一个Greasemonkey脚本,在Firefox和Opera中运行良好.但是,我很难让它在Chrome中运行.问题是在页面中注入一个可以通过页面中的代码调用的函数.这是我到目前为止所做的事情:
首先,我得到一个帮助引用Firefox 的unsafeWindow.这让我可以使用相同的FF和Opera代码(我认为是Chrome).
var uw = (this.unsafeWindow) ? this.unsafeWindow : window;
Run Code Online (Sandbox Code Playgroud)
接下来,我在页面中注入一个函数.它实际上只是一个非常薄的包装器,除了在GM脚本的上下文中调用相应的函数之外什么都不做:
uw.setConfigOption = function(newValue) {
setTimeout(setConfigOption, 0, newValue);
}
Run Code Online (Sandbox Code Playgroud)
然后,我的脚本中有相应的功能:
setConfigOption = function(newValue) {
// do something with it, e.g. store in localStorage
}
Run Code Online (Sandbox Code Playgroud)
最后,我在页面中注入一些HTML,并带有一个调用该函数的链接.
var p = document.createElement('p');
p.innerHTML = '<a href="javascript:setConfigOption(1)">set config option to 1</a>';
document.getElementById('injection-point').appendChild(p);
Run Code Online (Sandbox Code Playgroud)
总结一下:在Firefox中,当用户单击该注入的链接时,它将在unsafeWindow上执行函数调用,然后触发超时,该超时在我的GM脚本的上下文中调用相应的函数,然后执行实际处理.(如果我错了,请纠正我.)
在Chrome中,我只是得到一个"未捕获的ReferenceError:setConfigOption未定义"错误.实际上,在控制台中输入"window.setConfigOption"会产生"未定义".在Firebug和Opera开发人员控制台中,功能就在那里.
也许有另一种方法可以做到这一点,但是我的一些函数是由页面上的Flash对象调用的,我认为这使得我必须在页面上下文中使用函数.
我在Greasemonkey维基上快速浏览了unsafeWindow的替代品,但它们看起来都非常难看.我在这里完全走错了轨道还是应该仔细研究这些?
决议:我跟着Max S. 建议,现在可以在Firefox和Chrome中使用.因为我需要对页面可用的函数必须回调常规函数,所以我将整个脚本移动到页面,即它完全包含在他称为"main()"的函数中.
为了使这个hack的额外丑陋更加可以忍受,我至少可以放弃unsafeWindow和wrappedJSObject的使用.
我还没有设法从Greasemonkey wiki中获取内容范围运行器.它应该做同样的事情似乎执行得很好,但是我的函数永远不会<a>被页面中的元素访问,例如.我还没弄清楚为什么会这样.
javascript greasemonkey google-chrome userscripts google-chrome-extension
我正在为Firefox和Chrome创建一个UserScript扩展,我正在尝试使用网站JavaScript中的一些代码,例如:
function: myFunction(){
return Grooveshark.playNextSong();
}
Run Code Online (Sandbox Code Playgroud)
问题是当我测试这段代码时, Grooveshark是一个空引用.
我知道还有其他人做过:
但我不知道为什么我的简单扩展无法调用Grooveshark的JavaScript函数.
我是否需要将我的脚本"附加"到文档中才能使其正常工作?:
document.document.body.appendChild(script);
不是Greasemonkey已经注入我的扩展JavaScript吗?请允许有人为我澄清这一点.
谢谢.
Chrome/Tampermonkey用户脚本存储在文件系统中的哪个位置?
我想直接编辑用户脚本,而不是使用hokey浏览器编辑器.
我想用一个用户脚本加载一个共享工作者.问题是用户脚本是免费的,并且没有托管文件的商业模式 - 我也不想使用服务器,甚至是免费服务器来托管一个小文件.无论如何,我尝试了它,我(当然)得到了相同的原始政策错误:
Run Code Online (Sandbox Code Playgroud)Uncaught SecurityError: Failed to construct 'SharedWorker': Script at 'https://cdn.rawgit.com/viziionary/Nacho-Bot/master/webworker.js' cannot be accessed from origin 'http://stackoverflow.com'.
还有另一种方法可以通过将worker函数转换为字符串然后转换为Blob并将其作为worker加载来加载Web worker,但我也尝试过:
var sharedWorkers = {};
var startSharedWorker = function(workerFunc){
var funcString = workerFunc.toString();
var index = funcString.indexOf('{');
var funcStringClean = funcString.substring(index + 1, funcString.length - 1);
var blob = new Blob([funcStringClean], { type: "text/javascript" });
sharedWorkers.google = new SharedWorker(window.URL.createObjectURL(blob));
sharedWorkers.google.port.start();
};
Run Code Online (Sandbox Code Playgroud)
这也不起作用.为什么?因为共享工作程序是根据其工作文件的加载位置共享的.由于createObjectURL为每次使用生成唯一的文件名,因此工作人员将永远不会拥有相同的URL,因此永远不会共享.
我怎么解决这个问题?
注:我想询问具体的解决方案,但在这一点上,我想我能做的最好是问一个更宽泛的方式的任何 解决问题的办法,因为我所有的尝试的解决方案似乎根本不可能的,因为相同的起源政策或方式
URL.createObjectURL工作(从规范,似乎不可能改变生成的文件URL).话虽如此,如果我的问题可以某种方式得到改善或澄清,请发表评论.
元数据块上的GreaseSpot页面说两者非常相似,但@match"对*字符的含义设置了更严格的规则".然后GreaseSpot继续教授使用@include,但像这样的 Chrome示例通常似乎使用@match并表明@include仅支持兼容性目的; @match是优选的.
显然,@include google.*可以在google.evil.com上运行而@match google.*不能.
这个例子不足以真正看出通配符在这两者之间的表现如何不同,并且在这里的答案中寻求更好的解释.
@include默认情况下使用新的GreaseMonkey脚本(Firefox),而默认使用新的TamperMonkey脚本(例如Chrome)@match.
这两者之间到底有什么区别?
例如,每个人如何处理通配符?
跨浏览器兼容性有差异吗?
有人选择使用一个而不是另一个的原因是什么?
我的Harddrive上有一个API文档,为了简化我的工作流程,我编写了一个简单的脚本来修改页面以满足我的需求.我在FireFox上使用FireBug开发了它.
@include-ing网页是否正常工作,但Greasemonkey似乎没有检测到本地文件系统上的页面?
我想有一个像包括
// @include *R13/Python*R13/*
Run Code Online (Sandbox Code Playgroud)
例如,哪个应该匹配
file:///Z:/Eigene%20Dateien/Cinema4D/Documentations/R13/Python%20R13/modules/c4d/index.html
Run Code Online (Sandbox Code Playgroud)
但它没有得到承认.如何才能实现usercript在本地html文件上运行?
提前致谢,
我正在阅读GM的维基以确定@downloadURL&之间的差异@updateURL(我没有).但令我更加困惑的是,两者都没有得到修改:
指定此值是不常见的.大多数脚本都应该省略它.
我很惊讶,因为它是脚本自动更新的唯一方法,我不明白为什么不应该使用这些键.
维基本身很缺乏,没有其他论坛消息来源,所以我不得不问这里.也希望了解有关这些键的更多详细信息.
我发现使用Greasemonkey类型的用户并将其转换为Chrome,Safari和Firefox的扩展/插件非常容易.当然,人们可以在Chrome中原生运行它们,只需在Firefox中使用Greasemonkey插件即可.
我现在正在探索是否可以在IE上运行我的用户脚本.我尝试了古老的Trixie和膨胀的ie7pro,但都没有正确运行脚本.它们部分工作,但也似乎在同一页面上多次重新加载脚本,不断插入应该只显示一次的项目.经常提到的Greasemonkey for IE现在已经不存在了,它的域名(gm4ie.com)已经停放并且充满了广告.
我挖了一下w/search,寻找有关如何开发IE扩展的信息(例如这个).但我没有找到任何人谈论让用户脚本在插件内运行.至少看起来javascript可能在那些环境中不可用,需要在C#中完全重写.
我上面没有列出任何Greasemonkey型插件吗?是否可以将javascript用户脚本转换为IE扩展?
internet-explorer cross-browser userscripts browser-extension
我确信这很简单,但我不知道该怎么做.我如何计算HTML页面中DOM元素的数量?我想在用户脚本或书签中这样做,但我不知道如何开始!
今天,谷歌改变了用户脚本在Chrome中的安装方式.您再也不能单击包含一个的链接,确认几个对话框并安装它.现在您必须使用另存为...下载脚本,打开包含它的Finder/Explorer窗口,在Chrome中打开Extensions窗口,然后将脚本拖到扩展窗口.IOW,一个大PITA.
据推测,替代方案是打包为Chrome扩展程序并将其放在Chrome网上商店中.但是,我无法在任何地方找到任何表明您可以将用户标记打包为扩展名的信息. 这可能吗? 如果是,是否有任何新限制,指向文档的链接或其他提示?
userscripts ×10
javascript ×7
greasemonkey ×6
tampermonkey ×3
bookmarklet ×1
dom ×1
firefox ×1
local-files ×1