如何使用 Javascript 在列表 (ul) 中的现有项之间插入列表项 (li)
How to insert list items (li) between existing items in a list (ul) using Javascript
前段时间我写了一个转换,将数据从 xml 文件输出到 html。它有效,但它是一个非常混乱的代码,因为我不经常写 Javascript 我不知道我是如何得到这段代码的 运行.
到目前为止,此代码将 li-items(每个包含一个 link)插入到一个空的 ul-container 中,id="xmlMenuRight"。
新的情况是这个容器不再是空的。
将有 2 个硬编码项目。一个在第一个位置,另一个在最后一个位置。
此转换中的所有 li-items 都应插入现有的第一个和最后一个 li-item 之间。
我假设它将是 insertBefore 和 appendChild 的混合体。但我在这里迷路了,几乎和理解我自己的代码一样多。
非常感谢有关如何以最佳方式执行此操作的一些帮助和建议。
来自文件的输入:
<item>
<origin>name of a country or region</origin>
<sitemap>no</sitemap>
<link>/folder/2015-subFolder/filename.html</link>
<title>Dining Room</title>
</item>
(名为 origin 和 sitemap 的 2 个字段无关)。
在 xmlhttprequest
期间进行转换
var xmlhttp = "";
var xmlDoc = "";
function loadXMLDoc(dname) {
if (window.XMLHttpRequest)
{ xmlhttp=new XMLHttpRequest(); } // for IE7+, Firefox, Chrome, Opera, Safari
else
{ xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); } // for IE6
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
xmlDoc = xmlhttp.responseXML;
xmlDoc = xmlhttp.responseXML;
var inputList = xmlDoc.getElementsByTagName('item');
for (var i=0;i<inputList.length;i++) {
var x = document.createElement('li');
x.setAttribute('typeof',"ListItem");
x.setAttribute('property',"itemListElement");
x.className = 'side';
var y = document.createElement('meta');
y.setAttribute ('content',[i+1]);
y.setAttribute ('property',"position");
var lnk1 = document.createElement('a');
var lnk2 = getNodeValue(inputList[i],'link');
var lnk3 = getNodeValue(inputList[i],'title');
lnk1.setAttribute('href',lnk2);
lnk1.setAttribute('typeof',"WebPage");
lnk1.setAttribute('property',"item");
var ele3 = document.createElement('span');
ele3.setAttribute('property',"name");
ele3.innerHTML = lnk3;
var ele4 = lnk1.appendChild(ele3);
x.appendChild(lnk1);
x.appendChild(y);
document.getElementById('navigation2').appendChild(x);
}
}
}
xmlhttp.open('GET',dname,true); //asynchronous method
xmlhttp.send();
}
函数 getNodeValue(obj,tag)
{ return obj.getElementsByTagName(tag)[0].firstChild.nodeValue; }
每个 li-item 的当前输出:
<li class="side" property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="/folder/2015-subFolder/filename.html"><span property="name">Dining Room</span></a><meta property="position" content="1"></li>
预期的新列表:
<ul id="xmlMenuRight">
<li>first item is hard coded</li>
...
inserts from transformation above go here (the amount of li-items varies)
...
<li>last item is also hard coded</li>
</ul>
您可以删除最后一项并在添加动态内容后重新添加。
这是硬编码的:
<ul id="xmlMenuRight">
<li>first item is hard coded</li>
<li>last item is also hard coded</li>
</ul>
这是 JS:
var liElems = document.getElementById('xmlMenuRight').getElementsByTagName('li');
var lastChild = liElems[liElems.length-1];
document.getElementById('xmlMenuRight').removeChild(lastChild);
for (var i=0;i<inputList.length;i++) {
// your code
document.getElementById('xmlMenuRight').appendChild(x);
}
document.getElementById('xmlMenuRight').appendChild(lastChild);
注意:使用 lastChild 属性 可能会很棘手,因为它可能会将空格视为
的最后一个子元素。这就是为什么我没有在示例中使用它。
前段时间我写了一个转换,将数据从 xml 文件输出到 html。它有效,但它是一个非常混乱的代码,因为我不经常写 Javascript 我不知道我是如何得到这段代码的 运行.
到目前为止,此代码将 li-items(每个包含一个 link)插入到一个空的 ul-container 中,id="xmlMenuRight"。
新的情况是这个容器不再是空的。 将有 2 个硬编码项目。一个在第一个位置,另一个在最后一个位置。
此转换中的所有 li-items 都应插入现有的第一个和最后一个 li-item 之间。
我假设它将是 insertBefore 和 appendChild 的混合体。但我在这里迷路了,几乎和理解我自己的代码一样多。 非常感谢有关如何以最佳方式执行此操作的一些帮助和建议。
来自文件的输入:
<item>
<origin>name of a country or region</origin>
<sitemap>no</sitemap>
<link>/folder/2015-subFolder/filename.html</link>
<title>Dining Room</title>
</item>
(名为 origin 和 sitemap 的 2 个字段无关)。
在 xmlhttprequest
期间进行转换var xmlhttp = "";
var xmlDoc = "";
function loadXMLDoc(dname) {
if (window.XMLHttpRequest)
{ xmlhttp=new XMLHttpRequest(); } // for IE7+, Firefox, Chrome, Opera, Safari
else
{ xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); } // for IE6
xmlhttp.onreadystatechange=function() {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
xmlDoc = xmlhttp.responseXML;
xmlDoc = xmlhttp.responseXML;
var inputList = xmlDoc.getElementsByTagName('item');
for (var i=0;i<inputList.length;i++) {
var x = document.createElement('li');
x.setAttribute('typeof',"ListItem");
x.setAttribute('property',"itemListElement");
x.className = 'side';
var y = document.createElement('meta');
y.setAttribute ('content',[i+1]);
y.setAttribute ('property',"position");
var lnk1 = document.createElement('a');
var lnk2 = getNodeValue(inputList[i],'link');
var lnk3 = getNodeValue(inputList[i],'title');
lnk1.setAttribute('href',lnk2);
lnk1.setAttribute('typeof',"WebPage");
lnk1.setAttribute('property',"item");
var ele3 = document.createElement('span');
ele3.setAttribute('property',"name");
ele3.innerHTML = lnk3;
var ele4 = lnk1.appendChild(ele3);
x.appendChild(lnk1);
x.appendChild(y);
document.getElementById('navigation2').appendChild(x);
}
}
}
xmlhttp.open('GET',dname,true); //asynchronous method
xmlhttp.send();
}
函数 getNodeValue(obj,tag)
{ return obj.getElementsByTagName(tag)[0].firstChild.nodeValue; }
每个 li-item 的当前输出:
<li class="side" property="itemListElement" typeof="ListItem"><a property="item" typeof="WebPage" href="/folder/2015-subFolder/filename.html"><span property="name">Dining Room</span></a><meta property="position" content="1"></li>
预期的新列表:
<ul id="xmlMenuRight">
<li>first item is hard coded</li>
...
inserts from transformation above go here (the amount of li-items varies)
...
<li>last item is also hard coded</li>
</ul>
您可以删除最后一项并在添加动态内容后重新添加。
这是硬编码的:
<ul id="xmlMenuRight">
<li>first item is hard coded</li>
<li>last item is also hard coded</li>
</ul>
这是 JS:
var liElems = document.getElementById('xmlMenuRight').getElementsByTagName('li');
var lastChild = liElems[liElems.length-1];
document.getElementById('xmlMenuRight').removeChild(lastChild);
for (var i=0;i<inputList.length;i++) {
// your code
document.getElementById('xmlMenuRight').appendChild(x);
}
document.getElementById('xmlMenuRight').appendChild(lastChild);
注意:使用 lastChild 属性 可能会很棘手,因为它可能会将空格视为
- 的最后一个子元素。这就是为什么我没有在示例中使用它。