2014-11-19 4 views
0

Я хотел бы знать, содержит ли элемент какой-либо текст напрямую. Прямо я имею в виду: не через своих детей.javascript - проверьте, содержит ли элемент непосредственно текст

<div id="case1"></div> 
<div id="case2">text-in-div</div> 
<div id="case3"> 
    <p>text-in-p</p> 
</div> 
<div id="case4"> 
    text-in-div 
    <p>text-in-p</p> 
</div> 
<div id="case5"> 
    <p>text-in-p</p> 
    text-in-div 
</div> 
<div id="case6"> 
    <p>text-in-p</p> 
    text-in-div 
    <p>text-in-p</p> 
</div> 

<script> 
    function containsTextDirectly(id) { 
     var element = document.getElementById(id); 
     //what comes here? 
    } 

    console.log(containsTextDirectly("case1")); //false 
    console.log(containsTextDirectly("case2")); //true 
    console.log(containsTextDirectly("case3")); //false 
    console.log(containsTextDirectly("case4")); //true 
    console.log(containsTextDirectly("case5")); //true 
    console.log(containsTextDirectly("case6")); //true 

</script> 

Очевидно, что я мог бы проверить это программно (убрать ребенок и посмотреть, если элементы пустеют ..), но я ищу для более оптимального (элегантного) решения.

ответ

4

Проверка текста узлов непосредственно под элементом:

return Array.prototype.some.call(element.childNodes, function(child) { 
    return child.nodeType === Node.TEXT_NODE; 
}) 

Если вы хотите, чтобы убедиться, что текстовые узлы не являются пустыми (чтобы дать «правильный» ответ на ваш Вопрос 3), то

return child.nodeType === Node.TEXT_NODE && /\S/.test(child.nodeValue); 

где /\S/.test проверяет наличие хотя бы одного символа без пробела.

0

если вы просто хотите «Any String» и хотите игнорировать все дочерние элементы? Ну, вот простое решение, использующее jQuery.

<script> 
    $("#foo") 
     .clone() //clone the element 
     .children() //select all the children 
     .remove() //remove all the children 
     .end() //again go back to selected element 
     .text(); //get the text of element 
</script> 

Мы клонировать элемент, который вы хотите текст, а затем удалить все дочерние элементы этого клонированного элемента, а затем возвращает текст элемента.

Смежные вопросы