javascript - 为什么这段代码click事件监听无效
ringa_lee
ringa_lee 2017-04-11 10:22:08
[JavaScript讨论组]

程序作用是input输入文字后,点击按钮,在plist后新增一个p子节点。
但是这段代码直接运行了vivi(),而且点击btn无效。

html

<form action="">
  <input type="text" id="inputtext"/>
  <button id="btn">i</button>
</form>
<p id="plist"></p>

js

 window.onload = function(){
        var btn = document.getElementById("btn");
        var inputtext = document.getElementById("inputtext");
        var plist = document.getElementById("plist");
        function vivi(){
            var newnode = document.createElement("p");
            newnode.innerHTML = "a";
            plist.appendChild(newnode);
        }
    btn.addEventListener("click",vivi());

}
ringa_lee
ringa_lee

ringa_lee

全部回复(8)
天蓬老师

把 btn.addEventListener('click', vivi()); 改成

btn.addEventListener('click', vivi);

element.addEventListener参数是这样的

element.addEventListener(event, function, useCapture)

第二个参数是一个function对象,或者说是引用,vivi()是调用该函数的意思。
所以你的代码实际上是 btn.addEventListener('click', undefined);
因为vivi()方法调用后没返回任何东西

你可以试下

var forFun = function() {
    return function() {
        console.log('fun 233333');
    };
};
btn.addEventListener('click', forFun())

多试下就会明白了

黄舟
btn.addEventListener('click', forFun())

这段代码中,回调函数加了括号相当于直接执行了forFun,而forFun这个函数又没有返回一个函数,所以addEventListener这个方法的第二个参数相当于没有传对,最后便挂掉了

怪我咯

不是这样的吗btn.addEventListener("click",vivi);

高洛峰

是这样

btn.addEventListener("click",vivi);

不是

btn.addEventListener("click",vivi());
巴扎黑

不是的噢,()是运算符。不加才是传入了回调函数

黄舟

btn.addEventListener("click",vivi());
第二个参数返回的是undefined,而这个参数需要的是一个函数引用,而不是一个函数运行后的返回值,
当然你也可以在函数里面返回函数,@hwencc回答的很详细

伊谢尔伦

vivi去掉括号

PHP中文网

把vivi()的括号去掉,效果参见:http://www.jscssshare.com/#/sample/onFQ5rpy

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号