Javascript 将分隔符添加到按字母顺序排列的列表中
我有一份按字母顺序排列的清单-Javascript 将分隔符添加到按字母顺序排列的列表中,javascript,jquery,html,css,Javascript,Jquery,Html,Css,我有一份按字母顺序排列的清单- <ul id="my-list"> <li>Afghanistan</li> <li>Albania</li> <li>Algeria</li> <li>Belgium</li> <li>Belize</li> <li>Brazil</li> <li>Canada<
<ul id="my-list">
<li>Afghanistan</li>
<li>Albania</li>
<li>Algeria</li>
<li>Belgium</li>
<li>Belize</li>
<li>Brazil</li>
<li>Canada</li>
<li>Chile</li>
<li>Columbia</li>
...
</ul>
- 阿富汗
- 阿尔巴尼亚
- 阿尔及利亚
- 比利时
- 伯利兹
- 巴西
- 加拿大
- 智利
- 哥伦比亚
...
我需要做的是在每个新字母开始处动态添加字母分隔符-
<ul id="my-list">
<div>A</div>
<li>Afghanistan</li>
<li>Albania</li>
<li>Algeria</li>
<div>B</div>
<li>Belgium</li>
<li>Belize</li>
<li>Brazil</li>
<div>C</div>
<li>Canada</li>
<li>Chile</li>
<li>Columbia</li>
<div>D</div>
...
</ul>
A.
- 阿富汗
- 阿尔巴尼亚
- 阿尔及利亚
B
- 比利时
- 伯利兹
- 巴西
C
- 加拿大
- 智利
- 哥伦比亚
D
...
这有可能吗?当然有可能。当然,你应该自己查找这些内容,但这里有一个可能的方法
const list=Array.from(document.querySelector(“#我的列表”).children;
list.forEach(i=>{
const letter=i.innerHTML.charAt(0);
if(!accountedFor(letter))i.insertAdjacentHTML('beforebeagin',`${letter}`);
});
职能会计(信函){
return document.querySelector(“#我的列表”).innerHTML.includes(`${letter}`);
}
- 阿富汗
- 阿尔巴尼亚
- 阿尔及利亚
- 比利时
- 伯利兹
- 巴西
- 加拿大
- 智利
- 哥伦比亚
当然,这是可能的。当然,你应该自己查找这些内容,但这里有一个可能的方法
const list=Array.from(document.querySelector(“#我的列表”).children;
list.forEach(i=>{
const letter=i.innerHTML.charAt(0);
if(!accountedFor(letter))i.insertAdjacentHTML('beforebeagin',`${letter}`);
});
职能会计(信函){
return document.querySelector(“#我的列表”).innerHTML.includes(`${letter}`);
}
- 阿富汗
- 阿尔巴尼亚
- 阿尔及利亚
- 比利时
- 伯利兹
- 巴西
- 加拿大
- 智利
- 哥伦比亚
如果您可以通过插入包含相同国家名称的数据-
属性稍微更改标记,例如
<ul id="countries">
<li data-country="Afghanistan">Afghanistan</li>
<li data-country="Albania">Albania</li>
<li data-country="Algeria">Algeria</li>
<li data-country="Belgium">Belgium</li>
<li data-country="Belize">Belize</li>
<li data-country="Brazil">Brazil</li>
<li data-country="Canada">Canada</li>
<li data-country="Chile">Chile</li>
</ul>
基本上,使用此解决方案,您可以为每个字母编写第一个数据country
属性,但由于字母间距巨大
和隐藏的溢出
,您只需显示国家名称的第一个字母
注意,如果您不能手动更改标记,那么您仍然可以使用这种方法,通过JS动态添加
数据国家
属性,如下所示
li:first-child:before,
[data-country^="A"] + :not([data-country^="A"]):before,
[data-country^="B"] + :not([data-country^="B"]):before,
...,
[data-country^="Y"] + :not([data-country^="Y"]):before {
content: attr(data-country);
display: block;
font-size: inherit;
margin-left: -1em;
overflow: hidden;
width: 2em;
letter-spacing: 100vw;
}
let countries = document.querySelectorAll('#countries li');
[...countries].forEach((country) => {
country.dataset.country = country.textContent;
});
如果您可以通过插入包含相同国家名称的
数据-
属性稍微更改标记,则没有无效或额外的标记,在最坏的情况下只有一点javascript
<ul id="countries">
<li data-country="Afghanistan">Afghanistan</li>
<li data-country="Albania">Albania</li>
<li data-country="Algeria">Algeria</li>
<li data-country="Belgium">Belgium</li>
<li data-country="Belize">Belize</li>
<li data-country="Brazil">Brazil</li>
<li data-country="Canada">Canada</li>
<li data-country="Chile">Chile</li>
</ul>
基本上,使用此解决方案,您可以为每个字母编写第一个数据country
属性,但由于字母间距巨大
和隐藏的溢出
,您只需显示国家名称的第一个字母
注意,如果您不能手动更改标记,那么您仍然可以使用这种方法,通过JS动态添加
数据国家
属性,如下所示
li:first-child:before,
[data-country^="A"] + :not([data-country^="A"]):before,
[data-country^="B"] + :not([data-country^="B"]):before,
...,
[data-country^="Y"] + :not([data-country^="Y"]):before {
content: attr(data-country);
display: block;
font-size: inherit;
margin-left: -1em;
overflow: hidden;
width: 2em;
letter-spacing: 100vw;
}
let countries = document.querySelectorAll('#countries li');
[...countries].forEach((country) => {
country.dataset.country = country.textContent;
});
没有无效的或额外的标记,在最坏的情况下只有一点javascript我用JQuery做了一个简单的解决方案。此代码将动态添加第一个字母。
见此:
JQuery
//取满
var item=$(“#我的列表”).find('li');
var currentLetter=“”;
//每一项
项目。每个功能(e,项目){
//e是索引
//项目是元素
var firstLetter=$(item.html().charAt(0);
//不多次添加标题的条件
if(currentLetter!==firstLetter){
$(“ ”+firstLetter+”
')。在($(项目))之前插入;
}
currentLetter=第一个字母;
});
您可以使用
.each()
函数。我在JQuery中提供了一个简单的解决方案。此代码将动态添加第一个字母。见此:
JQuery
//取满
var item=$(“#我的列表”).find('li');
var currentLetter=“”;
//每一项
项目。每个功能(e,项目){
//e是索引
//项目是元素
var firstLetter=$(item.html().charAt(0);
//不多次添加标题的条件
if(currentLetter!==firstLetter){
$(“ ”+firstLetter+”
')。在($(项目))之前插入;
}
currentLetter=第一个字母;
});
您可以使用
.each()
函数。希望您至少尝试自己编写此函数。我建议你做一些,或者通过谷歌,或者通过搜索,尝试一下。如果您仍然有问题,请返回您的代码并解释您尝试了什么。尽管您的HTML无效ul
不能将div作为孩子。要回答您的问题:是的,这是完全可能的。可能的,唯一剩下的事情是开始思考和编码。对于结构建议,这可能是有用的:。希望您至少尝试为自己编写此代码。我建议你做一些,或者通过谷歌,或者通过搜索,尝试一下。如果您仍然有问题,请返回您的代码并解释您尝试了什么。尽管您的HTML无效ul
不能将div作为孩子。要回答您的问题:是的,这是完全可能的。可能的,唯一剩下的事情是开始思考和编码。对于结构建议,这可能是有用的:。尽管:一次一个问题:^)谢谢@Darren。可以查看提取每个字母集到单个ul,并附加/前置分隔符。这绝对是一个好的开始:)尽管:一次解决一个问题:^)谢谢@Darren。可以查看提取每个字母集到单个ul,并附加/前置分隔符。这绝对是一个好的开始:)