以下代码被拆分并已减少,以表明我在将一个元素替换为另一个元素时遇到困难。在这种情况下,标题元素包含列表项。
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js" type="text/javascript"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.8/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function(){
var headingElements = $(':header').clone();
var listElements = $(headingElements).each(function(){
$(this).replaceWith($('<li></li>'));
});
//EDIT AFTER POSTED, FROM:
//$(".toc").append('<ul/>').appendTo(listElements);
//TO
$('<ul/>').append(listElements).appendTo(".toc");
});
</script>
</head>
<body>
<div class="toc"></div>
<h1>TOC</h1>
<h1>one</h1>
<h2>two</h2>
<h3>three</h3>
<h2>two</h2>
</body>
</html>
当前输出
我的期望
答案 0 :(得分:2)
由于您正在创建克隆,因此无需执行replaceWith
。只需创建具有相同内容的新元素:
示例: http://jsfiddle.net/xsU7S/1
var headingElements = $(':header');
var listElements = headingElements.map(function() {
return $('<li></li>',{html:this.innerHTML})[0];
});
$('<ul/>').append(listElements).appendTo(".toc");
您正在使用空header
元素替换每个克隆的<li>
元素。然后,您尝试使用.each()
的返回值,该值实际上仍然是对克隆的header
元素的引用。
最后,您实际上是将.toc
元素附加到listElements
(再次引用克隆的header
元素)。
答案 1 :(得分:1)
如果我明白你的意图是什么(我不确定我做了什么),我认为你在这里做了一些非常错误的事情。
var headingElements = $(':header').clone();
var listElements = $(headingElements).each(function()
{
$(this).replaceWith($('<li></li>'));
});
此处您将每个标题转换为空<li>
标记。
$(".toc").append('<ul/>').appendTo(listElements);
现在您将<ul>
添加到#toc
,然后尝试将#toc
添加到分离的空<li>
标记集中。
您应该回到jQuery的文档,并阅读每个函数的功能。