1

我正在编写一个 Greasemonkey 脚本来更改 google.com 的顶级域。

完整的代码如下。在开发工具中测试我的代码,它确实显示了选择框和按钮。但是,当我单击按钮时,页面刚刚重新加载,并没有切换语言站点。

// ==UserScript==
// @name       GoogleFieldExpress
// @namespace  http://example.gg/
// @version    1.0
// @description  to change field from database
// @match      http://www.google.*/
// @match      https:/www.google.*/
// @copyright  2013,Matthew
// ==/UserScript==

//database domains and varibles
var domains=new Array;
domains=["gg","jp"];
var current="";
if (typeof this.href === "undefined") {
    current = document.location.toString().toLowerCase();
}
else {
   current = this.href.toString().toLowerCase();
}
var inner='\
    <center>\
    <strong>\
        Choose field below: <br />\
    </strong>\
    <form id="choose" >\
    <select id="select_item">'
for (var i = 0; i < domains.length; i++) {
    inner+='<option value="'+domains[i]+'"\\>'+domains[i]+'</option>';
};


inner+='</select>\
    <button id="goto2">go!</button>\
    </form>\
    </center>\
'

//functions
function getLanguageElement(){
    var lang=document.getElementById("als");
    return lang;
}
function appendHTML(element,html){
    element.innerHTML+=html;
}
//main process
(function(){
appendHTML(getLanguageElement(),inner);
document.getElementById("goto2").addEventListener("click",function(){windows.location=new String('www.google.')+(document.getElementById("select_item").value)},false);
})();


我是新手,对这些真的很生气。如何重定向到正确的域以及我的代码有什么问题?

我想从www.google.com跳转到www.google.ggwww.google.jp等等。

PS“als”元素是这句话“Google.gg提供的:语言”的容器

4

1 回答 1

1

几个问题:

  1. http://www.google.*/并且https:/www.google.*/是 的无效值@match。利用:

    // @include    http://www.google.*/
    // @include    https://www.google.*/
    
  2. jp似乎是一个无效的域。谷歌似乎使用co.jp.

  3. windows不是有效的对象或变量。

  4. 通过使用默认类型的 a<form>和 a <button>,单击“开始!” 实际提交表单!这会覆盖尝试设置位置 URL。

  5. 设置时需要协议(http: 等)location.

  6. 不要this在用户脚本的全局范围内使用。 this会因浏览器、沙箱状态、可能的 iframe 状态等而显着变化。this仅在您确定它所指的内容时才使用内部函数。

  7. 该脚本需要进行错误检查,因为搜索的节点不会出现在大多数 Google 页面上。

还有几个小问题——我会跳过,因为 Stack Overflow 并不是一个真正的代码审查网站。只需查看下面的工作脚本,并注意它与问题脚本的不同之处。

// ==UserScript==
// @name       GoogleFieldExpress
// @namespace  http://example.gg/
// @version    1.0
// @description  to change field from database
// @include    http://www.google.*/
// @include    https://www.google.*/
// ==/UserScript==
//database domains and variables
var domains = ["gg", "co.jp"];
var current = location.host;  // or location.href. Case-sensitive for a reason
var inner   = '\
    <center>\
    <strong>\
        Choose field below: <br />\
    </strong>\
    <form id="gmChoose">\
    <select id="gmSelect_item">'
;

domains.forEach ( function (item) {
    inner  += '<option value="' + item + '"\\>' + item + '</option>';
} );

inner      += '</select>\
    <button id="gmGoto2" type="button">go!</button>\
    </form>\
    </center>\
';

//main code
var lang = document.getElementById ("als");
if (lang) {
    lang.innerHTML += inner;

    document.getElementById ("gmGoto2").addEventListener ("click", function () {
        location.assign (
            location.protocol + '\/\/www.google.'
            + document.getElementById ("gmSelect_item").value
            + '\/'
        );
    }, false);
}
于 2013-05-04T03:17:00.947 回答