我最初在addCommentFormListener
方法中使用init
中的代码并且它有效。我正在尝试将监听器附加到相关元素,如下所示:
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>
答案 0 :(得分:5)
在传递给each()
的回调中,this
不是您认为的那样。它是迭代中的当前元素,这就是this.addEventListener
工作的原因,但当然它不能同时是CommentsController
实例,所以你传递的实际回调是{ {1}}。
由于您使用的是ES6,最简单的方法是使用箭头功能:
undefined
另请注意,在 init() {
$(".add-comment").each((index, element) => {
console.log('test2')
element.addEventListener("submit", this.addCommentFormListener);
})
}
中,addCommentFormListener
将引用事件被触发的元素,不到您的this
实例。目前这个工作正常,但如果你在一个月内重新访问这段代码可能会让人感到困惑:)