Javascript Greasemonkey的隐藏特征

Javascript Greasemonkey的隐藏特征,javascript,greasemonkey,Javascript,Greasemonkey,人们在Greasemonkey脚本中使用的一些鲜为人知但有用的特性和技术是什么 (请,每个答案只有一个功能。) 类似的线程: 可以通过GM_setValue(keyname,value)将数据存储为mozilla首选项值,从而在页面加载过程中保持数据 下面是一个简单的示例,用于统计给定浏览器执行脚本的次数: var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer="

人们在Greasemonkey脚本中使用的一些鲜为人知但有用的特性和技术是什么

(请,每个答案只有一个功能。)

类似的线程:


可以通过
GM_setValue(keyname,value)
将数据存储为mozilla首选项值,从而在页面加载过程中保持数据

下面是一个简单的示例,用于统计给定浏览器执行脚本的次数:

var od = GM_getValue("odometer", 0); od++; GM_setValue("odometer", od); GM_log("odometer=" + od); var od=GM_getValue(“里程表”,0); od++; GM_设定值(“里程表”,od); GM_日志(“里程表=“+od”); GM值与cookie类似,因为cookie值只能由原始域访问,GM值只能由创建它们的脚本访问。

匿名统计信息

假设您有一个提供访问日志记录的基本托管服务,您可以轻松地跟踪脚本的基本使用统计信息

  • 在您自己的网站上放置gif文件(如徽标图像)
  • 在脚本中,将img元素附加到引用gif的页面:
  • var img=document.createElement(“img”); img.src=”http://mysite.com/logo.gif"; 文件.正文.附件(img); 现在,每次用户执行您的脚本时,您的托管服务都会在该gif文件上注册一个点击


    要跟踪多个脚本,请为每个脚本使用不同的gif文件。或者在URL中添加某种区别参数(例如:
    http://mysite.com/logo.gif?zippyver=1.0
    )。

    Greasemonkey脚本通常需要搜索页面上的内容。尝试使用XPath来定位感兴趣的节点,而不是通过DOM进行挖掘。
    document.evaluate()
    方法允许您提供XPath表达式并返回匹配节点的集合。这是一个很好的开始。例如,我编写了一个脚本,该脚本使phpBB3文章中的链接在新选项卡(默认皮肤)中打开:

    /==UserScript==
    //@name phpBB3中的新选项卡
    //@名称空间http://robert.walkertribe.com/
    //@description使phpBB3板中帖子中的链接打开新选项卡。
    //==/UserScript==
    var newWin=功能(ev){
    var win=window.open(ev.target.href);
    if(win)ev.preventDefault();
    };
    var links=document.evaluate(
    “//div[@class='content']//a[非(@onclick)和非(@href='#')]”,
    文档,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
    对于(var i=0;i
    代码中使用的XPath表达式标识了所有
    a
    元素,这些元素1)没有
    onclick
    属性,2)其
    href
    属性未设置为
    “#”
    ,3)位于
    div
    中,其
    属性设置为
    “content”
    脚本头值,(@name、@description、@version等)可以进行检索。这比在脚本的多个位置保持相同的常量值更可取


    请参见

    您的脚本可以通过数据URI将图形添加到页面中,即使您没有任何存放文件的位置

    例如,下面是一个小按钮图形:

    var button = document.createElement("img"); button.src = "data:image/gif;base64," + "R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yH5BAEAAAMALAAAAAAQABAAAAIhnI+pywOtwINHTmpvy3rx" + "nnABlAUCKZkYoGItJZzUTCMFACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" somenode.appendChild(button); var按钮=document.createElement(“img”); button.src=“数据:image/gif;base64,” +“R0lGODlhEAAQAKEDAAAA/wAAAMzMzP///yh5baeaaamalaaaaqaaaaaaaihni+pywOtwINHTmpvy3rx” +“nnablauckzkygitjzzutcmfach+h09wdgltaxplzcbiesbvbgvhzcbtbwfydfynhdmvyiqaow=” appendChild(按钮); 这是一个在线的例子


    一种有用的XPath技术是指定与已找到的节点相关的匹配项。作为stackoverflow的人为示例:

    // first we got the username link at the top of the page var hdrdiv = document.evaluate( "//div[@id='headerlinks']/a[1]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; // now we can retrieve text that follows it, (user's reputation score) // (note that hdrdiv is now the contextNode argument, rather than document) var reptext = document.evaluate( "following-sibling::span", hdrdiv, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; alert("Reputation Score: " + reptext.textContent); //首先,我们在页面顶部找到了用户名链接 var hdrdiv=document.evaluate( //div[@id='headerlinks']/a[1],文档,空, XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null); //现在我们可以检索它后面的文本(用户的声誉分数) //(注意,hdrdiv现在是contextNode参数,而不是document) var reptext=document.evaluate( “以下同级::span”,hdrdiv,null, XPathResult.FIRST\u ORDERED\u NODE\u TYPE,null); 警报(“声誉分数:+reptext.textContent”); 您可以在相对于contextNode、祖先、后代、上一代、下一代的任何方向上进行匹配。 这里有一个有用的例子
    .

    GreaseMonkey脚本在DOM就绪时运行,因此您不需要添加onload事件,只需在GreaseMonkey脚本中立即开始操作DOM。

    GM_setValue通常只存储32位整数、字符串和布尔值,但您可以利用uneval()方法(以及稍后检索时的eval()方法)存储任何对象。如果您处理的是纯JSON值(而不是JavaScript对象),请使用JSON.stringify进行存储,使用JSON.parse进行检索;这将更快、更安全

    ==UserScript==
    ...
    @require http://ajax.googleapis.com/ajax/framework-of-your/choice.js
    ==/UserScript==
    
    var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true};
    GM_setValue('myVeryOwnFoo',uneval(foo));
    var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()'));
    GM_log('People: '+fooReborn.people+'   Pie:'+fooReborn.pie);
    

    在本例中,我倾向于使用“new Object()”作为默认值,但您也可以使用“({})”。请记住“{}”作为字符串计算,而不是对象。像往常一样,小心地使用eval()。

    过时:Firefox放弃了对E4X的支持,在Greasemonkey脚本中,FF版本17。使用
    gmu info
    获取元数据


    您可以使用e4x作为变量访问==用户脚本==信息:

    var metadata=<> 
    // ==UserScript==
    // @name           search greasemonkey
    // @namespace      foo
    // @include        http://*.google.com/*
    // @include        http://*.google.ca/*
    // @include        http://search.*.com/*
    // @include        http://*.yahoo.com/*
    // ==/UserScript==
    </>.toString();
    
    var元数据=
    //==用户脚本==
    //@name search greasemonkey
    //@foo
    //@include http://*.google.com/*
    //@include http://*.google.ca/*
    //@包括http://search.*网站/*
    //@include http://*.yahoo.com/*
    //==/UserScript==
    .toString();
    
    还有10个问题被标记为隐藏特性。这真的是一个隐藏特性还是鲜为人知的特性?这是Greasemonkey的API文档的一部分,它本身非常小。同意这本身不是隐藏的。但它属于惯用语范畴。是的,GM的API真的不是
    var foo={people:['Bob','George','Smith','Grognak the Destroyer'],pie:true};
    GM_setValue('myVeryOwnFoo',uneval(foo));
    var fooReborn=eval(GM_getValue('myVeryOwnFoo','new Object()'));
    GM_log('People: '+fooReborn.people+'   Pie:'+fooReborn.pie);
    
    var metadata=<> 
    // ==UserScript==
    // @name           search greasemonkey
    // @namespace      foo
    // @include        http://*.google.com/*
    // @include        http://*.google.ca/*
    // @include        http://search.*.com/*
    // @include        http://*.yahoo.com/*
    // ==/UserScript==
    </>.toString();