使用带有 JavaScript 的离散标记检查元素是不是已关闭

Posted

技术标签:

【中文标题】使用带有 JavaScript 的离散标记检查元素是不是已关闭【英文标题】:Check if an element is closed using a discrete tag with JavaScript使用带有 JavaScript 的离散标记检查元素是否已关闭 【发布时间】:2014-03-29 13:30:39 【问题描述】:

我正在获取 en 元素的子节点,并且我想检查标签是否实际上可以包含文本。例如:

<br />, <img />

应该返回 false 和

<span></span>, <div></div>, <li></li>

应该返回真。谢谢!

【问题讨论】:

&lt;video&gt; 怎么样(可以包含文本,但只能作为替代内容,以防视频失败)? (html 中还有其他具有类似规则的元素)。 任何可以包含任何形式或方式文本的元素, 你可以检查是否el.childNodes.length &gt; 0,但是DOM中的空元素和自闭元素一般没有区别 【参考方案1】:

使用它:

canContainText: function(node) 
    if(node.nodeType === 3)
        return true;
    
    if(node.nodeType === 1)
        return /<[^>]+><\/[^>]+>/gi.test(document.createElement(node.nodeName.toLowerCase())).outerHTML;
    

【讨论】:

【参考方案2】:

以下脚本工作正常(跨浏览器问题已解决):

function containTxt(tag) 
    var tags = /^(img|video)$/i; // any values which will be in `tags` set will be treated as they can't have a text value
    return !tags.test(tag);


console.log(containTxt("img")); // returns false
console.log(containTxt("div")); // returns true

【讨论】:

这有助于检查标签是否真的包含文本,但如果它可以包含文本则不行。还是谢谢!【参考方案3】:

不幸的是,没有办法检测代码是如何编写标签的,因为当 javascript 运行时,HTML 代码已经被解析为 DOM 对象。

但是,您的问题似乎更多是关于特定元素类型是否可以包含文本。这个简单的测试将为您提供每种元素类型的答案:

function canElementContainText(tagname) 
    try 
        var e = document.createElement(tagname);
        return e.outerHTML.indexOf("/") != -1;
     catch (ex) 
        return false;
    

例如canElementContainText("div") 返回truecanElementContainText("img") 返回false

然后您可以将任何元素的tagName 属性传递给此函数以对其进行测试。

var result = canElementContainText(myElement.tagName);

【讨论】:

不要使用innerText,试试appendChild(document.createTextNode(...) 我现在正在尝试,但 Firefox 允许您将任何内容附加到 &lt;img&gt; 替换为在 Firefox、Chrome 和 IE11 中测试的跨浏览器兼容方法。测试于jsfiddle.net/alancnet/tdBf3 尽管如此,更新后的脚本不适用于每个 html 标签,例如video,strong...! 在这一点上,我想问一下您要解决什么问题?也许有更好的方法来解决它?例如,您可以创建一个已经有答案的对象: div: true; img: false, video: false, span: true, ... ... 或者您可以使用这样的对象来增加错误的方法...【参考方案4】:

可以使用正则表达式:

// these are samples, get elements text using element.innerHTML;
var one = "<a href='something'>Links</a>";
var two = "Lorem ipsum dolor";

function check(str)
    return str.match(/<[a-zA-Z]+.*>(.|\n)*<\/[a-zA-Z]+>/) ? true : false;


console.log(check(one)); // true
console.log(check(two)); // false

【讨论】:

你检查一个标签是否真的包含html。这不是操作要求的

以上是关于使用带有 JavaScript 的离散标记检查元素是不是已关闭的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中打印元素异步推送到它的数组?

如何检查 DOM 中所有 div 的类名是不是具有带有 vanilla Javascript 的特定字符串?

带有多个标记的javascript googlemaps没有使用cordova应用程序在android中显示标记

离散数学--集合论

使用Javascript将带有HTML标记的字符串分开

如何使用 Xpath、css 或 Selenium 中的任何其他定位器在 html 中的结束标记后查找带有“== $0”的元素