jincongno.1 发表于 2020-2-10 17:32:15

关于addEventListener的问题

本帖最后由 jincongno.1 于 2020-2-10 17:38 编辑

var checklist = document.getElementById("checklist");

var items = checklist.querySelectorAll("li");
var inputs = checklist.querySelectorAll("input");

for (var i = 0;i <items.length; i++) {
    items.addEventListener("click",editItem);
    inputs.addEventListener("blur",updateItem);//失焦的事件
    inputs.addEventListener("keypress",itemKeypress);//键盘

}
function editItem() {
    this.className = "edit";
    var input = this.querySelector("input");
    input.focus();//有了这个之后 点击之后他光标会到第一个字母前面去(获取焦点)
    input.setSelectionRange(0,input.value.length); //该方法可以为当前元素内的文本设置被选中范围



}
function updateItem () {
    this.previousElementSibling.innerHTML = this.value;
    //previousElementSibling返回指定元素的前一个兄弟元素 innerHTML获取兄弟元素里面的值然后更改掉
    //接下来关闭编辑模式
    this.parentNode.className ="";
}
function itemKeypress (event) {
    if (event.which === 13) {
      updateItem.call(this);
      
    }
   
}


想请问一下 我在itemKeypress函数中调用updateItem需要.call (this) 不然会报错
我试了不传this调用 他的this变成widows……
在 inputs i].addEventListener("blur",updateItem)里 有给updateItem传东西吗

有这么个疑惑。希望大佬指点
代码出处是小甲鱼老师搬运的web教学 js常用事件实战2

不二如是 发表于 2020-2-10 21:14:21

实在没明白你的问题...

jincongno.1 发表于 2020-2-11 17:59:59

不二如是 发表于 2020-2-10 21:14
实在没明白你的问题...

您看这样问可以吗。在我失焦的时候调用这个函数 看上去是空荡荡的updateItem(我不清楚它实际上有没有传值进去)但是我在别的地方调用这个函数的时候需要这样 updateItem.call(this); 我去掉过后半部分 他报错大概的意思就是找不到在哪里了。或者说 emmm 在 inputs.addEventListener("blur",updateItem);//失焦 在这里调用的时候 有给updateItem传值吗?   还是明白不了的话 也是我表达的问题 不然您帮我删了这个贴也是可以的!很感谢您帮忙看了

542624047 发表于 2020-3-15 20:56:31

你这个只是绑定了一个事件啊,传值是没有的.单纯的调用你的function updateItem里面的this自然是指windows.只有调用call传你那个指定的this进去才能正常工作.
页: [1]
查看完整版本: 关于addEventListener的问题