2010-01-08 67 views
0

在阅读本书中的jQuery in Action和处理第一个事件处理示例时,我发现jQuery不会一致地克隆DOM Level 0事件。它克隆内联事件,但不包括那些定义为属性的事件。阻止使用内联事件处理程序可能是件好事,但是是否有意设计?什么是想从遗留页面克隆一些东西?jQuery克隆:它应该克隆DOM级别0事件吗?

下面是本书中给出的例子的一个变化,以说明行为。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
    <head> 
    <title>DOM Level 0 Events Example</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"> 
    </script> 
<script type="text/javascript"> 
    $(function(){ 
    $('#testElement')[0].onclick = function(event) { 
     say(this.id + ' Click ASSIGN [DOM 0]'); 
    } 
      $('#testElement').click(function() { say(this.id + ' Click JQUERY [DOM 2]');}); 
      $('#testElement').clone(true).attr('id',"clonedElement").insertAfter($('#testElement')); 
    }); 

    function say(text) { 
    $('#console').append('<div>'+text+'</div>'); 
    } 
    </script> 
    </head> 

    <body> 
    <div id="testElement" style="border: solid brown 1px; margin: 10px; width : 100px; height: 100px;" onclick="say(this.id + ' Click INLINE [DOM 0]')">&nbsp;</div> 
<div id="console"></div> 
</body> 
</html> 

回答

1

线305至312中的“jQuery的1.3.2.js

“ ”当使用 “cloneNode”。调用 “detachEvent在克隆的attachEvent” IE“ 通过结合复制事件” 也将除去来自orignal的事件为了解决这个问题,我们使用了“innerHTML”,不幸的是,这意味着在“IE”中对实际只存储为属性的属性的一些修改不会被复制(例如name属性在on一个输入)

因为解释原因,在IE中不能工作的例子我们应该修改jQuery的“克隆”方法t Ø在IE浏览器具有此功能

编辑:

好吧,我很抱歉,现在我明白了这个问题,但是从我所看到的,哪些是你可以查看“clonedElement_2”是的“限制cloneNode”。 我唯一能想到的就是改变“jQuery”的方法“克隆”

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> 
    <script language="JavaScript"> 

     (function($){ 

      $.fn.__extendClone = $.fn.clone; 
      $.fn.clone = function(events){ 

       var ret = $(this).__extendClone(events); 

       if (events){ 

        var listEvents = ["onabort", "onblur", "onchange", "onclick", "ondblclick", "onerror", "onfocus", 
         "onkeydown", "onkeypress", "onkeyup", "onload", "onmousedown", "onmousemove", "onmouseout", 
         "onmouseover", "onmouseup", "onreset", "onresize", "onselect", "onsubmit", "onunload"]; 

        for (var inde in listEvents){ 
         if ($.isFunction($(this)[0][listEvents[inde]])){ 
          $(ret)[0][listEvents[inde]] = $(this)[0][listEvents[inde]]; 
         } 
        } 
       } 

       return ret; 

      }; 

     })(jQuery);  

     $(function() 
     { 
      //work 
      var mytestElement = document.getElementById("testElement") 
      mytestElement.setAttribute("style", "border: solid green 2px; margin: 10px; width : 100px; height: 100px;"); 

      //don't twork 
      $('#testElement')[0].onclick = function(event) { 
       say(this.id + ' Click ASSIGN [DOM 0]'); 
      } 

      $('#testElement').click(function() { say(this.id + ' Click JQUERY [DOM 2]');}); 

      //clone jquery 
      $('#testElement').clone(true).attr('id',"clonedElement").insertAfter($('#testElement')); 

      //clone js 
      var myNode = document.getElementById("testElement").cloneNode(true); 
      myNode.setAttribute("id", "clonedElement_2"); 
      myNode.setAttribute("style", "border: solid blue 2px; margin: 10px; width : 100px; height: 100px;"); 
      document.getElementById("container").appendChild(myNode); 

     }); 

     function say(text) { 
      $('#console').append('<div>'+text+'</div>'); 
     } 

    </script> 
</head> 
<body> 
    <div id="testElement" style="border: solid brown 2px; margin: 10px; width : 100px; height: 100px;" onclick="say(this.id + ' Click INLINE [DOM 0]')">&nbsp;</div> 
    <div id="container"></div> 
    <div id="console"></div> 
</body> 
</html> 
+0

它也不是真的在非IE浏览器中工作。内联事件处理程序被赋值onclick = ....覆盖,但内联事件处理程序,而不是属性分配被复制到FF和chrome中的克隆。 – 2010-01-08 19:12:04

+0

我编辑答案 – 2010-01-08 20:59:17

+0

感谢您的解决。我想知道是否应该将这个错误提交给好的jQuery人员。 – 2010-01-08 21:11:44