Javascript jQuery中的Bug';什么是元素创建?
$(文档).ready(函数(){ var_new_li=$(''){ “id”:“p”, “文本”:“单击我”, 单击:函数(){ 警报(“开火”); },Javascript jQuery中的Bug';什么是元素创建?,javascript,jquery,Javascript,Jquery,$(文档).ready(函数(){ var_new_li=$(''){ “id”:“p”, “文本”:“单击我”, 单击:函数(){ 警报(“开火”); }, 数据:{ “somedata”:“somedata”, } })) 当我尝试单击我这样创建的元素时,我收到一个“未捕获类型错误:无法读取未定义的属性“click””。 但是,如果你切换点击:和数据:它工作 $(document).ready(function(){ var _new_li = $('<li/>'
数据:{ “somedata”:“somedata”, }
})) 当我尝试单击我这样创建的元素时,我收到一个“未捕获类型错误:无法读取未定义的属性“click””。 但是,如果你切换点击:和数据:它工作
$(document).ready(function(){
var _new_li = $('<li/>', {
'id': 'p',
'text': 'CLICKME',
data: {
'somedata': 'somedata',
},
click: function(){
alert('fired');
}
});
_new_li.appendTo($("#example"));
});
$(文档).ready(函数(){
var_new_li=$(“”{
“id”:“p”,
“文本”:“单击我”,
数据:{
“somedata”:“somedata”,
},
单击:函数(){
警报(“开火”);
}
});
_新的附录($(“#示例”);
});
对这种行为有什么解释吗
问候
--安迪
附言:
斯威德伯格先生回答说,我早些时候在jQuery核心开发论坛上发布了类似的行为:
我很确定会发生这种情况,因为您正在使用对象设置数据,该对象>(直到1.4.2)将覆盖事件对象。不确定您在项目中使用的是>哪个版本的jQuery,但它看起来像jsbin示例使用的是1.4。请尝试将>升级到1.4.2,看看是否有帮助
但1.4.2重写后似乎仍然存在这个问题
您不应该将逗号放在数据中最后一个(也是唯一一个)元素之后
在尝试了一些东西之后,我得出了以下结论:
$(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"));
});
$(文档).ready(函数(){
var fun=函数(){
警报(“开火”);
};
帕姆斯变种={
“id”:“p”,
“文本”:“单击我”,
“点击”:有趣,
“数据”:{
“somedata”:“somedata”
}
};
console.log(parms);
var_new_li=$(“”,parms);
_新的附录($(“#示例”);
});
在单击li元素之前,一切都正常。然后我得到e未定义(jquery第55行)
。单击和交换数据时效果良好
仍在调查中
并找到了它
jquery开发版本,第1919行
var events=jQuery.data(这个,
“事件”),处理程序=事件[
事件类型]
事件未定义
jquery覆盖存储在数据中的事件
这是一个bug,它应该扩展
我已经提交了一份bug报告。我最后稍微修改了源代码,所以它不会在这里随机爆炸
handle: function( event ) {
...
// tbn modified source
try {
var events = jQuery.data(this, "events"), handlers = events[ event.type ];
} catch(e) {}
// tbn modified source
…然后重新缩小来源
从那时起,我就没有遇到过任何问题.不确定这是否有帮助,但我遇到了类似的问题。我试图将诸如mouseout、click等事件绑定到一个新的LI元素。我不断收到错误“Uncaught TypeError:无法读取undefined的属性“mouseout”。结果是,在将元素附加到t之后,必须绑定诸如click、mouseout等事件他是。不是以前。粗略的例子:
newLI = $('<li />');
$(document.body).append(newLI); // Correct
newLI.click(...);
newLI.mouseout(...);
newLI=$(“”);
$(document.body).append(newLI);//正确
单击(…);
纽利·穆塞特(…);
而不是
newLI = $('<li />');
newLI.click(...);
newLI.mouseout(...);
$(document.body).append(newLI); // Incorrect
newLI=$(“”);
单击(…);
纽利·穆塞特(…);
$(document.body).append(newLI);//不正确
各位..这不是错误..发生的是您需要使用事件数据参数
.click( [ eventData ], handler(eventObject) )
EventData将传递给事件处理程序的数据映射
要知道为什么这是必要的,您可以查看.bind()的jquery文档中的讨论……您可能还需要查看javascript中的“闭包”概念……它提供了整个过程背后的基本原理
本部分特别相关(摘自):
传递事件数据
可选的eventData参数不常用。提供此参数后,我们可以将其他信息传递给处理程序。此参数的一个方便用法是解决闭包引起的问题。例如,假设我们有两个事件处理程序,它们都引用相同的外部变量:
var message = 'Spoon!';
$('#foo').bind('click', function() {
alert(message);
});
message = 'Not in the face!';
$('#bar').bind('click', function() {
alert(message);
});
因为处理程序都是在其环境中都有消息的闭包,所以触发时都会显示非正面消息!变量的值已更改。要避免此情况,我们可以使用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按值传递的,eventData会在绑定事件时修复值。第一个处理程序现在将显示Spoon!而第二个处理程序将不会在脸上发出警报!这似乎是事实。您可能希望提交一个票证,或p这里的ost注释:两种情况下都定义了数据吗?我没有得到错误,但我单击时也没有得到任何结果。当我切换它们时,它确实起作用。我会记录一个错误。@SB“data”是一个属性名,而不是一个值;换句话说,它在冒号的左侧,所以它不会被解释为对变量的引用。@Pointy,“data”,“click”和“text”都被认为是“特殊的”——也就是说,它们中的每一个都会调用相应的jQuery方法。我认为这是一个bug,jAndy,所以我建议报告它。“尝试“click”而不是click,因为它可能与变量冲突。“--什么?它在冒号的左边,因此被解析为标识符--在同一作用域中有一个同名的变量没有什么区别。而且,jQuery不会更改任何本机/主机对象。-1)没有尾随逗号,2)“click”应该完全没有区别。请参见@J-P Yes,但他可能在click中使用了其他东西-这是我无法做到的reproduce@jAndy这里有一个逗号:
'somedata',
。我想帮你。错了吗?
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);
});