2017-10-07 50 views
2

我有麻烦试图做一个JavaScript类内部的点击功能,“this.overlay.style.display ='块'”由于“this”不工作,因为“this”是指回到我假设的点击事件?我该怎么做才能克服这个障碍?我可以在click事件之外使用console.log(options.overlay.id),但在click事件中它将会是未定义的。什么是最佳解决方案?试图做一个弹出JavaScript类

var popup_overlay = document.getElementById("popup_overlay"), 
      update_coins = document.getElementById("update_coins"); 

// POPUP CLASS 
    var Popup = function (options) { 
     console.log(options.overlay.id); //THIS WORKS 
     this.overlay = options.overlay; 
     this.button = options.button; 

     this.button.addEventListener("click", function(e){ 
//   this.overlay.style.display = 'block'; 
      alert(e.target.getAttribute('data-popup')); 
     }); 

    }; 

    var popup_update_coins = new Popup(
      { 
       overlay: popup_overlay, 
       button: update_coins 
      } 
    ); 

回答

1

你可以使用Arrow function

// POPUP CLASS 
 
var Popup = function(options) { 
 
    console.log(options.overlay.id); //THIS WORKS 
 
    this.overlay = options.overlay; 
 
    this.button = options.button; 
 

 
    this.button.addEventListener("click", (e) => { // Arrow function 
 
    this.overlay.style.display = 'block';  // this === Popup 
 
    alert(e.currentTarget.getAttribute('data-popup')); // currentTarget 
 
    }); 
 

 
}; 
 

 
var popup_overlay = document.getElementById("popup_overlay"), 
 
    update_coins = document.getElementById("update_coins"); 
 
    
 
var popup_update_coins = new Popup({ 
 
    overlay: popup_overlay, 
 
    button: update_coins 
 
});
#popup_overlay { 
 
    display: none; 
 
}
<button id="update_coins" data-popup="TEST">update</button> 
 
<div id="popup_overlay">asdasd</div>

+0

这是伟大的,有什么缺点呢?并非常感谢我没有意识到这种方式:) –

+0

唯一的缺点是旧版浏览器不支持ES6箭头功能。在这种情况下,常见的后备方法是设置'var self = this;',并在内部'function'中使用'self.overlay'。 –

相关问题