Javascript 有没有办法通过文本内容获取元素?

Javascript 有没有办法通过文本内容获取元素?,javascript,click,getelementbyid,tampermonkey,jquery,Javascript,Click,Getelementbyid,Tampermonkey,Jquery,我有一个问题,我已经被困了一段时间,很抱歉在论坛上发了一点垃圾邮件 有没有办法通过元素的文本内容来获取它?下面是一个例子: <span id="result_5_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Navy</span> 我知道这是不存在的,但这只是为了让你明白。此外,我不能按Id或类名使用,也不能更改元素的HTML代码,因此必须使用文本内容,我看不

我有一个问题,我已经被困了一段时间,很抱歉在论坛上发了一点垃圾邮件

有没有办法通过元素的文本内容来获取它?下面是一个例子:

<span id="result_5_name" class="market_listing_item_name" style="color: #FFD700;">Item | Anodized Navy</span>
我知道这是不存在的,但这只是为了让你明白。此外,我不能按Id或类名使用,也不能更改元素的HTML代码,因此必须使用文本内容,我看不到其他方法

我非常感谢任何反馈


谢谢

好吧,既然您将问题标记为,您可以使用选择器:

var item = $(':contains(Item | Anodized Navy)');
但是请注意,这将返回包含该文本的每个元素,包括
span
和span的所有父元素。如果只想获取最内部的元素(假设只有一个),只需获取最后一项,如下所示:

var item = $(':contains(Item | Anodized Navy)').last();
function getElementsByText(text) {
    var spans = document.getElementsByTagName('span'),
        results = [];
    for(var i = 0; i < spans.length; i++) {
        var content = spans[i].textContent || spans[i].innerText || '';
        if (content.indexOf(text) != -1)
            results.push(spans[i]);
    }
    return results;
}
var item = getElementsByText('Item | Anodized Navy');
function getelem() {
    var item = getElementsByText('Item | Anodized Navy');
    ...
}
要在不使用jQuery的情况下执行等效操作,必须实现如下函数:

var item = $(':contains(Item | Anodized Navy)').last();
function getElementsByText(text) {
    var spans = document.getElementsByTagName('span'),
        results = [];
    for(var i = 0; i < spans.length; i++) {
        var content = spans[i].textContent || spans[i].innerText || '';
        if (content.indexOf(text) != -1)
            results.push(spans[i]);
    }
    return results;
}
var item = getElementsByText('Item | Anodized Navy');
function getelem() {
    var item = getElementsByText('Item | Anodized Navy');
    ...
}
请注意,在您的代码中,
getelem
需要在函数名后加上
()
,如下所示:

var item = $(':contains(Item | Anodized Navy)').last();
function getElementsByText(text) {
    var spans = document.getElementsByTagName('span'),
        results = [];
    for(var i = 0; i < spans.length; i++) {
        var content = spans[i].textContent || spans[i].innerText || '';
        if (content.indexOf(text) != -1)
            results.push(spans[i]);
    }
    return results;
}
var item = getElementsByText('Item | Anodized Navy');
function getelem() {
    var item = getElementsByText('Item | Anodized Navy');
    ...
}

您只需使用Jquery的
:contains()

如果要选择包含文本“mytext”的所有跨距,请使用

如果我帮了你,请注明答案

谢谢:)

即使jQuery公开了
:contains
伪选择器,最好先使用类来限制结果:

$('.market_listing_item_name:contains("Item | Anodized Navy")')
缩小要搜索的初始标记集可以提高性能,否则将考虑所有标记;此外,重叠标记也会匹配

在更现代的浏览器上,你可以考虑这一点,基于:


你想要这样的吗

HTML

输出

[span#result_6_name.market_listing_item_name, span#result_9_name.market_listing_item_name]

附加1,如我们所述

附加2,正如我们所讨论的
getElementsByTagName('*')

函数getElementsByText(节点,文本){ var结果=[], tags=node.getElementsByTagName('*'), tagsLength=tags.length, tagsIndex, 当前标签, 子节点, 儿童节长度, ChildNodeIndex, 当前子节点; 对于(tagsIndex=0;tagsIndex

请注意,这些解决方案是相同的,但与此处给出的所有
包含的
解决方案不同。因为这些解决方案实际上会将具有匹配文本节点的节点作为子节点。我使用的简单标记并没有演示这一点,但是当标记高度嵌套时,您很快就会注意到区别


最后,这里是这三种解决方案中的一种。

也许我回答得晚了,但我没有看到用JQuery标记的问题,所以这里有一个纯JavaScript解决方案:

var myID = getElementsByTextContent('Item | Anodized Navy');

function getElementsByTextContent (elText){
    var spanID;
    var allSpans = document.getElementsByTagName("span"); 
    for (var i = 0; i < allSpans.length; i++) { 
        var spanText = allSpans[i].innerHTML;
        if(spanText == elText ){
            spanID = allSpans[i].id;
        }
    }
    return spanID;
}
var myID=getElementsByTextContent('Item |阳极氧化海军蓝');
函数getElementsByTextContent(elText){
var spanID;
var allspan=document.getElementsByTagName(“span”);
对于(var i=0;i
您需要获取文本节点的内容,并将其与所需字符串进行比较。然后你可以选择你想要的父节点。非常感谢你的评论,这是迄今为止最好的评论!但是,您知道没有jQuery的情况下有什么方法可以做到这一点吗?因为我认为tampermonkey支持jQuery,但它看起来不支持,所以我现在只能使用javascript,看起来是这样,除非我可以导入jQuery库或其他东西?非常感谢您的努力,我非常感谢!在给你最好的答案之前,我还有最后一个问题^^:我是否将(文本)替换为项目|阳极氧化海军蓝?我的意思是我是一个彻头彻尾的noob,所以我不清楚代码中的项目在哪里:)还有,点击它我指的是什么?是否使用跨距[0]。单击?再次感谢@user330404:不工作===最完整。。。无论如何,如果您在Firefox中进行测试,它将无法工作,因为FF不支持
.innerText
。根据您支持的浏览器,可以使用
span[i].textContent.indexOf(…
(span[i].textContent | span[i].innerText.indexOf)(…
@cookiemonster啊,谢谢。我已经忘记了。更新为更兼容跨浏览器。现在,如果span的
.textContent
是空字符串,它将使用
。innerText
,可能是
未定义的
:)如果发生这种情况,您需要
.textContent | | |.innerText | |'
。OP在稍后编辑问题以删除jquery标记:)为此,
document.getElementsByTagName('*')
将使代码更加简单。是的,我使用了非常简单(不是嵌套的)此演示的标记。我很高兴您能够演示?我本可以使用
treeWalker
,但此代码是跨浏览器的。使用
getElementsByTagName('*')
也是跨浏览器的:)我并不是说它不是。:)我并没有说你做到了:)我的观点是滚动你自己的遍历代码很少是必要的。