Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery中的Bug';什么是元素创建?_Javascript_Jquery - Fatal编程技术网

Javascript jQuery中的Bug';什么是元素创建?

Javascript jQuery中的Bug';什么是元素创建?,javascript,jquery,Javascript,Jquery,$(文档).ready(函数(){ var_new_li=$(''){ “id”:“p”, “文本”:“单击我”, 单击:函数(){ 警报(“开火”); }, 数据:{ “somedata”:“somedata”, } })) 当我尝试单击我这样创建的元素时,我收到一个“未捕获类型错误:无法读取未定义的属性“click””。 但是,如果你切换点击:和数据:它工作 $(document).ready(function(){ var _new_li = $('<li/>'

$(文档).ready(函数(){ var_new_li=$(''){ “id”:“p”, “文本”:“单击我”, 单击:函数(){ 警报(“开火”); },
数据:{ “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);
    });