[英]Why isn't my listener attaching?
我最初在init
方法的addCommentFormListener
中包含代碼,並且可以正常工作。 我正在嘗試將偵聽器附加到相關元素,例如:
class CommentsController {
constructor() {
this.$addCommentForm = $('.add-comment')
}
init() {
$(".add-comment").each(function() {
console.log('test2')
this.addEventListener("submit", this.addCommentFormListener);
})
}
addCommentFormListener() {
e.preventDefault();
console.log('test');
var image = $(this).closest(".image");
var imageId = image.find("ul").attr("id");
var commentContents = $(this).find('input[name="comment-description"]').val();
console.log(commentContents);
// var imageObject = Image.all.find(image => image.id => imageId);
}
}
控制台會記錄test2
適當的時間,但是當我在給定元素上單擊“提交”時,什么也不會發生。 我想念什么?
另外,感覺奇怪,我有事件監聽器安裝在submit
,而不是它已經在那里了,只是被激活,當我點擊提交,但是這可能只是我的javascript聽眾的薄弱理解。
編輯添加HTML:
<form id="add-comment" class="add-comment" data-id="0" action="#" method="post">
<label for="comment-description">Comment: </label>
<input type="text" id="comment-description-0" class="user-text" name="comment-description" placeholder="comment">
<input type="submit" value="(+) add comment">
</form>
在傳遞給each()
的回調中, this
不是您認為的那樣。 這是迭代中的當前元素,這就是this.addEventListener
起作用的原因,但是當然不能同時作為CommentsController
實例,因此您傳遞的實際回調是undefined
。
由於您使用的是ES6,最簡單的方法是使用箭頭功能:
init() {
$(".add-comment").each((index, element) => {
console.log('test2')
element.addEventListener("submit", this.addCommentFormListener);
})
}
還要注意,在addCommentFormListener
, this
將指向觸發事件的元素,而不是 CommentsController
實例。 這目前可以正常使用,但是如果您在一個月后重新訪問此代碼,可能會造成混淆:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.