1

我有这段 jQuery。#mydiv是否可以从这段代码之外确定元素是否已被“单击”。

JSFIDDLE

$.fn.clicktoggle = function(a, b) {
    return this.each(function() {
        var clicked = false;
        $(this).bind("click", function() {
            if (clicked) {
                clicked = false;
                return b.apply(this, arguments);
            }
            clicked = true;
            return a.apply(this, arguments);
        });
    });
};

function odd() {
    alert("odd");
}

function even() {
    alert("even");
}

$("#mydiv").clicktoggle(even, odd);
4

1 回答 1

2

是否可以确定 #mydiv 元素是否已从这段代码外部“单击”。

不,据我从您引用的代码中可以看出,该信息仅存储在函数调用的执行上下文中包含的clicked变量(each迭代器函数中的变量)中。该信息对于该上下文是完全私有的。

修改代码以使信息可用是很容易的。例如:

$.fn.clicktoggle = function(a, b) {
    return this.each(function() {
        var $this = $(this);
        $this.bind("click", function() {
            if ($this.attr("data-clicked")) {
                $this.attr("data-clicked", "");
                return b.apply(this, arguments);
            }
            $this.attr("data-clicked", "Y");
            return a.apply(this, arguments);
        });
    });
};

更新小提琴

在那里,我们不是将状态存储在clicked变量中,而是将其存储为data-clicked元素上的属性(""如果未单击,则为 [a “falsey” value],如果单击,"Y"则为 [a “truthy” value])。然后,您可以通过执行以下操作从外部了解其状态:

if ($("#mydiv").attr("data-clicked")) {
    // It has the "clicked" state
}
else {
    // It has the un-"clicked" state
}

但是,如果信息完全存储在变量中,就像您显示的代码一样,那么该信息对“外部”是完全隐藏的。

于 2013-04-10T21:31:13.817 回答