GM.xmlHttpRequest : 无法理解 URL

GM.xmlHttpRequest : Could not understand the URL

我想为 Whosebug 尝试 ACQUA userscript,但出现错误:

Script error: 
Error: "GM.xmlHttpRequest : Could not understand the URL :
https://acqua.kmi.open.ac.uk/predict
TypeError: URL is not a constructor

我认为是"acqua.kmi.open.ac.uk",有很多子域。我该如何解决?

用户脚本代码:

// ==UserScript==
// @name          ACQUA: StackExchange best answer predictor
// @namespace     https://acqua.kmi.open.ac.uk/
// @description   G. Gkotsis, K. Stepanyan, C. Pedrinaci, J. Domingue, and M. Liakata. It's all in the Content: State of the art Best Answer Prediction based on Discretisation of Shallow Linguistic Features. In Proceedings of the 2014 ACM Conference on Web Science, WebSci '14, pages 202-210, New York, NY, USA, 2014. ACM.
// @require       http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @include       http*://*.stackexchange.com/questions/*
// @include       http*://whosebug.com/questions/*
// @include       http*://askubuntu.com/questions/*
// @include       http*://mathoverflow.net/questions/*
// @include       http*://serverfault.com/questions/*
// @include       http*://superuser.com/questions/*
// @updateURL     https://acqua.kmi.open.ac.uk/page/js/bestAnswer.user.js
// @version       1.4
// @run-at        document-end
// @grant         GM.xmlHttpRequest
// ==/UserScript==

// GM_getResourceURL 

URL = "https://acqua.kmi.open.ac.uk/predict"; //?URL=" + encodeURIComponent(document.URL);

GM.xmlHttpRequest({
     method: "GET",
     url: URL,
     onload: function(xhr) {
        id = "#answer-"+xhr.responseText;
        var num = parseInt(xhr.responseText) || 0;
        if (num==0){
            $("#header").append("<div style='display:-moz-inline-stack;display:inline-block;background:url(https://acqua.kmi.open.ac.uk/page/img/acqua-icon-white.png) 5px 8px no-repeat #9a3334;margin:-15px 0;font-size:medium;padding:12px 10px 6px 34px;color:#fff;zoom:1;*display:inline;'>Acqua: You need to <a href='https://acqua.kmi.open.ac.uk/authenticate' style='color:#fff;border-bottom:1px solid #fff;' target=='_new' title='Authenticate'>authenticate</a></div>");
        }
        else
            $("#header").append("<div style='display:-moz-inline-stack;display:inline-block;background:url(https://acqua.kmi.open.ac.uk/page/img/acqua-icon-white.png) 5px 8px no-repeat #003366;margin:-15px 0;font-size:medium;padding:12px 10px 6px 34px;color:#fff;zoom:1;*display:inline;'>Acqua is loaded</div>(<a href='#"+num+"'>jump to the answer</a>)");

            $(id).prepend( "<div style='display:block;text-align:right;padding:20px 15px 0 0'><a href='https://acqua.kmi.open.ac.uk' title='ACQUA' target='_blank'><img src='https://acqua.kmi.open.ac.uk/page/img/acqua-icon.png' alt='ACQUA icon'></a></div>");

            $(id).css({"border-color": "#1b75bb", 
                         "border-width":"5px", 
                         "border-style":"solid"});
            $(id).append("<span  style='background:url(https://acqua.kmi.open.ac.uk/page/img/acqua-icon-white.png) #1b75bb no-repeat 15px 0px;display:block;color:#fff;padding:5px 15px 5px 45px;float: right;' id='acquafeedback'>ACQUA: Did you find this useful? <a id='acquayes' style='background:#003366;margin-left:6px;padding:2px 2px;color:#fff'>Yes</a>&nbsp;&nbsp;&nbsp;&nbsp;<a id='acquano' style='background:#003366;margin-left:6px;padding:2px 2px;color:#fff'>No</a></span>");

            $('#acquayes').hover(function(){
                $(this).css('background','#9a3334');
                }, function(){$(this).css('background','#003366');}
                );

            $('#acquano').hover(function(){
                $(this).css('background','#9a3334');
                }, function(){$(this).css('background','#003366');}
                );

            $("#acquayes").click (function () {
                $.ajax({
                url: "https://acqua.kmi.open.ac.uk/feedback?answer=yes&id="+xhr.responseText,
                jsonp: "callback",
                dataType: "jsonp",
                data: {
                q: "",
                format: "json"
                },
                success: function( response ) {
                    ;
                }, error:function(response){$('#acquafeedback').html("Thank you!");}
                });

            });

            $("#acquano").click (function () {
                $.ajax({
                url: "https://acqua.kmi.open.ac.uk/feedback?answer=no&id="+xhr.responseText,
                jsonp: "callback",
                dataType: "jsonp",
                data: {
                q: "",
                format: "json"
                },
                success: function( response ) {
                    ;
                }, error:function(response){$('#acquafeedback').html("Thank you!");}
                });
            });


    }
});

I think it is "acqua.kmi.open.ac.uk", there is to many sub domain

根本不是问题。

URL是已有的JS接口名称,https://developer.mozilla.org/en-US/docs/Web/API/URL

给你的变量起个不同的名字。

URL 是一个 global built-in function in browsers

不要试图覆盖它。

一个快速而肮脏的 hack 就是使用不同的名称。

更好的解决方案是首先使用 IIFE 来避免创建新的全局变量。

(function () {
    var URL = "https://acqua.kmi.open.ac.uk/predict"; //?URL=" + 
    encodeURIComponent(document.URL);

    GM.xmlHttpRequest({
         method: "GET",
    // etc ...
)();