1

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

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));
    }
  });
}

我收到错误消息:

类型错误:headings.snapshotItem(...) 为空

4

1 回答 1

3

至少有3个问题:

  1. 试图在没有闭包的情况下将值传递给GM_xmlhttpRequest's onload。
  2. 循环links,但试图索引headings
  3. 属性后缺少冒号onload

(1)GM_xmlhttpRequest异步操作。这意味着到时间onload触发变量i并且headings将是未定义的或者将是它们的最终值,而不是您想要的循环值。

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

(2) 变量i在循环links,但代码试图用它来索引headings!每个人都不太可能有相同的数量(即使有,也是不好的做法)。“标题”总是链接的父级吗?如果是这样使用它。

把它们放在一起,使用这样的代码:

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);
        }
    } );
}
于 2013-07-02T22:53:50.777 回答