Javascript 在Internet Explorer中动态添加的SELECT元素不会触发onchange事件
据我所知,这只不过是在Internet Explorer中损坏的。我有一个脚本,可以创建多个动态元素,并为它们添加一个onchange事件。onchange事件在Firefox中触发没有问题,但在internetexplorer中它从不触发。使用开发者工具栏,我看到DOM列出了正确的事件,但它永远不会触发。我将问题归结为以下代码:Javascript 在Internet Explorer中动态添加的SELECT元素不会触发onchange事件,javascript,html,internet-explorer,Javascript,Html,Internet Explorer,据我所知,这只不过是在Internet Explorer中损坏的。我有一个脚本,可以创建多个动态元素,并为它们添加一个onchange事件。onchange事件在Firefox中触发没有问题,但在internetexplorer中它从不触发。使用开发者工具栏,我看到DOM列出了正确的事件,但它永远不会触发。我将问题归结为以下代码: <html> <head> <script language="javascript">
<html>
<head>
<script language="javascript">
function addSelect() {
var se = document.createElement('select');
se.setAttribute("onchange", "alert('Dynamic')");
se.options[0] = new Option("1", "1");
se.options[1] = new Option("2", "2");
se.options[2] = new Option("3", "3");
se.options[3] = new Option("4", "4");
var plh = document.getElementById("ph");
plh.appendChild(se);
}
</script>
</head>
<body onload="addSelect()">
<select name="something" onchange="alert('Static')">
<optgroup label="set1">
<option value="1">1</option>
<option value="2">2</option>
</optgroup>
<optgroup label="set2">
<option value="3">3</option>
<option value="4">4</option>
</optgroup>
</select>
<div id="ph">
</div>
</body>
</html>
函数addSelect(){
var se=document.createElement('select');
se.setAttribute(“onchange”、“alert('Dynamic')”);
se.期权[0]=新期权(“1”、“1”);
se.期权[1]=新期权(“2”、“2”);
se.期权[2]=新期权(“3”、“3”);
se.期权[3]=新期权(“4”、“4”);
var plh=document.getElementById(“ph”);
附肢儿童(se);
}
1.
2.
3.
4.
静态警报消息显示良好,但动态警报消息在Internet Explorer中不起任何作用。我几乎可以肯定的是,我在其他地方看到过这项工作,但我似乎找不到其他例子。有没有人看到/知道如何让它工作?更改:
se.setAttribute("onchange", "alert('Dynamic')");
致:
甚至更短:
se.onchange = function(){alert('Dynamic')};
在触发事件IE9之后,我从中获取解决方案并重新加载页面(有一个通过更改触发的服务器端操作),该事件随后起作用。我不确定IE的早期版本。它适用于Chrome和FF
function fireEvent(element,event){
if (document.createEventObject){
// dispatch for IE
var evt = document.createEventObject();
element.fireEvent('on'+event,evt);
javascript:location.reload(true);
}
else{
// dispatch for firefox + others
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true ); // event type,bubbling,cancelable
return !element.dispatchEvent(evt);
}
}
或者使用JQuery绑定事件/触发器:)原始问题使用JQuery,并且尝试将事件作为标准属性处理是问题的一部分。为什么IE不只是解析字符串是一大难题……是的,我在尝试使用jQuery的.attr()函数分配onchange事件时遇到了问题。elem.onchange=function(){blah;}的直接DOM赋值对我来说很好。我知道这很旧,但是你的
se.setAttribute(“onchange”,function(){alert('Dynamic')})代码>解决方案不正确,但最后一个是正确的。使用.setAttribute()
时,值将转换为字符串,该字符串将成为所创建函数的主体。因此,在调用函数体时,函数体将最终导致语法错误,因为它将被解释为没有名称的函数声明。Sose.setAttribute(“onchange”、“alert('Dynamic')”)
是使用.setAttribute()
的正确方法,尽管它在IE中可能有缺陷。
function fireEvent(element,event){
if (document.createEventObject){
// dispatch for IE
var evt = document.createEventObject();
element.fireEvent('on'+event,evt);
javascript:location.reload(true);
}
else{
// dispatch for firefox + others
var evt = document.createEvent("HTMLEvents");
evt.initEvent(event, true, true ); // event type,bubbling,cancelable
return !element.dispatchEvent(evt);
}
}