Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将分隔符添加到按字母顺序排列的列表中_Javascript_Jquery_Html_Css - Fatal编程技术网

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,并附加/前置分隔符。这绝对是一个好的开始:)