首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Userscript停止使用@grant并在没有@grant的情况下导致问题

Userscript停止使用@grant并在没有@grant的情况下导致问题
EN

Stack Overflow用户
提问于 2015-08-18 20:31:19
回答 1查看 406关注 0票数 0

我已经为geocaching.com写了一个用户脚本,如果英语是由外部应用程序设置的,它会自动将语言切换到指定的语言(德语)。

它运行良好,直到大约10天前,没有任何原因,我无法想象。

如果我从脚本中删除@grant,它将再次工作,但会导致页面的其余部分出现几个问题。

我尝试过的任何@grant,包括none,都会破坏脚本。

它仍然可以在Chrome中正常工作。但是我已经听说了,Tampermonkey和Chrome和Firefox上的Greasemonkey有一点不同。

任何我可以尝试的想法都是非常受欢迎的。脚本如下:

代码语言:javascript
复制
// ==UserScript==
// @name     c:geo LangFix Deutsch BETA
// @include  https://www.geocaching.com/*/*/*
// @include  https://www.geocaching.com/*/*
// @include  https://www.geocaching.com/*
// @include  https://www.geocaching.com
// @include  http://www.geocaching.com/*/*/*
// @include  http://www.geocaching.com/*/*
// @include  http://www.geocaching.com/*
// @include  http://www.geocaching.com
// @exclude  http://www.geocaching.com/account/messagecenter
// @exclude  https://www.geocaching.com/map/*
// @exclude  https://www.geocaching.com/map
// @version  1.2
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @grant    GM_xmlhttpRequest
// ==/UserScript==

var TargetLink          = $('a[href*="LocaleList$ctl04$uxLocaleItem"]');
var LanguageSwitch      = $("div.LocaleText:contains('Choose Language')");

if (TargetLink.length && LanguageSwitch.length)
    window.location.assign (TargetLink[0].href);
EN

回答 1

Stack Overflow用户

发布于 2015-08-19 11:31:53

主要的问题是,脚本试图分配的href**实际上是一个函数。**即:

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

许多浏览器仍然允许你向location.assign()传递一个Firefox,但是javascript:最近限制了这种做法。(参见GM bug 2232Firefox bug 1192821等)在沙箱中尤其如此(将@grant设置为none以外的值)。

更好的做法是使用,如下所示。

该脚本的其他小问题:

  1. @include是重叠的、冗余的,并且可能会拖累性能。下面的@match语句应该是all you need.
  2. Likewise,the language s can be geocaching.com pages使用不同结构的语言更改机制。我添加了一个额外的选择器来捕获一个额外的方案。(至少还有一个更罕见的方案,它不会被像LocaleList$ctl04$uxLocaleItem这样的script.)
  3. Selector组件捕获,它非常脆弱,很容易随心所欲地改变。在某些情况下,站点加载了许多iframe,这会导致某些帧上出现jQuery错误,因此尽量避免出现这些错误。使用@noframes来阻止它并加快速度。

考虑到所有这些,这个完整的脚本应该比旧的脚本更适合您:

代码语言:javascript
复制
// ==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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32072520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档