用户脚本停止使用@grant并导致没有@grant的问题

时间:2015-08-18 12:31:19

标签: greasemonkey

我已经为geocaching.com写了一个用户脚本,如果外部应用程序设置了英语,它会自动将语言切换为指定的语言(德语)。
它工作正常,直到大约10天前,我无法想象。

如果我从脚本中删除user_friends,它会再次起作用,但会导致页面其余部分出现多个问题。
我尝试的任何@grant(包括@grant)都会破坏脚本。

它仍然可以在Chrome中运行。但我已经听说过,Tampermonkey和Chrome与Firefox上的Greasemonkey略有不同。

任何我想试试的想法都非常受欢迎。 这是脚本:

none

1 个答案:

答案 0 :(得分:2)

主要问题是脚本试图分配的href实际上是一个javascript函数。那就是:

TargetLink[0].href的值为javascript:__doPostBack('ctl00$uxLocaleList$uxLocaleList$ctl04$uxLocaleItem','')

许多浏览器仍允许您将javascript:网址传递给location.assign(),但Firefox最近一直限制这种做法。 (请参阅GM bug 2232Firefox bug 1192821等。)在沙箱(@grant设置为none以外)时尤其如此。

更好的做法是click on such links by sending mouse event(s),见下文。

该脚本的其他小问题:

  1. @include重叠,冗余,可能会拖延性能。下面的@match语句应该是您所需要的。
  2. 同样,@exclude可以缩小。
  3. 某些geocaching.com页面使用不同的结构进行语言更改机制。我添加了一个额外的选择器来捕获另一个方案。 (至少有一个更罕见的方案没有被任何一个脚本捕获。)
  4. LocaleList$ctl04$uxLocaleItem这样的选择器组件非常脆弱,并且可能会随心所欲地改变。尽可能避免这些。
  5. 在某些情况下,该网站会加载许多iframe - 导致某些框架出现jQuery错误。使用@noframes阻止并加快速度。
  6. 考虑到所有这些,这个完整的脚本应该比旧的脚本更好地工作:

    // ==UserScript==
    // @name     c:geo LangFix Deutsch BETA
    // @match    *://www.geocaching.com/*
    // @exclude  http://www.geocaching.com/account/messagecenter
    // @exclude  https://www.geocaching.com/map/*
    // @version  2.0
    // @require  http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
    // @noframes
    // @grant    GM_xmlhttpRequest
    // ==/UserScript==
    
    var EnglishPageIndicator    = $(".selected-language > a:contains(English)");
    if (EnglishPageIndicator.length) {
        var GermanLnk   = $(
            ".language-selector > .language-list > ul > li > a:contains(Deutsch)," +
            ".LocaleList > .language-list > li > a:contains(Deutsch)"
        );
        //-- Don't try to assign a JS location!  Click the link instead.
        var clickEvent  = document.createEvent('MouseEvents');
        clickEvent.initEvent ("click", true, true);
        GermanLnk[0].dispatchEvent (clickEvent);
    }