我有这样的HTML结构:
<tr>
<td class="CT">
anything –
<span class="cu">
<a href="#"></a>
</span> –
<span class="dt">content</span>
</td>
</tr>
现在我想从所有HTML代码中选择anything
。怎么样?我可以选择它的文字:
$('tr').text();
/* but the way, there is two function that I feel they can be useful:
1. closest()
2. siblings() */
嗯,有什么解决方案吗?
注意:我无法使用replace()
,因为有时<span>
的内容或<a>
的href会有不同的内容。
编辑: anything
不仅仅是一个字符串。它可以是以下之一:
anything
= this is a <a href="www.example.com">test</a>
anything
= hello, how are you
anything
= <a href="www.example.com">test1</a> and <a href="www.example.com">test2</a>
实际上我希望td.CT
的所有内容都在<span class="cu">
之后。实际上,它是评论的内容(用于编辑它),我想在textarea中设置它(再次,用于编辑它)。
答案 0 :(得分:2)
尝试使用contents().first().text()
,就像评论中提到的 @adeneo 一样:
$('#result').text( $(".CT").contents().first().text().trim().replace(/–$/, '') );
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr>
<td class="CT">
anything –
<span class="cu">
<a href="#"></a>
</span> –
<span class="dt">content</span>
</td>
</tr>
</table>
<hr>
Output (<span id='result'></span>)
希望这有帮助。
答案 1 :(得分:2)
这是一种(hacky)方法,可以在<span class="cu">
节点之前提取“任何东西”。
<span class="cu">
)都被推送到阵列上。$()
中包装节点数组以形成jQuery集合。var $myFragment = $($(".CT").contents().get().reduce(function(obj, node) {
if($(this).is("span.cu")) {
obj.stop = true;
}
if(!obj.stop) {
obj.nodes.push(node);
}
return obj;
}, {nodes:[], stop:false}).nodes);
// then
$("#myResult").append($myFragment);
// or maybe
//$("#myResult").append($myFragment.text());
我确信有一种更简单的方法,但我现在想不到它。
DEMOS:
这就是我谈论的那种简单方式:
var $myFragment = $(".CT").contents().filter(function(i, node) {
return !$(node).prevAll().addBack().filter("span.cu").length;
});
演示:http://jsfiddle.net/1xonqeob/4/
这里有更通用的东西;一个jQuery插件.prevAllNodes()
,其中:
[]
以查找所有nodeTypes。// *****************************************************
// A jQuery plugin to find DOM nodes of specified types
// before the first element in a jQuery collection.
// *****************************************************
$.fn.prevAllNodes = function(types) {
types = types || [];
if(!$.isArray(types)) types = [types];
var that = this.eq(0);
var nodes = that.parent().contents().get().reduce(function(nodes, node) {
nodes.stop = nodes.stop || (node == that.get(0));
return nodes.stop ? nodes : nodes.concat(node);
}, []).filter(function(node) {
return types.length == 0 || $.inArray(node.nodeType, types) > -1;
});
return $(nodes);
}
使用如下:
var $commentsNodes = $(".CT span.cu").prevAllNodes([Node.COMMENT_NODE]);
// $commentsNodes is a jQuery collection
// To read comments' text, you need to know to use the `.nodeValue` property. jQuery's $(commentNode).text() will not work.
DEMO:http://jsfiddle.net/1xonqeob/5/
$。fn.nextAllNodes()会非常相似
答案 2 :(得分:1)
这是我解决这个问题的方法。代码在span.cu
元素之前获取任何个节点(包括注释和文本)。
为了演示目的,我将目标元素移动到新的<div>
。
var tdContents = $('td.CT').contents();
var cu = $('span.cu');
var cuPosition;
// get the position of the span.cu element
tdContents.each(function(i, el) {
if (el == cu[0]) {
cuPosition = i;
}
});
// get rid of span.cu and following nodes
var result = tdContents.slice(0, cuPosition - 1);
// put the interesting content in another div
result.appendTo('#result');
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tbody>
<tr>
<td class="CT">
anything – <a style="color: red">(really)</a>
<span class="cu">
<a href="#"></a>
</span> –
<span class="dt">content</span>
</td>
</tr>
</tbody>
</table>
<div id="result"></div>
&#13;