如何确定是否在父元素的开始或结束存在文本?HTML DOM &JavaScript
How to determine if there exists text at the beginning or end of a parent element? HTML DOM & JavaScript
假设我们有一个嵌套的span:
<span><span></span></span>
我们想知道文本是否存在
<span> here <span> </span></span>
或
<span><span></span> here</span>
假设我们有对父元素节点的引用。
请注意
<span> text <span> text </span> text </span>
或
<span> text <span> text </span></span>
应该不会比
更难node.firstChild && node.firstChild.nodeType === Node.TEXT_NODE ||
node.lastChild && node.lastChild.nodeType === Node.TEXT_NODE
为了可读性,最好使用Node.*_NODE
符号常量(尽管它们可能在较旧的浏览器中没有定义)。
为避免空文本节点的问题,可以在此之前加上
node.normalize()
将指定的节点及其所有子树放入"规范化"的的形式。在规范化子树中,子树中没有文本节点是空的并且没有相邻的文本节点。
见https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize。
省略注释节点和纯空白文本节点:
var children = Array.prototype.filter.call(node.childNodes || [], function(node) {
return node.nodeType !== Node.COMMENT_NODE &&
(node.nodeType !== Node.TEXT_NODE || /'S/.test(node.nodeValue));
}),
firstChild = children[0],
lastChild = children[children.length-1];
return firstChild && firstChild.nodeType === Node.TEXT_NODE ||
lastChild && lastChild.nodeType === Node.TEXT_NODE;
如果出于某种原因需要检查其中是否存在子元素,那么为
添加一个检查就足够了!!node.children.length
因此,使用@weeklyTea回答中的一些概念,我将三个函数组合在一起,为所提出的问题提供答案。
我认为重要的是要指出,我们总是有一个嵌套的元素节点。而且我们"不确定"在元素节点的两侧是否有文本节点。当它像这样放置时,我认为这些函数将相当直接:
function isNestedHighlightAtEnd(parent) {
var childNodes = parent.childNodes;
var childNodesLength = childNodes.length;
if( childNodes[childNodesLength-1].nodeType != 3 ) {
return true;
}
else {
return false;
}
}
function isNestedHighlightAtMiddle(parent) {
if( !isNestedHighlightAtBeg( parent ) && !isNestedHighlightAtEnd( parent )) {
return true;
}
else {
return false;
}
}
function isNestedHighlightAtBeg(parent) {
var childNodes = parent.childNodes;
var childNodesLength = childNodes.length;
if( childNodes[0].nodeType != 3) {
return true;
}
else {
return false;
}
}
不确定这是最好的方法,但这是我首先想到的解决方案:
HTML:<span id="span1">
thththt
<span id="span2"></span>
</span>
JS:
var span = document.getElementById('span1');
var spanChilds = span.childNodes;
var textIndex = -1;
for(var i = 0; i < spanChilds.length; ++i){
debugger;
if(spanChilds[i].nodeType == 3){
textIndex = i;
break;
}
}
var nestSpan = document.getElementById('span2');
var nestSpanIndex = Array.prototype.indexOf.call(span.childNodes, nestSpan);
if(nestSpanIndex > textIndex){
alert('text first')
}else{
alert('span first')
}
jsFiddle示例
相关文章:
- JavaScript-如果以前不存在文本,如何从文本区域删除新行
- 使用jQuery重置文本,同时存在AJAX调用
- 基本 Jquery - 如果 TD 中存在文本,则使 DIV 可见
- 检查输入/文本区域中粘贴的文本是否存在无效的章程
- 如何将新输入的文本包装到下面已经存在的span标记中
- onblur文本框生成电子邮件已存在于数据库中的警报
- Safari存在文本输入问题,用户输入时会选择文本,导致文本丢失
- 正在检查url的页面源中是否存在文本
- 检查是否存在基于jQuery 1.7中文本的选择选项
- 检查任何输入或文本区域中是否存在非法字符
- 如果存在多个现有值,则向文本区域值添加分隔符 (Javascript)
- 如果文本框 1、文本框 2、文本框 3 中存在值,如何启用单选按钮 1 和文本框 4
- jQuery 在文本路径 svg 元素方面存在问题
- 当页面上存在特定文本字符串时发送 Google Analytics(分析)事件
- 必须使用 d3 库将文本高度保存在 d 中
- 填写表单文本框,其中包含数据库表中的数据(如果用户存在)
- 检查数据库中是否存在电子邮件文本框值
- 在不使用数据库的情况下将突出显示的文本保存在 Chrome 扩展程序中
- jQuery选择复选框时,文本存在,隐藏未选中的行从打印
- Javascript改变一个网站's图标,如果某些文本存在