在 JavaScript 中使用单击事件创建动态按钮

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7707074/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 03:16:18  来源:igfitidea点击:

Creating Dynamic button with click event in JavaScript

javascripthtml

提问by Mustafa Ekici

How can I create a dynamic button with a click event with JavaScript?

如何使用 JavaScript 创建带有单击事件的动态按钮?

I tried this, but when I click the add button, an alert message show up! It's not what I want - I want to be able to click the button which is dynamically created.

我试过了,但是当我单击添加按钮时,会出现一条警告消息!这不是我想要的 - 我希望能够点击动态创建的按钮。

<script language="javascript">
    function add(type) {
        //Create an input type dynamically.   
        var element = document.createElement("input");
        //Assign different attributes to the element. 
        element.setAttribute("type", type);
        element.setAttribute("value", type);
        element.setAttribute("name", type);
        element.setAttribute("onclick", alert("blabla"));

        var foo = document.getElementById("fooBar");
        //Append the element in page (in span).  
        foo.appendChild(element);

    }
</script>

回答by T.J. Crowder

Wow you're close. Edits in comments:

哇,你很接近。评论中的编辑:

function add(type) {
  //Create an input type dynamically.   
  var element = document.createElement("input");
  //Assign different attributes to the element. 
  element.type = type;
  element.value = type; // Really? You want the default value to be the type string?
  element.name = type; // And the name too?
  element.onclick = function() { // Note this is a function
    alert("blabla");
  };

  var foo = document.getElementById("fooBar");
  //Append the element in page (in span).  
  foo.appendChild(element);
}
document.getElementById("btnAdd").onclick = function() {
  add("text");
};
<input type="button" id="btnAdd" value="Add Text Field">
<p id="fooBar">Fields:</p>

Now, instead of setting the onclickproperty of the element, which is called "DOM0 event handling," you might consider using addEventListener(on most browsers) or attachEvent(on all but very recent Microsoft browsers) — you'll have to detect and handle both cases — as that form, called "DOM2 event handling," has more flexibility. But if you don't need multiple handlers and such, the old DOM0 way works fine.

现在,onclick您可以考虑使用addEventListener(在大多数浏览器上)或attachEvent(在除最新的 Microsoft 浏览器之外的所有浏览器上)而不是设置元素的属性(称为“DOM0 事件处理” )——您必须检测并处理这两种情况— 因为这种称为“DOM2 事件处理”的形式具有更大的灵活性。但是如果您不需要多个处理程序等,旧的 DOM0 方式就可以正常工作。



Separately from the above: You might consider using a good JavaScript library like jQuery, Prototype, YUI, Closure, or any of several others. They smooth over browsers differences like the addEventListener/ attachEventthing, provide useful utility features, and various other things. Obviously there's nothing a library can do that you can't do without one, as the libraries are just JavaScript code. But when you use a good library with a broad user base, you get the benefit of a hugeamount of work already done by other people dealing with those browsers differences, etc.

与上述不同:您可能会考虑使用一个好的 JavaScript 库,如jQueryPrototypeYUIClosure其他几个库中的任何一个。它们消除了浏览器之间的差异,比如addEventListener/attachEvent东西,提供了有用的实用功能,以及其他各种东西。显然,没有什么是库可以做的,没有库就不能做,因为库只是 JavaScript 代码。但是,当你使用一个好的图书馆有广泛的用户基础,你得到的好处巨大已经被其他人处理这些浏览器的差异,等完成的工作数量

回答by shashidhar

<!DOCTYPE html>
<html>
<body>

<p>Click the button to make a BUTTON element with text.</p>

<button onclick="myFunction()">Try it</button>

<script>
function myFunction() {
    var btn = document.createElement("BUTTON");
    var t = document.createTextNode("CLICK ME");

    btn.setAttribute("style","color:red;font-size:23px");

    btn.appendChild(t);
    document.body.appendChild(btn);

    btn.setAttribute("onclick", alert("clicked"));

}
</script>

</body>
</html>

回答by neworld

this:

这个:

element.setAttribute("onclick", alert("blabla"));

should be:

应该:

element.onclick = function () {
  alert("blabla");
}

Because you call alert instead push alert as string in attribute

因为您调用警报而不是将警报作为属性中的字符串推送

回答by Sam Dufel

Firstly, you need to change this line:

首先,您需要更改此行:

element.setAttribute("onclick", alert("blabla"));

To something like this:

对于这样的事情:

element.setAttribute("onclick", function() { alert("blabla"); });

Secondly, you may have browser compatibility issues when attaching events that way. You might need to use .attachEvent / .addEvent, depending on which browser. I haven't tried manually setting event handlers for a while, but I remember firefox and IE treating them differently.

其次,以这种方式附加事件时,您可能会遇到浏览器兼容性问题。您可能需要使用 .attachEvent / .addEvent,具体取决于浏览器。我有一段时间没有尝试手动设置事件处理程序,但我记得 Firefox 和 IE 对它们的处理方式不同。