获取不在另一个标签内的元素的 InnerHTML

Posted

技术标签:

【中文标题】获取不在另一个标签内的元素的 InnerHTML【英文标题】:Get InnerHTML of element that isnt inside another tag 【发布时间】:2014-12-03 04:24:22 【问题描述】:

如果我有

<div id="outside">
   Hello
   <div id="inside">
       Qwertyuiop
   </div>
</div>

如何在不包含内部任何内容或任何其他 html 标记的情况下获取外部的 InnerHTML? (基本上如何获得“Hello”)

【问题讨论】:

【参考方案1】:

1 一个有趣的选项:

这不是一个严肃的答案,并且基于Darin Morris' 高度破坏性的答案,但破坏性略小:

// Clone the element
var $clone = $("#outside").clone();

// Remove all the children (leaves text nodes)
$clone.children().remove();

alert($clone.text());

http://jsfiddle.net/TrueBlueAussie/ez4v83v5/4/

再次,我不会推荐这个作为替代说

2 我认真的回答:

$('#outside')[0].firstChild.nodeValue

但谁知道呢……这种技术在某些时候可能会派上用场 :)

【讨论】:

P.S.反对这个答案的人 a) 没有幽默感 b) 没有荒谬感:)【参考方案2】:

另一种选择:

$(function()
   var theHtml = $("#outside");
   var texto = theHtml[0].childNodes[0].data;
   alert((texto));
);

小提琴:

$(function() 
  var theHtml = $("#outside");
  var texto = theHtml[0].childNodes[0].data;
  alert((texto));
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="outside">
  Hello
  <div id="inside">
    Qwertyuiop
  </div>
</div>
<div id="test"></div>

【讨论】:

theHtml[0].firstChild.nodeValue 更短/更快。 我猜这个区别是一个非常微不足道的速度提升(因为它避免了一个数组索引操作),但我还是会在 shorter 方面犯错。 是的...它更短...但没有更快...有 1 毫秒或 2 毫秒之间的差异。【参考方案3】:

尝试在这种情况下使用.contents()

alert($("#outside").contents().first()[0].nodeValue);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="outside">
   Hello
   <div id="inside">
       Qwertyuiop
   </div>
</div>

【讨论】:

注意:first()[0] 是多余的。 $("#outside").contents()[0].nodeValue 做同样的事情:)【参考方案4】:

您正在尝试获取第一个孩子的价值,所以

alert($('#outside').prop('firstChild').nodeValue)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="outside">
   Hello
   <div id="inside">
       Qwertyuiop
   </div>
</div>

【讨论】:

对 HTML 元素属性使用 prop 是否更好(而不仅仅是 $('#outside')[0].firstChild.nodeValue) @TrueBlueAussie 我真的看不出有什么不同.. 除了使用.prop() 需要再次运行一些 jQuery 代码 好的。如果您没有偏好,也许只是避免prop 的开销呢? (如果没有孩子,要么会中断,所以 jQuery prop 并没有真正增加任何价值)。无论如何+1 :)【参考方案5】:
Array.prototype.filter.call(document.querySelector('#outside').childNodes, function (node) 
    return node.nodeValue;
);

你也可以在 Vanilla 中试试这个,如果你在 div 后面有其他字符串,它也会处理一个案例。

【讨论】:

【参考方案6】:

可能有更好的方法来做到这一点,但这应该适合你:

var kids = $("#outside").children();

for(var i = 0; i < kids.length; i++)

    if(kids[i].nodeType != 3)
    
        $(kids[i]).remove();
    


alert($("#outside").text());

查看这个 JSFiddle:http://jsfiddle.net/ez4v83v5/1

【讨论】:

不,实际上还不够好。该问题没有具体说明是否只有第一个文本节点是特别需要的,或者第一个文本节点是否是父节点的第一个子节点。我的解决方案解决了该问题并获取所有文本内容,而不管文本在父元素内容中的位置如何。对于它的价值, $("#outside").children().remove();应该可以,但它在 JSFiddle 中不起作用,所以我不推荐它。这可能是 JSFiddle 的错误... -1:不开玩笑,上面的代码在提取文本节点值的过程中破坏了DOM元素。它还使用了完全冗余的for 循环和if 检查children 不返回nodeType 的元素 3. 你得到与$("#outside").children().remove(); 相同的效果jsfiddle.net/TrueBlueAussie/ez4v83v5/5 基本上它不仅是破坏DOM,但也效率低下。 好的,没关系。我之所以说“它可能会做得更好”是有原因的...... ("#outside").children().remove();似乎可以在您的 JSFiddle 中使用。【参考方案7】:

试试jquery api children,试试fiddle

$(document).ready(function()
    alert($('#outside').clone()    //clone the element
    .children() //select all the children
    .remove()   //remove all the children
    .end()  //again go back to selected element
    .text());

);

希望对你有帮助……

【讨论】:

目的是获得Hello(这是一个文本节点,children() 不可见),而不是Qwertyuiop。对不起。

以上是关于获取不在另一个标签内的元素的 InnerHTML的主要内容,如果未能解决你的问题,请参考以下文章

jquery怎样点击某个元素后获得另一个元素里的链接并跳转

jQuery获取元素值以及设置元素值总结

python - 获取html标签内的所有子元素

Javascript算法在数组中查找不在另一个数组中的元素

如何在javascript中替换不在href标签内的URL

MySQL选择范围内的值,该值不在另一个范围内