- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个按字母顺序返回列表的脚本,如下所示
<div id="x">
<ul>
<li>Apple
<li>Banana
<li>Blackberry
<li>Blueberry
<li>Cherry
<li>Cranberry
</ul>
</div>
但是列表中有很多项目(将近 100 个),我希望将它们重新排列如下
<div id="x">
<span id="A">A</span>
<ul>
<li>Apple
</ul>
<span id="B">B</span>
<ul>
<li>Banana
<li>Blackberry
<li>Blueberry
</ul>
<span id="C">C</span>
<ul>
<li>Cherry
<li>Cranberry
</ul>
<div>
顺便说一句,我并不是真的在分拣水果,这只是一个例子。
它必须是那种形式,出于无关紧要的原因,我只需要帮助创建和附加 span 元素和各个列表。我尝试过使用内部/外部 HTML,但发现它真的很难。我目前有这样的东西:
function getAllLists()
{
var page = document.getElementById("x")
var allLists = page.getElementsByTagName("li");
var num = allLists.length;
//Some form of a for counter loop here
for (var counter = 0; counter < num; counter++) {
var first=allLists[counter].outerHTML;
var second=allLists[counter+1].outerHTML;
var firstletter= (allLists[counter].substring(0, 1)).toUpperCase();
var secondletter= (allLists[counter+1].substring(0, 1)).toUpperCase();
allLists[counter].outerHTML = '<span id="'+firstletter+'">'+firstletter+'</span>'+first;
}
}
请避免使用 JQUERY。
我怎么强调都不过分!!
不仅我觉得很难理解,因为我还是一个 javascript 的业余爱好者,发现 js 已经够难了,jquery 的语法就像是愚蠢地难以理解。
我确信无需使用 jquery 就可以实现我的目标。
有任何想法吗?非常感谢所有帮助/评论/想法。
非常感谢。
最佳答案
首先忘记使用 inner/outerHTML 操作 DOM。它们对于插入 HTML block 或文档部分很方便,但绝对不适合一般的 DOM 操作。
使用 DOM 方法。
首先,将所有 LI 元素加载到一个数组中。然后使用排序函数对它们进行排序。然后将它们放回包含在 UL 元素中的 DOM 中,并在每次第一个字母发生变化时用 span 分隔。
这是一个完成这项工作的函数。它对 lIs 进行排序,不确定是否真的需要。如果没有,函数会变得简单很多。
<script type="text/javascript">
// Simple helper
function getText(el) {
if (typeof el.textContent == 'string') {
return el.textContent.replace(/^\s+|\s+$/g,'');
}
if (typeof el.innerText == 'string') {
return el.innerText.replace(/^\s+|\s+$/g,'');
}
}
function sortLIs(id) {
// Get the element
var el = document.getElementById(id);
// Get the UL element that will be replaced
var sourceUl = el.getElementsByTagName('ul')[0];
// Get the LIs and put them into an array for sorting
var nodes = sourceUl.getElementsByTagName('li');
var li, lis = [];
for (var i=0, iLen=nodes.length; i<iLen; i++) {
lis[i] = nodes[i];
}
// Sort them
lis.sort(function(a, b) {
return getText(a) > getText(b)? 1 : -1;
});
// Now put them into the document in different ULs separated
// by spans.
// Create some temporary elements for cloning
var ul, ulo = document.createElement('ul');
var sp, spo = document.createElement('span');
var frag = document.createDocumentFragment(); // fragments are handy
var firstChar, currentChar;
// For each LI in the array...
for (i=0; i<iLen; i++) {
li = lis[i];
firstChar = getText(li).substr(0,1) || '';
// If first char doesn't match current, create a new span
// and UL for LIs
if (firstChar !== currentChar) {
currentChar = firstChar;
// New span
sp = spo.cloneNode(false);
sp.appendChild(document.createTextNode(firstChar.toUpperCase()));
sp.id = firstChar;
frag.appendChild(sp);
// New UL
ul = ulo.cloneNode(false);
frag.appendChild(ul);
}
// Add the li to the current ul
ul.appendChild(li);
}
// Replace the UL in the document with the fragment
el.replaceChild(frag, sourceUl);
}
</script>
<div id="x">
<ul>
<li>Cherry
<li>Banana
<li>Apple
<li>Blueberry
<li>Cranberry
<li>Blackberry
</ul>
</div>
<button onclick="sortLIs('x');">Sort</button>
请注意,LI 只是移动到文档片段,并且原始 UL 被多个元素替换。我打乱了 LI 以表明排序有效。
如果您将数组作为文本,则:
var fruits = ['Cherry','Banana','Apple','Blueberry',
'Cranberry','Blackberry'].sort();
function insertFruits(id) {
var el = document.getElementById(id);
// Check that the above worked
if (!el) return;
var frag = document.createDocumentFragment();
var li, lio = document.createElement('li');
var ul, ulo = document.createElement('ul');
var sp, spo = document.createElement('span');
var firstChar, currentChar;
for (var i=0, iLen=fruits.length; i<iLen; i++) {
fruit = fruits[i];
firstChar = fruit.substr(0,1).toUpperCase();
if (firstChar !== currentChar) {
currentChar = firstChar;
sp = spo.cloneNode(false);
sp.appendChild(document.createTextNode(firstChar));
sp.id = firstChar;
frag.appendChild(sp);
ul = ulo.cloneNode(false);
frag.appendChild(ul);
}
li = lio.cloneNode(false);
li.appendChild(document.createTextNode(fruit));
ul.appendChild(li);
}
el.appendChild(frag);
}
关于javascript - 创建并附加一个元素,innerHTML?恐怖... [请不要使用 jquery],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8290513/
我编写了一个程序,它在已安装的 USB 设备上创建一个文件。这可以通过 RS232 连接使用基于文本的 UI 来完成。然而,似乎有些不对劲。 5 次中有 1 次,写入 USB 设备的整个过程失败,我得
我知道我在这里做错了,但我希望你能在这方面提供帮助 我有这个html代码 some text this is what I would like to grab some more text 所
我想使用 Google Places API,但我一直收到 Request_Denied。我进入了 Google API 控制台,打开了 google places API。我的代码是这样的:
我的css边距不符合我想要或期望的方式。我好像我的页眉页边距顶部影响周围的div标签。 这就是我想要和期望的: ...但这就是我的最终结果: 资源: Margin test body {
我的css边距不符合我想要或期望的方式。我好像我的页眉页边距顶部影响周围的div标签。 这就是我想要和期望的: ...但这就是我的最终结果: 资源: Margin test body {
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 2 年前。 我的 CSS 边距没有按照我想要或期望的方
我有一个按字母顺序返回列表的脚本,如下所示 Apple Banana Blackberry Blueberry
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 3 年前。
这个问题在这里已经有了答案: Why does this CSS margin-top style not work? (14 个答案) 关闭 2 年前。 我的 CSS 边距没有按照我想要或期望的方
我还看到了其他一些解决这个主题的问题,但没有一个像我的。昨天我天真地在设备列表中添加了一个设备。 问题: 我的印象是,一旦您添加了设备,它就会链接到配置文件。但是,我相信它没有链接到我的分发配置文件之
我是一名优秀的程序员,十分优秀!