循环GM_xmlhttpRequest在变量上给出“TypeError Null”

时间:2013-07-02 20:10:35

标签: 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_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));
    }
  });
}

我收到了错误消息:

  

TypeError:headings.snapshotItem(...)为null

1 个答案:

答案 0 :(得分:3)

至少有3个问题:

  1. 尝试在没有闭包的情况下将值传递给GM_xmlhttpRequest的onload。
  2. 循环播放links,但尝试索引headings
  3. onload属性后缺少冒号。
  4. (1)GM_xmlhttpRequest以异步方式运行。这意味着,当onload触发变量iheadings时,变量onloadparseURL将是未定义的或将是它们的最终值,而不是您想要的循环值。

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

    (2)变量headingsvar 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); } } ); } 上循环,但代码正试图用它来索引{{1}}!不太可能每个都有相同的数量(而且即使有,也有不良做法)。 “标题”始终是链接的父级吗?如果是这样的话。

    全部放在一起,使用这样的代码:

    {{1}}