更新:( 回顾一下,小提琴和赏金)
这个问题还没有被得到太多的关注,所以我会花一些代表就可以了。 我知道,我往往是在我的答案和问题都过于冗长。 这就是为什么我说干就干,设立这个小提琴 ,这一点,在我看来,我目前不必使用来接近沸腾的那种代码体面的表现change
事件。 一对夫妇的我试图解决的问题:
- 该
pseudo-change
不会触发事件上选择元素,除非它失去焦点。 在某些情况下,客户应在选择一个新的值被重定向。 如何实现这一目标? - 该处理器将被调用这两个标签被点击时,以及复选框自己。 就其本身而言这是你所期望的,但由于事件冒泡它(据我所知)无法确定点击了哪个元素。 IE浏览器的事件对象不具有
realTarget
财产。 - 当改变
checked
通过点击标签在IE复选框的通态,一切都很好(尽管它需要一些讨厌的解决方法),而是直接点击复选框时,调用处理程序,但选中状态保持不变,直到我点击第二次。 那么该值改变,但处理不叫。 - 当我切换到不同的选项卡,然后再返回,处理程序被调用多次。 三次如果检查的状态实际改变,如果我两次点击checbox直接一次。
任何信息,可以帮助我解决的问题的一个或多个以上,将不胜感激。 拜托,我没有忘记添加一个jQuery的标签,我喜欢纯JS,所以我在寻找一个纯粹的JS答案。
我有一个网页,上面有超过250选择的元素,和20〜30复选框。 我也有跟踪用户的行为,并采取适当措施。 因此,它是很自然的我委托更改事件,而不是增加数百位听众,恕我直言。
当然,IE -company政策:IE8必须是当我需要它supported-不会触发onchange事件。 所以我想伪造一个onchange事件。 我迄今距1件事真让我心烦的工作还算不错。
我使用onfocusin
和onfocusout
注册事件。 在某些情况下,当用户选择从一个select元素的新值,脚本应该立即做出反应。 然而,只要选择并没有失去重心,这将不会发生。
以下是我想出了到目前为止:
i = document.getElementById('content');
if (!i.addEventListener)
{
i.attachEvent('onfocusin',(function(self)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
switch (target.tagName.toLowerCase())
{
case 'input':
if (target.getAttribute('type') !== 'checkbox')
{
return true;
}
return changeDelegator.apply(self,[e]);//(as is
case 'select':
self.attachEvent('onfocusout',(function(self,current)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if (target !== current)
{
return;
}
self.detachEvent('onfocusout',arguments.callee);//(remove closure
return changeDelegator.apply(self,[e]);
}
})(self,target));
default: return;
}
}
})(i));//(fake change event, buggy
}
else
{//(to put things into perspective: all major browsers:
i.addEventListener('change',changeDelegator,false);
}
我试着安装里面的另一个事件侦听器onfocusin
处理程序绑定到onclick
事件。 它打响了onfocusout
的任何选择具有焦点ATM事件。 唯一的问题是,用户的99.9%会点击一个选择,这样focusin
事件触发一个onclick了。
为了避开这一点,我创建了封闭,并接受当前选择,对焦和它的原始值,将其作为参数。 但有些用户使用他们的键盘,而这些用户往往选项卡下一个选择框不改变价值。 每次绑定一个新的onclick听众......我相信必须有比检查所有一个简单的方法e.type
的和分别对待。
只是作为一个例子:有一个额外的代码onclick
听众:所有的代码是一样的第一个片段,所以我只粘贴case 'select':
块
case 'select':
self.attachEvent('onfocusout',(function(self,current)
{
return function(e)
{
e = e || window.event;//(IE...
var target = e.target || e.srcElement;
if (!(target === current))
{
return;
}
self.detachEvent('onfocusout',arguments.callee);//(remove closure
return changeDelegator.apply(self,[e]);
};
})(self,target));
self.attachEvent('onclick',(function(self,current,oldVal)
{
return function(e)
{
e = e || window.event;
var target = e.target || e.srcElement;
if (target.tagName.toLowerCase() === 'option')
{
while(target.tagName.toLowerCase() !== 'select')
{
target = target.parentNode;
}
}
if (target !== current)
{//focus lost, onfocusout triggered anyway:
self.detachEvent('onclick',arguments.callee);
return;
}
var val = target.options[target.selectedIndex].innerHTML;//works best in all browsers
if (oldVal !== target.options[target.selectedIndex].innerHTML)
{
self.detachEvent('onclick',arguments.callee);
return target.fireEvent('onfocusout');
}
};
})(self,target,target.options[target.selectedIndex].innerHTML));
default: return;