【问题标题】:Replacing jQuery.bind with jQuery.on用 jQuery.on 替换 jQuery.bind
【发布时间】:2012-09-05 13:58:33
【问题描述】:

我编写了一个程序,其中包含用户与之交互的表单。因为有很多事件绑定到不同的按钮,所以我编写了一个循环来解析一些包含表单输入信息的 JS。以下是一些示例数据:

var value = 0,
forms = {
    place_controls : {
        attrs : {
            'class' : 'place-form'
        },
        input : {
            place_x : {
                attrs : {
                    type : 'text',
                },
                events : {
                    change : function () {
                        value = 10;
                    }
                }
            },
            place_y : {
                attrs : {
                    type : 'text',
                },
                events : {
                    change : function () {
                        value = 50
                    }
                }
            }
        }
    }
}

然后通过以下方式解析数据:

    $.each(forms, function (form_index, form) {

    var $form_markup = $('<form>').attr(form.attrs);
    // Next: loop through each input element of the form we've reached
    $.each(form.input, function (element_index, element) {

        var $elem = $('<input>').attr(element.attrs);
        $elem.appendTo($form_markup);

        if (element.events !== undefined) {

            $.each(element.events, function (event_index, event) {

                $elem.bind(event_index, event);
                //$form_markup.on(event_index, $elem, event);
            });
        }
    });

    $form_markup.appendTo($form_goes_here);
});

如您所见,我目前使用的是.bind(),但我想使用.on()。不幸的是,当我这样做时,表单中的所有项目都绑定到函数解析的最后一个事件。当我使用.bind() 时,一切都按计划进行 - 即单击“place_x”将值设置为 10,单击“place_y”将值设置为 50。

当使用.on() 时,无论我更改哪个值,都会将值设置为 50,我假设这是因为最后一个函数正在绑定到每个事件。

谁能看到我做错了什么?

更新:有很多不同的方法可以做到这一点,我随后更改了我的代码的工作方式,但是这个问题与为什么 .bind() 工作以及为什么 .on() 不工作有关。

【问题讨论】:

  • 你为什么要改变它?
  • 您可能应该阅读.prop(),因为它可能是您想要使用的,而不是这里的.attr()
  • 只是因为on()应该更高效,但不管怎样我很困惑为什么它不起作用,现在我真的想修复它!

标签: javascript jquery events binding


【解决方案1】:
//$elem.bind(event_index, event);

//It looks like you should just be using .on() like this
$elem.on(event_index, event);

看起来您尝试使用.on() 的方式类似于实时冒泡事件,看起来只有您创建的最后一个事件是固定的,为什么每个值都设置为 50。

//$form_markup.on(event_index, $elem, event);

【讨论】:

  • “冒泡”方法肯定适合在这里使用吗?我所做的只是事先设置了委托范围。
  • 好吧,如果您要创建这些元素并预先将它们放置在 DOM 中,则不需要委托它们
【解决方案2】:

您可以在一个简单的调用中创建带有包含处理函数的属性映射的元素:

var $elem = $('<input/>', properties);

“属性”对象可以包含事件处理程序:

var $elem = $('<input/>', {
  type: 'text',
  name: 'somethingUseful',
  click: function(ev) { /* click handler */ },
  change: function(ev) { /* change handler */ },
  css: { color: "red" }
});

【讨论】:

  • 这很好用 - 谢谢!但它并没有回答这个问题,所以现在我将保持开放状态以寻求进一步的回应。
  • 是的,你是对的;用.on() 直接替换.bind() 应该 工作...
猜你喜欢
  • 2011-12-30
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多