如何在绕过<b>和<i>时获取第一个文本节点

how to get first text node while bypassing <b> and <i>?

本文关键字:获取 节点 文本 第一个      更新时间:2023-09-26

我想从字符串中获取第一个文本节点,但它可能包含很少的标签,如 <b>,<i><span> 。我已经尝试过这样,但它只给了login,而它应该给login<b>user</b> account

var s = $.trim('login<b>user</b> account<tbody> <tr> <td class="translated">Lorem ipsum dummy text</td></tr><tr><td class="translated">This is a new paragraph</td></tr><tr><td class="translated"><b>Email</b></td></tr><tr><td><i>This is yet another text</i></td> </tr></tbody>');
if( $(s).find('*').andSelf().not('b,i').length > 1 ) {
   if( s.substring( 0, s.indexOf('<') ) != '') {
        alert(s.substring(0, s.indexOf('<')));
    } else {
        alert($(s).find('*:not(:empty)').first().text());
    }
}

在JSFIDDLE上检查它

注意:

字符串将是动态的,因此请编写不特定于此文本的通用答案。

更多信息 :

@Jeremy J 斯塔彻!我只想点击 iframe 的第一个非空文本节点。此节点将包括<b> or <i>以及它们之间的任何内容,如下所示:

hi my <b>bold</b> text is here // note the bold tags as it is

如果只单击一个元素,则抛出其文本,但如果选择了一个以上的元素,则它必须获取所有节点中的第一个文本节点。

一种蛮力方法,但您可以取出您希望在第一个节点中出现的所有标签,并读取直到下一个标签的开头,如下所示:

text = text.replace("<b>"," ");
text = text.replace("</b>"," ");
text = text.replace("<i>"," ");
text = text.replace("</i>"," ");
text = text.replace("<span>"," ");
text = text.replace("</span>"," ");
text = text.substr(0, text.indexOf("<"));
我没有

完全遵循这个问题,但是如果您尝试从DOM元素中提取文本,这可能会有所帮助:

  var getText = function (el) {
    var ret;
    var txt = [],
      i = 0;
    if (!el) {
      ret = "";
    } else if (el.nodeType === 3) {
      // No problem if it's a text node
      ret = el.nodeValue;
    } else {
      // If there is more to it, then let's gather it all.
      while (el.childNodes[i]) {
        txt[txt.length] = getText(el.childNodes[i]);
        i++;
      }
      // return the array as a string
      ret = txt.join("");
    }
    return ret;
  };