javascript - JQuery 函数、包装和实时绑定(bind)

标签 javascript jquery bind live

我编写了一个很好的函数来用递增/递减按钮包装输入:

$.fn.qDecInc = function(){
return this.wrap('<span id="qButtons" />').after($('<span/>', { class: 'qIncButton' }).bind('click', function() {
    var ov = 0;
    if (isNaN($(this).val())){
        ov = 0;
    } else {
        ov = $(this).val();
    }
    if (ov < 99){
        var nv = parseFloat(ov) + 1;
        $(this).val(nv);
        $(this).keyup();
        $(this).change();
    }
}), $('<span/>', { class: 'qDecButton', style: 'top: 11px;' }).bind('click', function() {
    var ov = 0;
    if (isNaN($(this).val())){
        ov = 0;
    } else {
        ov = $(this).val();
    }
    if (ov > 0){
        var nv = parseFloat(ov) - 1;
        $(this).val(nv);
        $(this).keyup();
        $(this).change();
    }
}));
}

值会更新,但输入不会更新。 我试过了

$(this).live("change");

甚至

$("body").delegate($(this), "change");

无济于事。 我错过了什么?

http://jsfiddle.net/MVxsA/1/ - 为了您的方便,这里有一个 jsfiddle。

最佳答案

两个问题

  1. 在这种情况下,您应该使用 .bind('click', function() {...}) 而不是 live()。或者您可以使用方便的快捷方法 .click(function() {...})。当稍后将元素添加到 dom,并且您希望 jQuery 在那时自动将监听器附加到新元素时,将使用函数 live()。因此,live() 还需要一个选择器(您的示例中省略了该选择器)。

  2. 在事件处理程序内部时,this 指的是触发监听器的元素。因此,在本例中,this 是 qIncButton 或 qDecButton,不是应用插件的元素。

以下是解决这些问题的方法:

$.fn.qDecInc = function(){
    var self = this;
    return self.wrap('<span id="qButtons" />').after($('<span/>', { class: 'qIncButton' }).click(function() {
        console.log("up");
        var ov = 0;
        if (isNaN($(self).val())){
            ov = 0;
        } else {
            ov = $(self).val();
        }
        if (ov < 99){
            var nv = parseFloat(ov) + 1;
            $(self).val(nv);
            $(self).keyup();
            $('body').change();
        }
    }), $('<span/>', { class: 'qDecButton', style: 'top: 11px;' }).click(function() {
        console.log("down");
        var ov = 0;
        if (isNaN($(self).val())){
            ov = 0;
        } else {
            ov = $(self).val();
        }
        if (ov > 0){
            var nv = parseFloat(ov) - 1;
            $(self).val(nv);
            $(self).keyup();
            $(self).change();
        }
    }));
}

Your updated jsFiddle is here

关于javascript - JQuery 函数、包装和实时绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630983/

相关文章:

javascript - tampermonkey 中的 "instant inject"是如何工作的?

javascript - 单击特定行内的按钮时获取行值

javascript - 我应该向这个 JavaScript 函数传递什么参数?

java - 地址重用在新的 Java 运行时环境中不起作用

c - 如何通过 mount(2) 函数挂载带有子挂载的目录?

javascript - 如何使用 Javascript 在 Bootstrap 4 上检测屏幕尺寸或查看端口

javascript - 在 XmlHttpRequest ReadyState 4 中调用 chrome ChooseEntry

javascript - 在 drop() 中访问加载的表

jquery - Phonegap jquery ajax 表单提交不起作用

jquery - 为非匿名函数绑定(bind) this 关键字