javascript函数DOM事件监听器使用"this"
javascript function DOM event listener using "this"
我希望我的事件侦听器函数isTwoCards从调用它的对象中获取信息。这段代码给了我元素。getAttribute不是一个函数
var gameboard = document.getElementById('game-board');
var cards = ['queen', 'queen', 'king', 'king'];
var cardsInPlay = [];
var isTwoCards = function(element){
cardsInPlay.push(element.getAttribute('data-card'));
if (cardsInPlay.length === 2){
isMatch(cardsInPlay);
cardsInPlay = [];
}
}
var createBoard = function(){
for (var i = 0; i < cards.length; i++){
cardDiv = document.createElement('div');
cardDiv.setAttribute('class', 'card');
cardDiv.setAttribute('data-card', cards[i]);
cardDiv.setAttribute('id', i);
cardDiv.addEventListener('click', isTwoCards(this));
gameboard.appendChild(cardDiv);
}
}
createBoard()
您立即运行isTwoCards
,而不是将其分配为回调。从我所看到的,你需要的是分配isTwoCards
(而不是它的结果!)作为回调-即cardDiv.addEventListener('click', isTwoCards)
。您还应该使用this.getAttribute('data-card')
而不是element
。当函数作为回调函数被触发时,this
被赋值给元素,而不是当回调函数被赋值时。
前面提到的问题是,您正在执行函数,而不仅仅是将其作为参数传递。看一下这个例子:
someDomElement.addEventListener('click', function() { })
让我们将该函数存储在一个变量中,然后将其作为参数传递。
const myFunction = function() { }
someDomElement.addEventListener('click', myFunction)
看,我只是传递了存储在变量中的函数作为参数。现在你要做的是执行函数:
const myFunction = function() { }
someDomElement.addEventListener('click', myFunction())
您实际上将undefined
附加为侦听器,因为它正在执行该函数并且其返回值为undefined
。
你可以通过创建一个闭包/简单地返回一个新函数来解决这个问题:
var isTwoCards = function(element){
return function () {
cardsInPlay.push(element.getAttribute('data-card'));
if (cardsInPlay.length === 2){
isMatch(cardsInPlay);
cardsInPlay = [];
}
};
}
您也可以简单地访问侦听器中的this
来访问事件侦听器绑定到的元素:
var isTwoCards = function(){
var element = this;
cardsInPlay.push(element.getAttribute('data-card'));
if (cardsInPlay.length === 2){
isMatch(cardsInPlay);
cardsInPlay = [];
}
}
相关文章:
- $(this).prop('property') vs. this.property
- Twitter Bootstrap typeahead:使用“this”获取上下文/调用元素
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 重复“;function(){}.调用(this)"在Uglified JS中
- 这条线是什么意思"this.parentNode.firstChild.nodeName”;在jQuery H
- jqueryui:"类型错误:this.menu.element未定义"
- 为什么获胜't This Vuejs“;Hello World"示例在我的电脑上渲染
- "this.collection.each不是函数;.应该'它不是简单地说“;每个”;
- 为什么不't this replace()替换"我的“;
- 我的onsubmit=“;return onNewUserRegistrationCheck(this)"仍然
- <a href="javascript:foo(this)">通过Window,我想要标记
- 主干——哪个“这个”;是“this"
- How do i formulate "if this.children.has.not.class"
- 鼠标事件监听器&“this"
- <textarea onclick=“;this.value;this.select()">?这是什么
- "类型错误:this.options为null"在OpenLayers.Protocol.HTTP中
- 为什么是全球性的"this.function";如果没有";这个"