IE不允许onClick事件动态创建DOM'a'元素

时间:2009-04-21 09:03:04

标签: javascript css internet-explorer firefox events

我遇到了Internet Explorer的问题。我有一个链接,它复制表单上的文件上传元素。重复的代码还会向重复的上传元素添加一个超链接,该元素应该删除重复的元素,只需删除此链接即可。

问题是这个代码在Firefox中运行良好,但它在IE中根本不运行。忘记如何写出代码 - 我附加到元素的onClick事件根本不会触发!

我在函数中创建了这样的remove链接元素:

var a = document.createElement('a');
a.setAttribute('href', "javascript:void(0);");
a.setAttribute('class', 'delete');
a.setAttribute('onClick', 'removeThisElement(idOfParentContainer, this)');

container.appendChild(a);

这在Firefox中运行良好,但它在IE中根本不会触发。我使用IE检查器检查了dom并且链接已经很好地呈现,但是附加到它的类没有呈现或已经应用,并且即使它已经物理地附加到html上的链接也没有触发事件。出于某种原因,即使它是一个警报,无论我放入什么代码,onClick事件都不会触发。我在这里错过了一些东西。 :(


很高兴通过使用AddEvent附加事件解决了问题的第一部分但是为什么不是css渲染我的意思是附加到元素的类根本没有渲染出于一些奇怪的原因:(


确实是好建议 - 我正在重写我的代码以避免使用setAttribute函数,而是将所有这些DOM操作移植到jquery。感谢帮助人员

5 个答案:

答案 0 :(得分:8)

事件处理程序不是DOM属性,该属性仅存在于标记中 - 我不确定为什么FF会这样做。我将继续研究,因为我想知道。

更新:似乎对eventhandler是否是DOM有效属性感到复杂。在我看来这是MS的错,因为他们内部不会将它们视为属性,而HTML规范表明它们非常多。这样做的直接后果是很多东西!IE会考虑在IE中使用setAttribute设置属性,包括eventhandler绑定,重要的是样式,类和名称。显然IE8修复了这个,但我还没有安装,所以我无法检查。

同时,对于事件绑定,请使用addEventListener/attachEvent对,或者(不太优选,因为它是直接赋值)将a.onclick直接设置为目标方法(或者更可能是方法的闭包)。

要修复未正确应用的样式,请使用element.style = foo;或(更好)element.className = bar

基本上问题是setAttribute。避免使用它。

For reference...

答案 1 :(得分:3)

正如annakata所说,你应该使用addEventListener / attachEvent。但是,如果你不想直接设置onclick,你可以使用:

  a.onclick = function() { removeThisElement(idOfParentContainer, this); };

答案 2 :(得分:1)

只需这样做

var element = document.createElement("input");
element.class = "className";
element.style.display = "none";
element.style.position = "absolute";
element.id = "someid";
element.type = "file";
element.onchange = function(){
                   // do onchange functions here
                   }
// do the following that removes all browser dependecies
$(document.body).append(element);
$("#someid").click(); //click the button programatically using its id
$(element).remove(); // remove the element

答案 3 :(得分:0)

实际上,出于跨浏览器的目的,最好使用Jquery。

$('#exampleCA').createAppend("a", { href: '#', style: "background-color: red;", onclick: 'alert (1);' }, "aaabbb");

这将创建带有文本aaabbb,href =“#”,红色背景和警告事件的标记以供点击。

答案 4 :(得分:0)

如果您正在寻找可重复使用的X浏览器解决方案,以下功能适用于IE,FF和Opera:

  function addEvent( obj, type, fn ) {
    if ( obj.attachEvent ) {
      obj['e'+type+fn] = fn;
      obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
      obj.attachEvent( 'on'+type, obj[type+fn] );
    } else
      obj.addEventListener( type, fn, false );
  }