你的脚本在哪些网站上运行
下面的两个@include告诉你的油猴你的脚本在哪里运行。
// ==UserScript==
// @include http://example.com/*
// @include http://*.example.com/*
// ==/UserScript==
尝试在你想调试的网站上输出一句话
alert('hello world!');
下面是我遇到的一个bug
function helloworld(){
alert('hello world!');
}
window.setTimeout("helloworld", 60);
会看到报错
Error: helloworld is not defined.
这是由于用户脚本执行完成后,里面所有的内容就都不能使用了。也就是说,当延迟结束,helloworld函数已经没有了。容易想到的解决方法:
如果您需要引用用户脚本中的变量或者函数,应该显式的把它们定义为window对象的属性,它是始终存在的。
window.helloworld = function() {
alert('Hello world!');
}
window.setTimeout("helloworld()", 60);
然而,在 window上设置属性依然不太理想;这有点像用全局变量来做局部变量该做的事。(事实上,就是那么回事,window是全局的,可以被页面中的所有脚本访问。更实际的讲,它可能会与页面自身的脚本,甚至是其它的用户脚本相互干扰。
最佳的解决方案是通过定义匿名函数,把它作为第一个参数传递给 window.setTimeout。
window.setTimeout(function() { alert('Hello world!') }, 60);
推荐大家学习很有用的东西——XPath
4.6. 操作所有有特定属性的元素
在 Greasemonkey 的兵器库中最强悍的一个就是 evaluate 方法。利用 XPath 查询语言,它可以用来获取页面中的元素,属性以及文本。
举个例子来说,如果您想获得页面中的全部链接。您也许会想到用 document.getElementsByTagName(‘a’),但是您还要检查每个元属是否具有 href 属性,因为 <a> 元属还可以用作有名称的锚。
然而可以用 Firefox 内建的 XPath 功能来查找具有 href 属性的 <a> 元属。
例 4.6. 获取页面中的所有链接
var allLinks, thisLink;
allLinks = document.evaluate(
'//a[@href]',
document,
null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
null);
for (var i = 0; i < allLinks.snapshotLength; i++) {
thisLink = allLinks.snapshotItem(i);
// 使用 thisLink
}
document.evaluate 方法是关键。它有一个代表 XPath 查询语句的字符串参数以及一些其它参数,接下来解释一下。这条 XPath 查询语句找到了具有 href 属性的 <a> 元属,用随机的次序排列后返回。(也就是说,集合中的第一个元素并一定是页面中的第一个元素。)然后您可以用 allLinks.snapshotItem(i) 方法访问找到的元素。
XPath 表达式所能做到的甚至会使您惊讶。请看下面这个例子,它获取了全部具有 title 属性的元素。
一些疑问希望各路大佬看到可以帮帮忙,小弟感谢啦!
- 油猴使用的是什么语言?我看了好像是JavaScript,还有用XPath,JQuiry,HTMLDom,有点懵。
- 有没有相关油猴教程,我看到了文档,但感觉还是很迷。里面那个GM是官方接口么? 但看着不太会用,想问问有咩有相关例子。