【问题标题】:Looping GM_xmlhttpRequest gives "TypeError Null" on a variable循环 GM_xmlhttpRequest 在变量上给出“TypeError Null”
【发布时间】:2013-06-30 08:58:29
【问题描述】:

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

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(...) is null

【问题讨论】:

    标签: javascript greasemonkey typeerror gm-xmlhttprequest


    【解决方案1】:

    至少有3个问题:

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

    (1) GM_xmlhttpRequest 异步操作。这意味着当onload 触发时,变量iheadings 要么是未定义的,要么是它们的最终值,而不是你想要的循环值。

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

    (2) 变量ilinks 上循环,但代码试图使用它来索引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);
            }
        } );
    }
    

    【讨论】:

    • 还有一个问题,在我将这些数字添加到页面后。页面加载很慢。有没有办法加快速度? run-at document-start 可以在页面加载之前执行代码,但我还有一些东西要在 document-end 运行。
    • 您可能需要打开一个新问题。一般来说:确保不要在同步模式下使用 GM_xmlhttpRequest(默认关闭);确保您没有不必要地在 iframe 中运行;限制已处理的链接;窗口加载后启动脚本;不要在 AJAX 结果上使用 XPath。
    猜你喜欢
    • 2023-03-31
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多