Javascript Jquery属性选择器单击

Javascript Jquery属性选择器单击,javascript,jquery,html,Javascript,Jquery,Html,我正在尝试选择具有特定属性的div。我希望仅当存在具有true值的特定attribute时,才单击div。问题是,如果我再次单击div,则警报仍会显示,而它具有具有false值的属性 HTML 当前代码的问题是当元素具有属性时附加事件。之后更改属性的事实不会删除该事件处理程序,因此始终会调用它 有几种方法可以解决这个问题 第一种方法是使用委托事件处理程序,它将始终考虑当前属性值: $(document).on('click', 'a[data-spinner="true"]', function

我正在尝试选择具有特定属性的
div
。我希望仅当存在具有
true
值的特定
attribute
时,才单击
div
。问题是,如果我再次单击
div
,则警报仍会显示,而它具有具有
false
值的
属性

HTML


当前代码的问题是当元素具有属性时附加事件。之后更改属性的事实不会删除该事件处理程序,因此始终会调用它

有几种方法可以解决这个问题

第一种方法是使用委托事件处理程序,它将始终考虑当前属性值:

$(document).on('click', 'a[data-spinner="true"]', function() {
    $(this).attr("data-spinner", false);
    alert("clicked");
});
另一种方法是检查单击处理程序本身中属性的状态:

$("a[data-spinner]").click(function() {
    if ($(this).data('spinner')) {
        $(this).data('spinner', false)
        alert("clicked");
    });
});
请注意,此方法允许您使用
data()
方法,这被认为是更好的做法


您还可以在第一次单击时使用
off()
删除事件处理程序,或者仅使用
one()
附加事件-这取决于页面中设置
数据
attributes'值的其他逻辑。

当前代码的问题是,在元素具有属性时附加事件。之后更改属性的事实不会删除该事件处理程序,因此始终会调用它

有几种方法可以解决这个问题

第一种方法是使用委托事件处理程序,它将始终考虑当前属性值:

$(document).on('click', 'a[data-spinner="true"]', function() {
    $(this).attr("data-spinner", false);
    alert("clicked");
});
另一种方法是检查单击处理程序本身中属性的状态:

$("a[data-spinner]").click(function() {
    if ($(this).data('spinner')) {
        $(this).data('spinner', false)
        alert("clicked");
    });
});
请注意,此方法允许您使用
data()
方法,这被认为是更好的做法


您还可以在第一次单击时使用
off()
删除事件处理程序,或者仅使用
one()
附加事件-这取决于页面中设置
数据
属性值的其他逻辑。

当您更改
数据spnner
的值时,jQuery不会重新声明事件。 您必须以编程方式处理该问题,如下所示:

$("a[data-spinner]").click(function() {
    var $this = $(this);

    if($this.data('spinner')){
        alert("clicked");
    }

    $this.data('spinner',false);    
});

更改
data spnner
的值时,jQuery不会重新声明事件。 您必须以编程方式处理该问题,如下所示:

$("a[data-spinner]").click(function() {
    var $this = $(this);

    if($this.data('spinner')){
        alert("clicked");
    }

    $this.data('spinner',false);    
});

我想补充Rory McCrossan的回答,因此,您还应该使用以下方法取消设置属性:


我想补充Rory McCrossan的回答,因此,您还应该使用以下方法取消设置属性:


请在第一次单击后删除事件处理程序,或使用事件委派。请在第一次单击后删除事件处理程序,或使用事件委派。您刚刚击败了我:)您刚刚击败了我:)