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的筛选器用得不够熟。你可以搜一下,大概看看。只要能找到控件,绑定事件都不叫事儿。