如何在包含粗体和斜体标签的同时获取字符串的第一个文本节点?

时间:2013-01-24 07:10:48

标签: javascript jquery

  1. 字符串是动态的
  2. 当用户点击dom中的任意位置时,它来自onclick事件
  3. 如果字符串的第一部分是:

    login<b>user</b>account

  4. 包含在这样的元素中:

    <div>login<b>user</b>account</div>”,

    然后我可以得到它:

    alert($(s).find('*').andSelf().not('b,i').not(':empty').first().html());
    // result is : login<b>user</b>account
    

    但是当它没有包含在任何元素中时,如何在这种情况下得到相同的结果.i.e。什么时候没有包含在任何元素中?

    我尝试了以下代码,当第一部分不包含任何<b></b>时,它可以正常工作,但只有当它包含这些标记时才会提供“登录”

     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.substring(0, s.indexOf('<')) != ''){
           alert(s.substring(0, s.indexOf('<')));
        }
    

    注意: 建议一个通用的解决方案,不仅仅针对上面的字符串。它应该适用于有粗体标签和没有任何标签的情况。

3 个答案:

答案 0 :(得分:4)

所以它只是bi,嘿?

递归函数总是可行的。而这一次,这可能是最好的方式。

var s = function getEm(elem) {
    var ret = ''

    // TextNode? Great!
    if (elem.nodeType === 3) {
        ret += elem.nodeValue;
    }

    else if (elem.nodeType === 1 &&
        (elem.nodeName === 'B' || elem.nodeName === 'I')) {

        // Element? And it's a B or an I? Get his kids!
        ret += getEm(elem.firstChild);
    }

    // Ain't nobody got time fo' empty stuff.
    if (elem.nextSibling) {
        ret += getEm(elem.nextSibling);
    }

    return ret;
}(elem);

Jsfiddle证明了这一点:http://jsfiddle.net/Ralt/TZKsP/

PS:使用正则表达式或自定义标记生成器解析HTML很糟糕,不应该这样做。

答案 1 :(得分:1)

您尝试将所有文​​本检索到第一个不是<b><i>的元素,但此文本可以包含在元素本身中。这太酷了。我觉得有更好的方法来实现你想要完成的任何事情,但这是一个有效的解决方案。

function initialText(s){
  var test  = s.match(/(<.+?>)?.*?<(?!(b|\/|i))/);

  var match = test[0];
  var prefixed_element = test[1];

  // if the string was prefixed with an element tag
  // remove it (ie '<div> blah blah blah')
  if(prefixed_element) match = match.slice(prefixed_element.length);

  // remove the matching < and return the string
  return match.slice(0,-1);
}

你很幸运我发现这个问题很有趣且具有挑战性,因为这又是荒谬的。

欢迎你; - )

答案 2 :(得分:0)

试试这个:

if (s.substring(0, s.indexOf('<')) != '') {
  alert(s.substring(0, s.indexOf('<tbody>')));
}