Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.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在html页面中查找单词_Javascript_Html - Fatal编程技术网

使用javascript在html页面中查找单词

使用javascript在html页面中查找单词,javascript,html,Javascript,Html,如何在html页面中搜索单词fast? 我怎样才能得到这个单词所在的html标签呢?(因此我可以使用整个标记)您可以遍历DOM元素,在其中查找子字符串。既不快速也不优雅,但对于小型HTML来说可能已经足够好了 我会尝试一些递归的方法,比如:(未测试的代码) 要查找word所在的元素,您必须遍历整个树,只查看文本节点,应用与上面相同的测试。在文本节点中找到单词后,返回该节点的父节点 var word = "foo", queue = [document.body], curr ;

如何在html页面中搜索单词fast?
我怎样才能得到这个单词所在的html标签呢?(因此我可以使用整个标记)

您可以遍历DOM元素,在其中查找子字符串。既不快速也不优雅,但对于小型HTML来说可能已经足够好了

我会尝试一些递归的方法,比如:(未测试的代码)


要查找word所在的元素,您必须遍历整个树,只查看文本节点,应用与上面相同的测试。在文本节点中找到单词后,返回该节点的父节点

var word = "foo",
    queue = [document.body],
    curr
;
while (curr = queue.pop()) {
    if (!curr.textContent.match(word)) continue;
    for (var i = 0; i < curr.childNodes.length; ++i) {
        switch (curr.childNodes[i].nodeType) {
            case Node.TEXT_NODE : // 3
                if (curr.childNodes[i].textContent.match(word)) {
                    console.log("Found!");
                    console.log(curr);
                    // you might want to end your search here.
                }
                break;
            case Node.ELEMENT_NODE : // 1
                queue.push(curr.childNodes[i]);
                break;
        }
    }
}
var word=“foo”,
队列=[document.body],
咖喱
;
while(curr=queue.pop()){
如果(!curr.textContent.match(word))继续;
对于(变量i=0;i
这在Firefox中起作用,对IE没有承诺


它所做的是从body元素开始,检查该元素中是否存在单词。如果没有,那就是了,搜索就到此为止。如果它在body元素中,那么它将遍历body的所有直接子元素。如果它找到一个文本节点,则查看该单词是否在该文本节点中。如果它找到一个元素,则将其推入队列。继续,直到找到单词或没有更多元素可搜索。

您可以尝试使用XPath,它既快速又准确

另外,如果XPath稍微复杂一点,那么您可以尝试任何javascript库,比如jQuery,它隐藏样板代码并使您更容易表达您想要找到的内容


此外,从IE8和下一代Firefox3.5开始,还实现了选择器API。您所需要做的就是使用CSS来表示要搜索的内容。

您可能可以足够快地阅读文档树的主体并对其执行简单的字符串测试,而无需超出这一步-这有点取决于您使用的HTML-您对页面的控制程度如何?如果你在自己控制的网站中工作,你可能会把搜索重点放在页面中可能与页面不同的部分,如果你在处理其他人的页面,你手头的工作会更艰难,因为你不一定知道需要测试哪些内容

同样,如果您要多次搜索同一页,并且您的数据集很大,则可能值得在内存中创建某种索引,而如果您只搜索几个单词或使用较小的文档,则可能不值得花费时间和复杂性来构建索引

也许最好的办法是获取一些您认为具有代表性的示例文档,并根据这里提供的方法进行大量原型制作。

form.addEventListener(“提交”,(e)=>{
form.addEventListener("submit", (e) => {
e.preventDefault();
var keyword = document.getElementById("search_input");
let words = keyword.value;
var word = words,
    queue = [document.body],
    curr;
while (curr = queue.pop()) {
    if (!curr.textContent.toUpperCase().match(word.toUpperCase())) continue;
    for (var i = 0; i < curr.childNodes.length; ++i) {
        switch (curr.childNodes[i].nodeType) {
            case Node.TEXT_NODE: // 3
                if (curr.childNodes[i].textContent.toUpperCase().match(word.toUpperCase())) {
                    console.log("Found!");
                    console.log(curr);
                    curr.scrollIntoView();
                }
                break;
            case Node.ELEMENT_NODE: // 1
                queue.push(curr.childNodes[i]);
                break;
        }
    }
}
e、 预防默认值(); var关键字=document.getElementById(“搜索输入”); 让words=keyword.value; var单词=单词, 队列=[document.body], 咖喱; while(curr=queue.pop()){ 如果(!curr.textContent.toUpperCase().match(word.toUpperCase())继续; 对于(变量i=0;i

}))

innerText不包含任何标记名,只包含文本节点的值,因此您在那里很安全。请注意,@nickf:我想您忘记了在FF和其他一些浏览器中不支持innerText属性。在这些情况下,您可能希望将其替换为“textContent”。仍然,+1;-)是的,我在测试代码时发现了这一点。textContent的工作方式似乎与OP在HTML内容(而不是XML)中执行字符串搜索的方式相同。当前的浏览器都支持XPath,XPath主要是为DOM实现的
form.addEventListener("submit", (e) => {
e.preventDefault();
var keyword = document.getElementById("search_input");
let words = keyword.value;
var word = words,
    queue = [document.body],
    curr;
while (curr = queue.pop()) {
    if (!curr.textContent.toUpperCase().match(word.toUpperCase())) continue;
    for (var i = 0; i < curr.childNodes.length; ++i) {
        switch (curr.childNodes[i].nodeType) {
            case Node.TEXT_NODE: // 3
                if (curr.childNodes[i].textContent.toUpperCase().match(word.toUpperCase())) {
                    console.log("Found!");
                    console.log(curr);
                    curr.scrollIntoView();
                }
                break;
            case Node.ELEMENT_NODE: // 1
                queue.push(curr.childNodes[i]);
                break;
        }
    }
}