在调试使用Google后端的客户端应用程序时,我添加了一些调试版本的函数,并使用Chrome Developer Tools脚本编辑器插入它们.
但是这种方法存在许多限制,首先是编辑器似乎并不总是使用去缩小文件,而当JS文件长度为35K行时,这是一个问题.
另一个问题是在加载时间内完成的所有初始化都使用原始的"未修补"函数,因此这并不理想.
我想javascript.js用我自己的本地副本替换远程文件,大概是使用文件名上的一些正则表达式,或者任何合适的策略,我很乐意使用Firefox或Chrome,如果一个比另一个更容易.
我正在为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吗?请允许有人为我澄清这一点.
谢谢.
我正在处理用户脚本,我刚刚发现当主页面发出AJAX请求时脚本没有运行.
有没有办法在主页加载和AJAX请求上触发用户脚本?
我想用一个用户脚本加载一个共享工作者.问题是用户脚本是免费的,并且没有托管文件的商业模式 - 我也不想使用服务器,甚至是免费服务器来托管一个小文件.无论如何,我尝试了它,我(当然)得到了相同的原始政策错误:
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).话虽如此,如果我的问题可以某种方式得到改善或澄清,请发表评论.
我正在写一个GreaseMonkey脚本,我正在迭代一堆元素.对于每个元素,我需要一个字符串ID,以后我可以用它来引用该元素.元素本身没有id属性,我不能修改原始文档给它一个(虽然我可以在我的脚本中进行DOM更改).我无法在我的脚本中存储引用,因为当我需要它们时,GreaseMonkey脚本本身将超出范围.例如,有没有办法获得浏览器使用的"内部"ID?只有Firefox的解决方案很好; 可以在其他场景中应用的跨浏览器解决方案非常棒.
编辑:
如果GreaseMonkey脚本超出范围,您以后如何引用这些元素?他们GreaseMonkey脚本正在向DOM对象添加事件.我无法将引用存储在数组或其他类似的机制中,因为当事件触发时,数组将会消失,因为GreaseMonkey脚本将超出范围.因此,事件需要某种方式来了解脚本在附加事件时所具有的元素引用.并且所讨论的元素不是它所附着的元素.
你不能只在元素上使用自定义属性吗?是的,但问题在于查找.我不得不求助于遍历所有元素,寻找将自定义属性设置为所需id的元素.那肯定会有用,但在大型文档中它可能非常耗时.我正在寻找浏览器可以执行查找工作的东西.
等等,你能否或不能修改文件?我无法修改源文档,但我可以在脚本中进行DOM更改.我会在问题中澄清一下.
你能不能使用封口?尽管我最初认为他们不会这样做,但Closuses确实有效.见我后来的帖子.
这听起来像是问题的答案:"我可以使用一些内部浏览器ID吗?" 没有."
我试图让Greasemonkey脚本在页面上运行.但事实并非如此.
你如何调试脚本?
启动新Greasemonkey脚本的最小可能步骤是什么?
我是Greasemonkey,javascript的新手,实际上是所有UI的东西.
要求:用户脚本在页面加载后由GS运行一次.但是,我需要在不刷新的情况下多次运行相同的脚本
使用案例:例如,使用Ajax进行Amazon.com搜索.我需要在搜索结果中嵌入自定义元素.
每次在同一页面中进行搜索时,我都需要将我的内容注入search-results-div以及结果(没有页面刷新)
我当前的脚本仅在页面刷新时运行.
我希望上面的解释清楚.请帮忙.
我正在创建一个Greasemonkey脚本,并且想要打开一个新的选项卡,该选项卡不会显示URL,而是一些HTML,它们是脚本的一部分.所以基本上我想做这样的事情(这显然不起作用):
window.open('<html><head></head><body></body></html>');
or
GM_openInTab('<html><head></head><body></body></html>');
Run Code Online (Sandbox Code Playgroud)
任何提示都是受欢迎的!
元数据块上的GreaseSpot页面说两者非常相似,但@match"对*字符的含义设置了更严格的规则".然后GreaseSpot继续教授使用@include,但像这样的 Chrome示例通常似乎使用@match并表明@include仅支持兼容性目的; @match是优选的.
显然,@include google.*可以在google.evil.com上运行而@match google.*不能.
这个例子不足以真正看出通配符在这两者之间的表现如何不同,并且在这里的答案中寻求更好的解释.
@include默认情况下使用新的GreaseMonkey脚本(Firefox),而默认使用新的TamperMonkey脚本(例如Chrome)@match.
这两者之间到底有什么区别?
例如,每个人如何处理通配符?
跨浏览器兼容性有差异吗?
有人选择使用一个而不是另一个的原因是什么?
我为Facebook写了一个Greasemonkey/Tampermonkey脚本.我需要存储数据以便以后检索它.为此我用过localStorage.
那很好用.但我注意到,几个小时后,我存储的所有数据都被删除了automaticgicllay.可能Facebook本身会删除所有localStorage数据.
现在,我搜索了替代品.
我想将数据存储在客户端系统中.我有什么选择?我应该使用FileSystem来存储数据吗?
javascript greasemonkey google-chrome local-storage tampermonkey
greasemonkey ×10
javascript ×9
tampermonkey ×3
userscripts ×3
ajax ×2
firefox ×2
dom ×1
firebug ×1
jquery ×1