使用innerHTML时无法读取null的属性'addEventListener'

时间:2019-06-26 23:50:27

标签: javascript html

我正在使用innerHTML在其顶部添加一些元素和包装器

for (i = 0; i < arr.length; i++) {
    b.innerHTML += "<div class='wrapper'><div class='col-4'>" + arr[i].storeID + "</div>" + 
            "<div class='col-4'>" + arr[i].Bookid + "</div>" + 
           "<div class='col-4'>" + arr[i].StoreName + "</div>" + "</div>"
            var d=document.querySelector('.wrapper')
            d.addEventListener("click", function(e) {
                console.log('on click fired')
                /*insert the value for the autocomplete text field:*/
                inpStr=this.innerHTML
                inp.value = this.innerHTML
                /*close the list of autocompleted values,
                (or any other open lists of autocompleted values:*/
                closeAllLists();

            });
}

innerHTML正常工作,但是当我单击wrapper行时,我得到了

  

使用时无法读取null的属性'addEventListener'   innerHTML

这是因为我正在使用innerHTML创建元素吗?

3 个答案:

答案 0 :(得分:1)

问题是querySelector仅返回类.wrapper的第一个元素

querySelectorAll()应该用于返回.wrappers数组,并使用for循环进行迭代以放置事件侦听器。

或者,您可以使用一种称为事件委托的技术,将事件侦听器放置在父级上,并使用event.target来引用被单击的子级。

答案 1 :(得分:0)

嗯,我仍然不确定是什么引起了问题。但是我将上面的代码更改为:

$(b).on('click','#wrapper',function(){
    console.log('on click fired')
    /*insert the value for the autocomplete text field:*/
    inpStr=this.innerHTML
    inp.value = this.innerHTML
    /*close the list of autocompleted values,
    (or any other open lists of autocompleted values:*/
    closeAllLists();
})

,它给了我正确的innerhtml。我只需要弄清楚如何从标记中检索正确的值。

答案 2 :(得分:0)

首先您有一个.wrapper,所以执行wrapper时总是只得到第一个创建的var d=document.querySelector('.wrapper')

您将需要当前创建的包装器。 这是您应该在下面查看的内容。

var d= document.createElement("div") // Create a new div
b.append(d); // append the new Created div to b
d.className = "wrapper"; 
d.innerHTML =  "<div class='col-4'>" + arr[i].storeID + "</div>" + 
            "<div class='col-4'>" + arr[i].Bookid + "</div>" + 
           "<div class='col-4'>" + arr[i].StoreName + "</div>";
// Add your click operation
d.addEventListener("click", function(e) {
                console.log('on click fired')
                /*insert the value for the autocomplete text field:*/
                inpStr=this.innerHTML
                inp.value = this.innerHTML
                /*close the list of autocompleted values,
                (or any other open lists of autocompleted values:*/
                closeAllLists();

            });