在可能多次调用的事件上只调用一次特定函数?

时间:2011-10-28 01:45:33

标签: jquery

我有一个实时点击功能,需要始终执行certian事项,但有一件事必须只在第一次点击时执行,之后,需要禁用它。

$('.theImage').live("click", function(){ 
            // The commands within the if statement must only happen on the first click.
    if (!chkHeightOnceOnly){
        var containerHeight = $(this).children(".postInfo").height();
        $(this).children(".postInfo").height(containerHeight - 2);
        var chkHeightOnceOnly = true; 
    }
            // other commands which need to fire on every click go here
});

所以目前每次点击div,它都会减去2px。它只需要第一次减去2px。

编辑 - 这是针对.theImage的许多实例,它们是通过ajax进入的,因此需要.live()

4 个答案:

答案 0 :(得分:4)

如果您希望此内存属性基于每个节点,请使用每个节点的jQuery data property

$('.theImage').live('click', function() {
    var $obj = $(this);

    // Allow handler to run only once per element
    if ($obj.data('chkHeightOnceOnly')) {
       return;
    }
    $obj.data('chkHeightOnceOnly', true);

    // Interesting stuff
    var containerHeight = $obj.children('.postInfo').height();
    $obj.children('.postInfo').height(containerHeight - 2);
});

答案 1 :(得分:4)

我会将标记存储在HTML标记本身中。

$('.theImage').live("click", function(){ 
    // The commands within the if statement must only happen on the first click.
    if ($(this).attr('data-once')!='already' ){
        var containerHeight = $(this).children(".postInfo").height();
        $(this).children(".postInfo").height(containerHeight - 2);

        $(this).attr('data-once', 'already');
    }
    // other commands which need to fire on every click go here
});

答案 2 :(得分:1)

您应该在函数范围之外声明chkHeightOnceOnly。目前,声明属于功能范围。这样,每次都会重置该值。

var chkHeightOnceOnly = false;

$('.theImage').live('click', function() { 
    if (!chkHeightOnceOnly) {
        var containerHeight = $(this).children('.postInfo').height();
        $(this).children('.postInfo').height(containerHeight - 2);

        chkHeightOnceOnly = true; 
    }
});

答案 3 :(得分:0)

这是通过使用.live()和仅用于一次性触发的特殊类的组合来实现此目的的另一种方法。第一次单击时,删除特殊类,使对象不再与.live()选择器规范匹配。

$(".fireOnce").live("click", function() {
    $(this).removeClass("fireOnce");
    // do your other stuff here
});

你可以在这里看到它:http://jsfiddle.net/jfriend00/KU6wZ/