为什么javaScript中设置DOM对象绑定事件触发的函数时普通的元素对象不需要加括号而window对象需要括号?

JavaScript014

为什么javaScript中设置DOM对象绑定事件触发的函数时普通的元素对象不需要加括号而window对象需要括号?,第1张

函数名加括号是立即执行该函数,而DOM对象绑定的事件函数是在事件条件满足(比如点击)时才需要执行的,而不是在绑定时就执行,所以不要加括号。

test.onclick=run()//这个是在test对象绑定click事件时就立即执行run函数,然后把函数的运行结果赋值给click事件,这显然是错误的

test.onclick=run//这是把run函数本身(函数也是对象)赋值给test对象的click事件,然后在click事件发生时才执行run函数,所以这是正确的

从这个意义上来说,你所谓的 window.onload=run()本意是要等window对象加载完毕后再执行run函数,但是这样写的话,run函数会立即执行(在window对象还未加载完毕就执行),多数情况下这样做是不会出什么错的(除非在run函数内要调用页面上尚未加载的DOM元素时才会出错),表面上看起来也跟window的load事件触发了没什么两样,但事实上它已经脱离了你的本意,所以也是错误的!

而 window.onload=run这个才是对的,至于你说它未执行,估计你是搞错了,在run内部加个控制台的输出或者跟踪一下你就知道它究竟有没有执行了。

js 有办法 判断一个dom元素是否已经绑定了某个事件!

代码如下:

/*

* 事件注册

* @param Element ele

* @param String eventType

* @param Functionfn

* @param Boolean isRepeat

* @param Boolean isCaptureCatch

* @return undefined

*/

function loginEvent(ele , eventType , fn , isRepeat , isCaptureCatch){

if (ele == undefined || eventType === undefined || fn === undefined) {

throw new Error('传入的参数错误!')

}

if (typeof ele !== 'object') {

throw new TypeError('不是对象!')

}

if (typeof eventType !== 'string') {

throw new TypeError('事件类型错误!')

}

if (typeof fn !== 'function') {

throw new TypeError('fn 不是函数!')

}

if (isCaptureCatch === undefined || typeof isCaptureCatch !== 'boolean') {

isCaptureCatch = false

}

if (isRepeat === undefined || typeof isRepeat !== 'boolean') {

isRepeat = true

}

if (ele.eventList === undefined) {

ele.eventList = {}

}

if (isRepeat === false) {

for (var key in ele.eventList)

{

if (key === eventType) {

return '该事件已经绑定过!'

}

}

}

// 添加事件监听

if (ele.addEventListener) {

ele.addEventListener(eventType , fn , isCaptureCatch)

} else if (ele.attachEvent) {

ele.attachEvent('on' + eventType , fn)

} else {

return false

}

ele.eventList[eventType] = true

}

楼下说得太简单了,估计提问者看不懂。

假设,你有以下DOM

<div id="dvTest">

    <div>在这下面加一个按钮</div>

</div>

然后你添加一个按钮,方法如下

function addButton(){

    var $container = $("#dvTest")

    $container.append("<a href='javascript:'>click me</a>")

}

然后,给刚加的按钮一个click事件

//你要先找到你加的这个按钮

$("#dvTest > a").click(function(){ alert('you clicked me') })

//或

$("#dvTest > a").unbind().on('click'), function(){ alert('you clicked me') })

我觉得你主要是jQuery的筛选器用得不够熟。你可以搜一下,大概看看。只要能找到控件,绑定事件都不叫事儿。