1

在 Chrome 扩展程序中,我需要我的背景页面来检索 HTML 文档并查看该文档中出现在特定锚标记中的文本。锚标记没有 ID 属性,但可以通过其 href 内容来识别。为了与其余代码保持一致,我想通过从 XMLHttpRequest 的结果创建的文档对象来处理检索此信息。

我的问题是,当我在创建的 DOM 上调用 getElementsByTagName("a"),然后搜索结果元素的 href 属性时,只有具有绝对 URL 的标签才会返回有效的 href 值,而具有相对 URL 的标签返回空 href 值。我需要找到的锚标记是具有相对 URL 的标记之一。

这是重现错误的最简单形式的代码。有谁知道为什么会发生这种情况或如何编写修复程序,最好不要放弃 DOM 解析?

function lookfor(linkContents, inURL) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(data) {
        if (xhr.readyState == 4) {
            if (xhr.status == 200) {
                var doc = document.implementation.createHTMLDocument("");
                doc.documentElement.innerHTML = xhr.responseText;

                // Find Link in DOM of Document Created From HTTPRequest
                var found = -1;
                var links = doc.getElementsByTagName("a");
                console.log(links);
                for(var i = 0; i < links.length; i++) {
                    if (links[i].href) {
                        console.log(i + " " + links[i].href);
                        if (links[i].href.indexOf(linkContents) > -1) {
                            found = i;
                        }
                    }
                }
                if (found > -1) {
                    alert(links[found].innerHTML);
                }
            }
        }
    }
    xhr.open('GET', inURL, true);
    xhr.send();
}

[更新]

基于这个答案,我现在可以使用以下代码解决这个问题: How do I do OuterHTML in firefox?

function getHref(anchor) {
    var href =
        ((new XMLSerializer().serializeToString(anchor) || "")
            .match(/href=("[^"'<>\s]+"|'[^"'<>\s]+'|[^"'<>\s]+)/i) || [""])[0]
                .replace(/(href=|'|")/ig, "")
    ;
    if (href != "") return href;
}

有趣的是,它不适用于类型检查。不会产生 href 值的相同相对链接,也没有 typeof 'Anchor'

4

0 回答 0