我有以下内容:
<ul id="list">
<li>item1
<ul>
<li>sub1</li>
<li>sub2</li>
</ul>
</li>
</ul>
我想回复点击事件,并在其他地方使用li的文字。但是,如果点击是在包含嵌套ul的li上,我当然会得到所有元素的文本。
$("#list li").click(function() {
alert($(this).text());
});
按预期返回item1sub1sub2。
如果单击项目1 li,我无法弄清楚如何获得'item1'。我尝试了以下(除其他事项外)没有运气:
$("#list li").click(function() {
alert($(this).filter("ul").text());
});
有什么想法吗?
修改
这是一个例子的片段 - 它可能是多层深度。我也不想在列表或其他标记中包装列表项文本。
答案 0 :(得分:14)
这种方法怎么样?克隆对象,删除克隆的子项,然后查找文本内容。
$("#list li").click(function () {
alert($(this).clone().children().remove().end().text());
}
也许不是最有效的方法,但它完全直观,非常整洁,你不必捣乱你的HTML。
答案 1 :(得分:9)
普通DOM方法只允许访问一个元素的文本内容,而不是jquery:
$("#list li").click(function() {
alert($(this)[0].firstChild.textContent)
});
在这种情况下,firstChild是li元素
下面的textNode答案 2 :(得分:7)
你很难,因为text()
做了它应该做的事情 - 返回这个和所有子元素的文本。最简单的方法是为每个<li>
添加另一个标记,并使用此标记
例如:
<ul id="list">
<li><span>item1</span>
<ul>
<li><span>sub1</span></li>
<li><span>sub2</span></li>
</</ul>
</li>
</ul>
然后你有一个简单的选择器:
$("#list li").click(function() {
alert($(this).find("span").eq(0).text());
});
或者,如果可能(取决于您的风格),您可以将事件添加到范围:
$("#list span").click(function() {
alert($(this).text());
});
如果您无法添加这些<span>
(如您所说),您可以使用jQuery的.contents()
为您添加它们,类似于此处所做的:
答案 3 :(得分:1)
这将检查列表项是否包含任何子项,如果是,则仅筛选出文本节点并连接结果(在这种情况下,它将适用于文本元素,无论它们放在li中)。如果您只想在开始时检查元素,可以避免使用for循环,只需使用this.firstChild
$("#list li").click(function(e) {
if ($(this).children().length > 0) {
var text = "";
for (var i = 0; i < this.childNodes.length; i++) {
var node = this.childNodes[i];
if (node.nodeType === 3 && $.trim(node.nodeValue).length > 0) {
text += $.trim(node.nodeValue);
}
}
alert(text);
}
else {
alert($(this).text());
}
e.stopPropagation();
});
答案 4 :(得分:0)
因此,这个机制从子元素中提取html,替换没有任何内容的换行符,然后只将字符串返回到第一个“<
”字符。我还添加了event.stopPropagation
以避免将click事件调用到父级。
<script type="text/javascript">
$("#list li").click(function(event) {
var sourceHTML = $(this).html().replace(/\n/g,'').replace(/<.*/,'');
alert(sourceHTML);
event.stopPropagation();
});
</script>
答案 5 :(得分:0)
我认为你需要使用每种方法。所以请尝试以下脚本:
$(document).ready(function() {
$('ul').each(function() {
$(this).find('li').click(function() {
var listItem = this;
alert($(listItem).text());
});
})
});
使用以下标记
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
答案 6 :(得分:0)
实现相同的另一种方式
$("#list li").click(function() {
alert($(this).contents().not('ul,ol').text());
});