Javascript 在原型上使用addEventListener

Javascript 在原型上使用addEventListener,javascript,javascript-events,Javascript,Javascript Events,我正试图通过点击addEventListener来运行Prototype的结果,但即使没有点击,结果也会显示出来 <div id="box">Your Item:</div> <button id="myBtn">Buy</button> <script type="text/javascript"> function Machine(n,p){ this.name = n; this.price = p; } Machine.

我正试图通过点击addEventListener来运行Prototype的结果,但即使没有点击,结果也会显示出来

<div id="box">Your Item:</div>

<button id="myBtn">Buy</button>

<script type="text/javascript">
function Machine(n,p){
this.name = n;
this.price = p;
}


Machine.prototype.Dispatch = function(){
var container = document.getElementById('box');
container.innerHTML = this.name + " " + this.price;
}
var Drink = new Machine("coke",80);
var Handle = document.getElementById('myBtn');
Handle.addEventListener("click",Drink.Dispatch(),false);
</script>
您的物品:
购买
功能机器(n,p){
this.name=n;
这个价格=p;
}
Machine.prototype.Dispatch=函数(){
var container=document.getElementById('box');
container.innerHTML=this.name+“”+this.price;
}
var饮料=新机器(“可乐”,80);
var Handle=document.getElementById('myBtn');
Handle.addEventListener(“单击”,Drink.Dispatch(),false);

您必须将函数引用传递给
addEventListener
,而不是像这样调用函数(并传递其返回值):

Handle.addEventListener("click", Drink.Dispatch, false);
当您这样做时,您的处理程序只会在单击时被激发。但是您将面临一个不同的问题:
处理程序中的这个
将是单击的元素,而不是您的
机器
实例。要解决这个问题,您可以使用(请参阅链接文档,了解旧浏览器的polyfill):



注意:构造函数的函数名通常只使用大写的首字母,所以您可以快速地将它们区分开来。这就是为什么我将
Drink
Handle
重命名为
Drink
Handle
您必须将函数引用传递给
addEventListener
,而不是像这样调用函数(并传递其返回值):

Handle.addEventListener("click", Drink.Dispatch, false);
当您这样做时,您的处理程序只会在单击时被激发。但是您将面临一个不同的问题:
处理程序中的这个
将是单击的元素,而不是您的
机器
实例。要解决这个问题,您可以使用(请参阅链接文档,了解旧浏览器的polyfill):



注意:构造函数的函数名通常只使用大写的首字母,所以您可以快速地将它们区分开来。这就是为什么我将
Drink
Handle
重命名为
Drink
Handle
您需要在侦听器的函数()闭包之间添加调用。或者删除函数名后的()

这应该起作用:


您需要在侦听器的函数(){}闭包之间添加调用。或者删除函数名后的()

这应该起作用:


要在对象上执行自定义事件,我使用以下简单脚本扩展对象:

/* Simple Custom event prototype for objects

Extend your object like this:

<OBJECT>.prototype = new EventEmitter;

Then you can use :

<OBJECT>.on("test",function() { alert("Test event triggered"); })
<OBJECT>.on("test",function() { alert("Test event 2 triggered"); })
<OBJECT>.trigger("test");

*/
function EventEmitter() {

    var listeners = Object();   //Matrix of event/callbacks

    //Add listener
    this.on = function(evt, callback) {
        //console.log("Listener added: " + evt);

        if (!listeners.hasOwnProperty(evt))
            listeners[evt] = Array();

        listeners[evt].push(callback);      
    }

    //Call listeners
    this.trigger = function(evt, params) {
        //console.log("trigger called " + evt);
        //console.dir(listeners);

        if (evt in listeners) {
            callbacks = listeners[evt];
            //Call all callbacks with the params
            for (var x in callbacks){
                callbacks[x](params);
            }
        } else {
            console.log("No listeners found for " + evt);
        }

    }
}
/*对象的简单自定义事件原型
像这样扩展对象:
.prototype=新的事件发射器;
然后您可以使用:
.on(“测试”,函数(){alert(“触发测试事件”);})
.on(“测试”,函数(){alert(“触发测试事件2”);})
.触发(“测试”);
*/
函数EventEmitter(){
var listeners=Object();//事件/回调矩阵
//添加侦听器
this.on=函数(evt,回调){
//log(“添加的侦听器:+evt”);
if(!listeners.hasOwnProperty(evt))
监听器[evt]=数组();
侦听器[evt]。推送(回调);
}
//呼叫侦听器
this.trigger=函数(evt,参数){
//log(“称为“+evt”的触发器);
//console.dir(侦听器);
if(侦听器中的evt){
回调=侦听器[evt];
//使用参数调用所有回调
for(回调中的变量x){
回调[x](参数);
}
}否则{
log(“找不到“+evt”的侦听器);
}
}
}

要在对象上执行自定义事件,我使用以下简单脚本扩展对象:

/* Simple Custom event prototype for objects

Extend your object like this:

<OBJECT>.prototype = new EventEmitter;

Then you can use :

<OBJECT>.on("test",function() { alert("Test event triggered"); })
<OBJECT>.on("test",function() { alert("Test event 2 triggered"); })
<OBJECT>.trigger("test");

*/
function EventEmitter() {

    var listeners = Object();   //Matrix of event/callbacks

    //Add listener
    this.on = function(evt, callback) {
        //console.log("Listener added: " + evt);

        if (!listeners.hasOwnProperty(evt))
            listeners[evt] = Array();

        listeners[evt].push(callback);      
    }

    //Call listeners
    this.trigger = function(evt, params) {
        //console.log("trigger called " + evt);
        //console.dir(listeners);

        if (evt in listeners) {
            callbacks = listeners[evt];
            //Call all callbacks with the params
            for (var x in callbacks){
                callbacks[x](params);
            }
        } else {
            console.log("No listeners found for " + evt);
        }

    }
}
/*对象的简单自定义事件原型
像这样扩展对象:
.prototype=新的事件发射器;
然后您可以使用:
.on(“测试”,函数(){alert(“触发测试事件”);})
.on(“测试”,函数(){alert(“触发测试事件2”);})
.触发(“测试”);
*/
函数EventEmitter(){
var listeners=Object();//事件/回调矩阵
//添加侦听器
this.on=函数(evt,回调){
//log(“添加的侦听器:+evt”);
if(!listeners.hasOwnProperty(evt))
监听器[evt]=数组();
侦听器[evt]。推送(回调);
}
//呼叫侦听器
this.trigger=函数(evt,参数){
//log(“称为“+evt”的触发器);
//console.dir(侦听器);
if(侦听器中的evt){
回调=侦听器[evt];
//使用参数调用所有回调
for(回调中的变量x){
回调[x](参数);
}
}否则{
log(“找不到“+evt”的侦听器);
}
}
}