jQuery的元素创建中的错误?

时间:2010-04-26 12:56:07

标签: javascript jquery

(文档)$。就绪(函数(){         var _new_li = $('',{           'id':'p',           'text':'CLICKME',           click:function(){               警报( '解雇');           },
          数据:{               'somedata':'somedata',           }
        });

_new_li.appendTo($("#example"));
});

当我尝试单击我创建的元素时,我收到“未捕获的TypeError:无法读取属性”单击“未定义”。 但是,如果你切换点击:和数据:它可以工作。

$(document).ready(function(){
    var _new_li     = $('<li/>',     {
      'id':     'p',
      'text':   'CLICKME',
      data:     {
          'somedata':  'somedata',
      },
      click:    function(){
          alert('fired');
      }                      
    });

_new_li.appendTo($("#example"));
});

对该行为的任何解释?

亲切的问候

- 安迪

PS:

我在jQuery核心开发论坛早些时候发布了类似的行为,Swedberg先生在那里回答:

  

我很确定这种情况正在发生,因为您正在使用对象设置数据,其中&gt;(直到1.4.2)将覆盖事件对象。不确定您在项目中使用哪个版本的jQuery,但看起来jsbin示例使用的是1.4。尝试将&gt;升级到1.4.2并查看是否有帮助。

但似乎问题仍然存在于1.4.2

4 个答案:

答案 0 :(得分:5)

重新发布。

你不应该把这个逗号放在数据中的最后一个(也是唯一的)元素之后。

在尝试了一些东西后,我得到了这个:

$(document).ready(function(){
    var fun=function(){
          alert('fired');
      };
    var parms={
      'id':     'p',
      'text':   'CLICKME',     
      'click':fun,         
      'data':     {
          'somedata':  'somedata'
      }
      };
      console.log(parms);
    var _new_li = $('<li/>',parms);

_new_li.appendTo($("#example"));
});

一切正常,直到我点击li元素。然后我得到e is undefined (jquery line 55)。单击点击和数据时效果很好。

仍在调查

并找到了

jquery开发版,第1919行

  

var events = jQuery.data(this,   “events”),handlers = events [   event.type];

事件未定义。

jquery会覆盖存储在数据中的事件。

所以这是一个错误。它应该扩展。

我提交了一份错误报告。

答案 1 :(得分:2)

伙计..这不是错误..发生的事情是您需要使用事件数据参数

.click( [ eventData ], handler(eventObject) )

eventDataA将传递给事件处理程序的数据映射。

要知道为什么有必要你可以查看.bind()的jquery文档中的讨论..你可能还想在javascript中查看“闭包”的概念..它提供了整个事情背后的基本原理

这部分特别相关(摘自http://api.jquery.com/bind/):

传递事件数据

不常用可选的eventData参数。提供时,此参数允许我们将其他信息传递给处理程序。使用此参数的一个方便是解决由闭包引起的问题。例如,假设我们有两个事件处理程序,它们都引用相同的外部变量:

var message = 'Spoon!';
$('#foo').bind('click', function() {
  alert(message);
});
message = 'Not in the face!';
$('#bar').bind('click', function() {
  alert(message);
});

因为处理程序是在它们的环境中都有消息的闭包,所以它们都会显示消息Not in the face!触发时变量的值已更改。为了回避这个问题,我们可以使用eventData传递消息:

var message = 'Spoon!';
$('#foo').bind('click', {msg: message}, function(event) {
  alert(event.data.msg);
});
message = 'Not in the face!';
$('#bar').bind('click', {msg: message}, function(event) {
  alert(event.data.msg);
});

这次变量不直接在处理程序中引用;相反,变量通过eventData传递,它固定了绑定事件时的值。第一个处理程序现在将显示Spoon!而第二个会警告不要在脸上!

答案 2 :(得分:1)

我最后稍微修改了源代码,所以它不会随意爆炸。

handle: function( event ) {
...

// tbn modified source
try {
   var events = jQuery.data(this, "events"), handlers = events[ event.type ];
} catch(e) {}
// tbn modified source

..然后重新缩小了源

从那以后我没有遇到任何问题。

答案 3 :(得分:0)

不确定这是否有帮助,但我遇到了类似的问题。我试图将诸如mouseout,click等事件绑定到一个新的LI元素。我一直收到错误'未捕获的TypeError:无法读取属性'mouseout'的undefined'。事实证明,你必须绑定像click,mouseout等事件......在你将元素附加到DOM之后。不是之前。粗略的例子:

newLI = $('<li />');
$(document.body).append(newLI); // Correct
newLI.click(...);
newLI.mouseout(...);

而不是

newLI = $('<li />');
newLI.click(...);
newLI.mouseout(...);
$(document.body).append(newLI); // Incorrect