1
  1. 字符串是动态的

  2. 它源于用户单击 dom 中的任何位置时的 onclick 事件

  3. 如果字符串的第一部分是:

    " login<b>user</b>account"

包含在这样的一些元素中:

" <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

但是,当它没有包含在任何元素中时,我怎样才能在这种情况下获得相同的结果。即,当它没有包含在任何元素中时?

我尝试了下面的代码,当第一部分不包含任何内容时它工作正常,但它只在包含这些标签时<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('<')));
    }

注意: 建议仅针对上述字符串不特定的通用解决方案。它应该适用于有粗体标签和没有粗体标签的两种情况。

4

3 回答 3

4

所以它只是 ab或 a i,呵呵?

递归函数总是要走的路。而这一次,这可能是最好的方法。

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 是不好的,不应该这样做。

于 2013-01-24T08:04:15.683 回答
1

您正在尝试检索所有文本,直到第一个不是 a 的元素<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);
}

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

别客气 ;-)

于 2013-01-24T07:18:10.327 回答
0

尝试这个:

if (s.substring(0, s.indexOf('<')) != '') {
  alert(s.substring(0, s.indexOf('<tbody>')));
}
于 2013-01-24T07:24:40.990 回答