- 主题:这段js该怎么写啊
用var定义的变量是函数范围内有效的,你的事件处理函数被执行时,闭包内的变量i等于lis.length,lis[i]等于undefined。
在for循环外把ul赋给一个变量,在事件处理函数里直接ul.insertBefore(e.target, ul.firstChild),应该就可以了。
或者更简单一点,把事件处理函数加在ul上。
var ul = document.querySelector('ul'); // 最好有个id
ul.addEventListener('click', function(e) {
if (e.target.nodeName === 'LI') {
ul.insertBefore(e.target, ul.firstChild);
e.stopPropagation();
}
}, false);
【 在 Splunk 的大作中提到: 】
: //实现功能:点击哪个 <li>就移动到第一个
: function setup() {
: var lis = document.querySelectorAll('ul li');
: ...................
--
修改:a9udn9u FROM 70.181.66.*
FROM 70.181.66.*
不是不能用i,只是i的值和你期待的不一样。
lis没有被重新赋值所以它一直是<ul>的引用。i在循环的每一个步骤都被重新赋值了,最后的值等于lis.length,所以当click事件发生的时候i还是等于lis.length,无论你点的是哪个<li>。
vscode有代码提醒的功能。
【 在 Splunk 的大作中提到: 】
: 我大概有点儿了解。 callback里面的i,要换成 ii..最后通过参数把i传递进去
: 我还有个问题,为什么lis变量,可以在里面使用,你看我代码console.log(lis)
:
--
修改:a9udn9u FROM 54.240.198.*
FROM 54.240.198.*
你这个跟他最初的代码是一样的,当事件处理函数被调用的时候,i已经变成lis.length了,把它的值赋给i0,i0也就等于lis.length。
不过他第二次的代码没有用到i,所以跑起来没问题,只是代码不算优化。
【 在 a0123456789q 的大作中提到: 】
: //本方案是错误的。请参加楼下的帖子
:
: function setup() {
: ...................
--
FROM 54.240.198.*
你的第二个实现功能上是可以的,只是有几个小问题。比如if (e.target.nodeName === 'LI')这个判断不需要了因为你的selector选出的就是<li>节点。还有你可以考虑一下event delegation,把事件处理函数放在<ul>上,而不是每个<li>上,这样只需要一个事件处理函数,加减列表内容的时候不用记着要调用addEventHandler,还可以省点内存。
【 在 Splunk 的大作中提到: 】
: 我的实现有错?实现没用i了,错在哪里?
: 你的意思是注释里面想用 lis[i]是错误的吧?
: 但还有个疑问,就是为什么lis可以用呢?
: ...................
--
修改:a9udn9u FROM 54.240.198.*
FROM 54.240.198.*