(文档)$。就绪(函数(){
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
中答案 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