Javascript 是否可以为已排序列表项的编号设置单击事件?

Javascript 是否可以为已排序列表项的编号设置单击事件?,javascript,html,onclick,html-lists,onclicklistener,Javascript,Html,Onclick,Html Lists,Onclicklistener,在HTML文档中,是否可以仅为有序列表中的列表项(li)或项目符号(ol)的编号设置单击事件 我希望能够点击号码,然后做一些处理。到目前为止,我有两个想法,但我希望有其他方法来处理正常有序的列表: 使用CSS计数器将数字注入我将放置在数字所在位置的元素中 绝对位置从关联列表项内部将透明元素置于数字上方 下面是列表的一个示例。我希望能够单击显示为1.、2.或3.的零件 HTML源代码: <ol> <li>First Item</li> <l

在HTML文档中,是否可以仅为有序列表中的列表项(
li
)或项目符号(
ol
)的编号设置单击事件

我希望能够点击号码,然后做一些处理。到目前为止,我有两个想法,但我希望有其他方法来处理正常有序的列表:

  • 使用CSS计数器将数字注入我将放置在数字所在位置的元素中
  • 绝对位置从关联列表项内部将透明元素置于数字上方
  • 下面是列表的一个示例。我希望能够单击显示为
    1.
    2.
    3.
    的零件

    HTML源代码:

    <ol>
        <li>First Item</li>
        <li>Second Item</li>
        <li>Third Item</li>
    </ol>
    
    1. First Item
    2. Second Item
    3. Third Item
    

    使用这个类,只需使用z-index就可以了

    .all {
        margin-left:-30px;
        padding-left: 30px;
    }
    
    对于RTL方向:

    .all {
        margin-right:-30px;
        padding-right: 30px;
    }
    

    i、 e:

    使用这个类,只需使用z-index,就可以了

    .all {
        margin-left:-30px;
        padding-left: 30px;
    }
    
    对于RTL方向:

    .all {
        margin-right:-30px;
        padding-right: 30px;
    }
    

    i、 e:

    应用@Fallexe建议,但在JS中添加跨距:

    [].slice.call (document.querySelectorAll ('ol, ul')).forEach (function (list) {
        for (var s, el = list.firstElementChild; el; el = el.nextElementSibling)
          el.innerHTML = '<span>' + el.innerHTML + '</span>';
    
        list.addEventListener ('click', function (ev) {
            if (ev.target.tagName !== 'SPAN')
              for (var el = this.firstElementChild; el; el = el.nextElementSibling)
                  el.className = el === ev.target ? 'selected' : '';
        }, false);    
    });
    
    [].slice.call(document.queryselectoral('ol,ul')).forEach(函数(列表){
    for(var s,el=list.firstElementChild;el;el=el.nextElementSibling)
    el.innerHTML=''+el.innerHTML+'';
    list.addEventListener('click',函数(ev){
    如果(ev.target.tagName!==“SPAN”)
    for(var el=this.firstElementChild;el;el=el.nextElementSibling)
    el.className=el==ev.target“已选定”:“;
    },假);
    });
    

    参见fiddle at

    应用@Fallexe建议,但在JS中添加跨距:

    [].slice.call (document.querySelectorAll ('ol, ul')).forEach (function (list) {
        for (var s, el = list.firstElementChild; el; el = el.nextElementSibling)
          el.innerHTML = '<span>' + el.innerHTML + '</span>';
    
        list.addEventListener ('click', function (ev) {
            if (ev.target.tagName !== 'SPAN')
              for (var el = this.firstElementChild; el; el = el.nextElementSibling)
                  el.className = el === ev.target ? 'selected' : '';
        }, false);    
    });
    
    [].slice.call(document.queryselectoral('ol,ul')).forEach(函数(列表){
    for(var s,el=list.firstElementChild;el;el=el.nextElementSibling)
    el.innerHTML=''+el.innerHTML+'';
    list.addEventListener('click',函数(ev){
    如果(ev.target.tagName!==“SPAN”)
    for(var el=this.firstElementChild;el;el=el.nextElementSibling)
    el.className=el==ev.target“已选定”:“;
    },假);
    });
    

    参见fiddle at

    您只能将事件分配给HTML/DOM元素,列表项前面的数字是该元素的一部分。因此,你的想法2可能是实现这一目标的唯一途径#3将为整个列表分配一个处理程序,并检查单击点…可能与哪个浏览器重复?在Chrome中,这个功能非常有效。请看@HBP,我只想在点击数字时触发点击,而不是整个
    li
    。我想我可以将所有内容包装在
    li
    中,并捕获/忽略单击事件,但我希望有一种简单的方法可以访问列表项的数字,但根据Teemu的说法,这似乎不可能。现在我倾向于选项2。对不起,我误解了你的问题,我将对其进行编辑以使其更清楚@那么Fellexe为您提供了正确的解决方案。我已经更新了我的fiddle来执行您要求的操作。您只能将事件分配给HTML/DOM元素,列表项前面的数字是该元素的一部分。因此,你的想法2可能是实现这一目标的唯一途径#3将为整个列表分配一个处理程序,并检查单击点…可能与哪个浏览器重复?在Chrome中,这个功能非常有效。请看@HBP,我只想在点击数字时触发点击,而不是整个
    li
    。我想我可以将所有内容包装在
    li
    中,并捕获/忽略单击事件,但我希望有一种简单的方法可以访问列表项的数字,但根据Teemu的说法,这似乎不可能。现在我倾向于选项2。对不起,我误解了你的问题,我将对其进行编辑以使其更清楚@那么Fellexe为您提供了正确的解决方案。我已经更新了我的提琴来完成你要求我做的事情。我对提琴做了一点小小的修改,以填充列表项的整个区域。很好,这就是它的全部内容。我对提琴做了一点小小的修改,以填充列表项的整个区域。很好,这就是它的全部内容。