Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环GM_xmlhttpRequest给出;TypeError Null";关于变量_Javascript_Greasemonkey_Typeerror_Gm Xmlhttprequest - Fatal编程技术网

Javascript 循环GM_xmlhttpRequest给出;TypeError Null";关于变量

Javascript 循环GM_xmlhttpRequest给出;TypeError Null";关于变量,javascript,greasemonkey,typeerror,gm-xmlhttprequest,Javascript,Greasemonkey,Typeerror,Gm Xmlhttprequest,我在一个页面中有一些链接。我想计算每个链接的响应,并在链接前面插入数字。以下是我所拥有的: var links = document.evaluate('..../td[1]/font//a[@href]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var headings = document.evaluate('.../td[1]',document, null, XPathResult.ORDERED_N

我在一个页面中有一些链接。我想计算每个链接的响应,并在链接前面插入数字。以下是我所拥有的:

var links = document.evaluate('..../td[1]/font//a[@href]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var headings = document.evaluate('.../td[1]',document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
for(var i = 0; i < links.snapshotLength; i++){
  var urls = links.snapshotItem(i).href;
  GM_xmlhttpRequest({
    method: 'GET',
    url: urls,
    onload function (res){
      var dt = document.implementation.createDocumentType("html", 
          "-//W3C//DTD HTML 4.01 Transitional//EN", "http://www.w3.org/TR/html4/loose.dtd");
          doc = document.implementation.createDocument('', '', dt);
          html = doc.createElement('html');
          html.innerHTML = res.responseText;
          doc.appendChild(html);
      var responses = doc.evaluate('.../tr', doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
      var nResponse = responses.snapshotLength - 1;
      var numResponse = document.createElement('font');
      numResponse.innerHTML = 
       '<b>' + nResponse +
       '</b>' ;
      headings.snapshotItem(i).parentNode.insertBefore(numResponse, headings.snapshotItem(i));
    }
  });
}
var links=document.evaluate('../td[1]/font//a[@href]',document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
var headers=document.evaluate(“…/td[1]”,document,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null)
对于(var i=0;i
我得到了错误信息:

TypeError:标题。snapshotItem(…)为空


至少有3个问题:

  • 正在尝试在不关闭的情况下将值传递给
    GM_xmlhttpRequest
    的onload
  • 链接上循环
    ,但尝试索引
    标题
  • onload
    属性后缺少冒号
  • (1)
    GM_xmlhttpRequest
    异步运行。这意味着当
    onload
    触发时,变量
    i
    标题
    要么未定义,要么是它们的最终值,而不是您想要的循环值

    要将值传递给
    onload
    ,请使用。(在下面的代码中,
    parseURL
    提供了闭包。)

    (2) 变量
    i
    链接上循环,但代码试图使用它来索引
    标题
    !每一个都不太可能有相同的数量(即使有,也不太可能有糟糕的做法)。“标题”是否始终是链接的父级?如果是这样的话,就用这个

    将它们放在一起,使用如下代码:

    var links = document.evaluate (
        '..../td[1]/font//a[@href]', document, null, 
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
    );
    //-- "Headings" are relative to links
    
    for (var J = links.snapshotLength - 1;  J >= 0;  --J) {
        var targUrl = links.snapshotItem (J).href;
        parseURL (targUrl, J);
    }
    
    function parseURL (targUrl, J) {
        GM_xmlhttpRequest ( {
            method: 'GET',
            url:    targUrl,
            onload: function (res) {
                var dt = document.implementation.createDocumentType (
                    "html", "-//W3C//DTD HTML 4.01 Transitional//EN", 
                    "http://www.w3.org/TR/html4/loose.dtd"
                );
                var doc         = document.implementation.createDocument ('', '', dt);
                var html        = doc.createElement ('html');
                html.innerHTML  = res.responseText;
                doc.appendChild (html);
    
                var responses = doc.evaluate (
                    '.../tr', doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null
                );
                var nResponse = responses.snapshotLength - 1;
                var numResponse = document.createElement ('font');
                numResponse.innerHTML = '<b>' + nResponse + '</b>';
    
                var heading     = links.snapshotItem (J).parentNode.parentNode;
                heading.parentNode.insertBefore (numResponse, heading);
            }
        } );
    }
    
    var links=document.evaluate(
    “..../td[1]/font//a[@href]”,文档,空,
    XPathResult.ORDERED\u节点\u快照\u类型,null
    );
    //--“标题”是相对于链接的
    对于(var J=links.snapshotLength-1;J>=0;--J){
    var targUrl=links.snapshotItem(J).href;
    parseURL(targeturl,J);
    }
    函数parseURL(targetURL,J){
    GMxmlHttpRequest({
    方法:“GET”,
    url:targetURL,
    onload:函数(res){
    var dt=document.implementation.createDocumentType(
    “html”、“-//W3C//DTD HTML4.01//EN”,
    "http://www.w3.org/TR/html4/loose.dtd"
    );
    var doc=document.implementation.createDocument(“”,,,dt);
    var html=doc.createElement('html');
    html.innerHTML=res.responseText;
    doc.appendChild(html);
    var响应=doc.evaluate(
    “…/tr”,doc,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null
    );
    var nResponse=responses.snapshotLength-1;
    var numResponse=document.createElement('font');
    numResponse.innerHTML=''+nResponse+'';
    var heading=links.snapshotItem(J).parentNode.parentNode;
    heading.parentNode.insertBefore(numResponse,heading);
    }
    } );
    }
    
    在我将这些数字添加到页面后,还有一个问题。页面加载速度非常慢。是否有加快速度的方法?“在文档开始时运行”可以在加载页面之前执行代码,但我在文档结束时仍有一些东西要运行。您可能需要打开一个新问题。一般情况下:确保不在同步模式下使用GM_xmlhttpRequest(默认情况下为关闭);确保你没有不必要地在iFrame中运行;限制已处理的链接;窗口加载后启动脚本;不要在AJAX结果上使用XPath。