请问 JS 事件处理时只能赋值函数名的时候,但这个函数实际上需要传入参数该怎么办? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Newyorkcity
V2EX    问与答

请问 JS 事件处理时只能赋值函数名的时候,但这个函数实际上需要传入参数该怎么办?

  •  
  •   Newyorkcity 2017-08-15 12:45:14 +08:00 3112 次点击
    这是一个创建于 3057 天前的主题,其中的信息可能已经有所发展或是发生改变。
    另外在书上看到 button. Onclick= handleClick; 然后 function handleClick(e){ var id = e.target.getAttribute("id") }; 请问这里这个 e 是怎么回事儿?明明只是在事件处理时调用了这个函数,根本没有传入参数,怎么使用的?难道处理时间的函数如果有形参的默认为引发事件处理的元素对象?
    谢谢!~
    9 条回复    2017-08-16 08:55:00 +08:00
    Exceptionluo
        1
    Exceptionluo  
       2017-08-15 13:55:00 +08:00
    1、e 就是 event 对象呀
    2、类似 arguments
    3、不是很懂
    wwqgtxx
        2
    wwqgtxx  
       2017-08-15 14:00:49 +08:00 via iPhone
    浏览器传进去的
    wwqgtxx
        3
    wwqgtxx  
       2017-08-15 14:02:59 +08:00 via iPhone
    而且这里的 button.Onclick= handleClick 并没有调用函数,只是类似于在 c 语言中赋值了一个函数指针而已
    Newyorkcity
        4
    Newyorkcity  
    OP
       2017-08-15 14:21:10 +08:00
    @Exceptionluo 请问 event 对象是指什么,比如在这里就是值 button 这个对象吗?推广开来讲,一个函数因为事件处理被调用时,如果这个函数有一个形参,那么这个形参会被浏览器自动赋值成 造成这个事件的元素的对象吗?
    那如果把形参 e 写成 event,element 会有什么区别吗?
    ===
    其实我根本疑惑在于
    function handleClick(e) 这里有一个形参
    而 书上给出的代码 就只有 button. Onclick= handleClick
    也就是说这个函数根本不可能得到实参,那它为什么可以工作?
    按照我上面的说法去解释吗?
    那如果这个函数实际上需要两个参数呢?还是说需要两个参数的函数不允许作为事件处理的函数?
    ==
    谢谢
    jarlyyn
        5
    jarlyyn  
       2017-08-15 14:22:57 +08:00
    就只有 button. Onclick= handleClick
    也就是说这个函数根本不可能得到实参,那它为什么可以工作?

    button.onclick(event)
    KeepPro
        7
    KeepPro  
       2017-08-15 15:24:59 +08:00 via Android
    我以前也考虑过这个问题 233。

    其实你举的例子其实是声明了一个函数并且绑定到点击事件处理器上,并没有调用呢。

    调用是在你真正点击按钮的时候才发生的。
    CDog34
        8
    CDog34  
       2017-08-16 00:04:03 +08:00   1
    button. Onclick= handleClick 这行代码做的事情是:把对 handleClick 这个函数的引用赋给了 button 对象的 onclick 属性,注意这个时候并没有发生调用。
    真正的调用发生在点击事件发生的时候,浏览器内部执行了类似 button.onclick(Event)的代码,此时 onclick 是对于 handleClick 的引用,就相当于是调用了 handleClick(Event)。当然实际情况中,函数的上下文可能还不是完全相同,这里只是举个例子~
    而 Event 是浏览器内置的事件对象,click 事件的 Event 属于 MouseEvent,具体可以参考 MDN: https://developer.mozilla.org/zh-CN/docs/Web/API/MouseEvent

    至于触发 click 的 button 对象,可以通过 Event.target 来获得~
    Newyorkcity
        9
    Newyorkcity  
    OP
       2017-08-16 08:55:00 +08:00
    @CDog34
    @Exceptionluo
    谢谢!~
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2611 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 09:39 PVG 17:39 LAX 01:39 JFK 04:39
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86