jquery - 在 li 标签中的元素之后插入 html
问题描述
如果 li 元素有子元素但似乎没有任何效果,我正在尝试在 a 标记之后插入 html。下面是我的代码:
$(function() {
$("li ul").hide();
$("li").each(function() {
var kids = $(this).children("ul").length;
if (kids > 0) {
$('<span class="">SUB</span>').insertAfter(this.closest('a'));
}
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
</head>
<body>
<ul>
<li><a href="#">Coffee</a></li>
<li><a href="#">Tea</a>
<ul>
<li><a href="#">Black tea</a></li>
<li><a href="#">Green tea</a></li>
</ul>
</li>
<li><a href="#">Milk</a></li>
</ul>
</body>
</html>
解决方案
几个问题:
- 您
$("li").each
将访问所有li
元素,而不仅仅是顶级元素。也许这是一个问题,也许不是,但我想我会指出这一点。 this
在您的each
回调中将是原始li
DOM 元素,但您随后使用this.closest()
(存在于现代系统中)试图找到a
. 但是a
是后代,不是祖先。你自找的$(this).find()
在这里,我使用更具体的选择器解决了#1(如果需要寻址),并用于$(this).find(...)
#2:
$(function() {
$("li ul").hide();
$("body > ul > li").each(function() {
var kids = $(this).children("ul").length;
if (kids > 0) {
$('<span class="">SUB</span>').insertAfter($(this).find('a').first());
}
});
});
<ul>
<li><a href="#">Coffee</a></li>
<li><a href="#">Tea</a>
<ul>
<li><a href="#">Black tea</a></li>
<li><a href="#">Green tea</a></li>
</ul>
</li>
<li><a href="#">Milk</a></li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
(我还删除了不应出现在片段中的元素;有关详细信息,请参阅我对问题的评论。)
但是,使用 jQuery 的基于集合的 API,我们可以使代码更简单:
$(function() {
$("li ul").hide();
$("li > a + ul").before(
'<span class="">SUB</span>'
);
});
<ul>
<li><a href="#">Coffee</a></li>
<li><a href="#">Tea</a>
<ul>
<li><a href="#">Black tea</a></li>
<li><a href="#">Green tea</a></li>
</ul>
</li>
<li><a href="#">Milk</a></li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
当然,将它放在 和 之间的纯空格文本节点之后a
,ul
而您的代码将它放在纯空格文本节点之前。如果这很重要,我们可以使用.prev("a").after(...)
代替.before(...)
:
$(function() {
$("li ul").hide();
$("li > a + ul").prev("a").after(
'<span class="">SUB</span>'
);
});
<ul>
<li><a href="#">Coffee</a></li>
<li><a href="#">Tea</a>
<ul>
<li><a href="#">Black tea</a></li>
<li><a href="#">Green tea</a></li>
</ul>
</li>
<li><a href="#">Milk</a></li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
推荐阅读
- html - 单击按钮时如何显示隐藏图标并删除文本
- python - 基于df中的另一列使用python从teradata数据库中选择行
- r - 如何将使用 geom_label() 制作的标签的文本居中,其垂直位置已被 vjust 更改?(ggplot2 包)
- html - 如何防止 Swiper.js 放大 html 页面?
- spring-security - 使用 Spring Authorization Server 联合授权请求
- node.js - 如何使用节点获取
- oracle - Oracle Spatial 问题:可以使用来自另一个 Oracle 表的查询结果填充 SDO_ORDINATE_ARRAY 吗?
- sql-server - 将表从 SQL Server 传输到 Azure SQL 的最佳方式?
- scala - SBT 1.3.1 中的 OutOfMemoryError 元空间
- javascript - 如何在随机播放数组之前分配重要属性