2010-12-21 77 views
2

我有以下的HTML代码确定哪些元素调用事件

<input type="button" id ="b1" value="Click me" onclick="msg()" /> 
<input type="button" id="b2" value="Click me" onclick="msg()" /> 
现在

在我的javascript我想找出一个按钮是否被点击或按钮2.我该怎么办呢?

回答

4

如果你改变你的内嵌处理器使用.call()方法,该功能的情况下设置为this

<input type="button" id ="b1" value="Click me" onclick="msg.call(this)" /> 

...然后在你的函数,this将代表接收事件的人。

function msg() { 
    alert(this.id); 
} 

否则,你可以通过this作为参数:

<input type="button" id ="b1" value="Click me" onclick="msg(this)" /> 

...和参考这样的说法:

function msg(elem) { 
    alert(elem.id); 
} 
+0

我不能通过这个,我正在使用dojoattachevent将事件与事件处理程序关联起来 – akshay 2010-12-21 04:24:19

+0

@akshay:然后使用第一个例子,它不会传递'this'。你应该可以通过'onclick =“msg.call(this,event)''来传递'event'。 – user113716 2010-12-21 04:26:35

+0

@akshay - 当然dojo代理事件或元素作为上下文已经? – 2010-12-21 04:57:03

1

让你的msg()函数接受一个对象。然后当你调用它,传递

msg(this); 
+0

感谢:应该是什么味精 – akshay 2010-12-21 04:07:07

+0

的身体味精函数内部我怎样才能确定是否按钮1/2被点击了? – akshay 2010-12-21 04:08:00

+0

如果您的参数名称是o,请执行o。id – 2010-12-21 04:09:43

0

你不应该直接混合的JavaScript到您的带有JavaScript属性的HTML,如onclick。您应该使用JavaScript以编程方式附加您的处理程序。在最简单的:

function msg = function(evt){ 
    // For old IE versions that don't pass in the event, 
    // get the global event object. 
    if (!evt) evt = window.event; 

    // Use currentTarget if available, target if not, 
    // and srcElement for old versions of IE 
    var receiver = evt.currentTarget || evt.target || evt.srcElement; 

    alert(receiver.id); 
}; 
document.getElementById('b1').onclick = msg; 

事件处理程序传递事件对象作为自己的第一个参数(除了很老的IE版本,其中设置一个全局event属性)。

currentTargettarget属性之间的区别与事件冒泡有关。如果某个事件发生在子元素上,但随后冒泡到某个具有该事件处理程序的祖先,则currentTarget属性是子元素,target属性是具有事件处理程序的祖先。

IE的老版本没有currentTargettarget性质,而是使用srcElement意味着同样的事情target。现在,如果您将代码中的事件处理程序直接添加到元素中(而不是使用冒泡),那么您已经(在某个时间点)引用了该元素。因此,这里的选择,更先进的,但是,更简单的方法:

var inputs = document.getElementsByTagName('input'); 
for (var i=0,len=inputs.length;i<len;++i){ 
    if (inputs[i].type=='button'){ 
    inputs[i].onclick = (function(i){ 
     return function(){ 
     alert(inputs[i].id); 
     } 
    })(i); 
    } 
}; 
1

从阅读答案/意见,我发现你正在使用的道场。你可以通过事件对象来引用它。我只在Chrome,FF和IE8测试这一点,但这个似乎工作:

templateString: "<div>" + '<button id="button1" dojoAttachEvent="onclick: msg">press me1</button><button id="button2" dojoAttachEvent="onclick: msg">press me2</button></div>', 
msg:function(e){ 
    alert(e.currentTarget.id); 
} 

Live example

+0

不需要使用Dojo模板。即使您使用的是Dojo,也可以使用HTML的onclick事件参数。 – peller 2010-12-22 19:46:51

+0

我对Dojo不是很熟悉,但是如果OP使用'dojoAttachEvent'来使用模板系统的话。所以我用这个方式来演示。 – subhaze 2010-12-22 19:50:37

相关问题