Jquery:委托和这个

时间:2011-12-08 22:57:44

标签: jquery

有了这样的jQuery snipplet,我真的需要提高质量:

$foo.focus(function() {
    if (!user_input)
    {
        jQuery(this).val('');
        user_input = true;
    }
    else
    {
        jQuery(this).live("mouseup", function () {
            $(this).select();
        });
    }
})

如何将实时部分更改为委托?我对指向父元素的部分感到困惑。

2 个答案:

答案 0 :(得分:2)

我知道这个帖子超级老了,但我遇到了一个特殊的问题,这个帖子出现在搜索结果中。如果我正确理解了这个问题,那么使用jQuery的on()方法的委托功能以及这个所指的内容会产生混淆。也许这会帮助找到这个帖子的其他人。

鉴于以下代码:

$('#parentElement').on('click', '.childElement', function(){
    console.log(this);
});

通过委派事件,您可能会想到 this 将指向父元素(#parentElement),但事实并非如此。 仍然引用被点击的元素(.childElement)(或任何事件侦听器)。

对于大多数元素,单击它们会触发单击事件,但该事件会“冒泡”到父元素。委托背后的想法是事件监听器是父元素,因为不能不是动态元素。如果随后动态添加子元素,则单击它们也会在其父元素上触发事件。

使用on()方法的附加“.selector”参数将限制执行回调(function(){}代码块)到“.selector”jQuery对象中的元素。

答案 1 :(得分:0)

要从.live()转换为.delegate(),您只需拥有一个外部容器。

jQuery("selector").live("mouseup", function () {})

相当于

jQuery(document).delegate("mouseup", "selector", function() {})

使用委托的好处是您可以定位何时捕获该事件。 .live()一直向document冒泡,但是对于委托,您可以在包含div的某些内容中阻止它。

在您的方案中,只需将document替换为包含$foo的内容。

这回答了您的问题,但实际上,您应该在功能上包含您的功能,尝试使用该代码实现,以便我们更好地帮助您。

我唯一的猜测是,您希望在用户点击文本框时突出显示文字?

另外:如果你有jQuery 1.7,请改用.on()。它取代了.bind(),. live()和.delegate()