Javascript类&事件处理程序
Javascript classes & event handlers
我有一个问题与这个javascript代码:
function MyClass() {
var id_nr = Math.ceil(Math.random() * 999999);
this.button_id = 'button_' + id_nr;
}
MyClass.prototype = {
createButton: function() {
var msg = 'Button ''' + this.button_id + ''' was clicked';
var my_button = (
'<input type="button" id="'
+ this.button_id
+ '" value="Click Me" /'>'
);
document.body.innerHTML += '<div>' + my_button + '</div>';
document.getElementById(this.button_id).onclick = function() { alert(msg); }
}
};
window.onload = function() {
var s = new MyClass();
s.createButton();
};
是的,当前代码工作正常。但是,当我添加多个MyClass对象时,问题出现了:
window.onload = function() {
var s = new MyClass();
s.createButton();
var w = new MyClass();
w.createButton();
/* ...and many other buttons */
};
由于某种原因,只有当我单击最后创建的按钮时,才会触发onclick事件。我不知道为什么。
一个解决方法可能是这样的:
<input type="button" onclick="javascript:doSomeThing();" />
但不幸的是,这不是正确的解决方案,因为我的目标是,onclick事件应该能够调用另一个类方法,以及。(这些方法还没有创建)。
我怎样才能使这段代码正常工作?
当您使用innerHTML
时,内容将从DOM中剥离,然后再次读取和解析,从而破坏您可能添加的任何过去的事件侦听器。
如果你想在香草JS中做到这一点,考虑使用appendChild()
,也,我建议addEventListener()
。你的代码看起来像这样:
var my_button = document.createElement('input');
my_button.type = 'button';
my_button.id = this.button_id;
my_button.value = 'Click me';
document.body.appendChild(my_button);
my_button.addEventListener('click', function () { alert (msg) });
Javascript示例
如果您打算使用一些jQuery,这将更容易实现。你的方法看起来像这样:
var my_button = $('<input>')
.prop('type', 'button')
.prop('id', this.button_id)
.val('Click Me')
.on('click', function () { alert(msg) } );
$('body').append(my_button)
jQuery的工作示例
或者您可以使用jQuery.on()
方法将事件处理程序委托给按钮的所有后续实例。
委派事件处理程序的工作示例
这里使用innerHTML似乎破坏了事件侦听器"onclick"。
您可以通过使用文档来避免这种情况。方法创建html元素:
var but = document.createElement("input");
but.type = "button";
but.id = this.button_id;
but.value = "Click me";
document.body.appendChild(but);
就我个人而言,我更喜欢使用jQuery来操作DOM树元素,因为它提供了非常强大的工具。
相关文章:
- keyup事件处理程序更改焦点不适用于快速键入
- 提示使用服务器端事件处理程序激活JavaScript
- 将事件处理程序绑定到任何可能的事件
- 正在将事件处理程序添加到不存在的类
- 在循环中附加事件处理程序时出现浏览器性能问题
- 在同一个javascript事件处理程序中调用不同的函数
- 有没有一种方法可以让内联事件处理程序在元素创建后立即执行
- 检查事件处理程序参数
- 实现延迟的jquery更改事件处理程序
- 如何使用Node.js在JavaScript模块文件之间使用事件处理程序
- 如何使jQuery的“bind”或“on”事件处理程序幂等
- 带有参数的Javascript事件处理程序
- Jquery事件处理程序仅适用于匿名函数
- 如何从另一个处理程序内部取消JavaScript事件处理程序函数的执行
- 如何在jQuery事件处理程序中存储和重用超时
- 如何向onClick事件处理程序传递一个接受参数的函数,并且仍然将该函数绑定到组件's”;这个“;上下文
- 异步处理所有事件处理程序的方法
- jsplumb中的Click事件处理程序丢失“;这个“;对象
- 构造函数中的事件处理程序与构造函数外的事件处理函数的行为不同
- 如何在事件处理程序的回调中防止Default