【问题标题】:Only allow listener event to run if class exists in Javascript仅当 Javascript 中存在类时才允许运行侦听器事件
【发布时间】:2014-12-31 14:17:50
【问题描述】:

我已经构建了一个进度条 Javascript 对象,当用户单击绑定了“单击”事件侦听器的左右按钮时,该对象会更新进度条。 我只希望这些按钮在它们附加了某个类时触发点击事件,在这种情况下是一个名为“progress-bar-ok”的类。 到目前为止,我似乎想不出在我的代码中执行此操作的方法。这是我的代码:

Javascript 对象:

//Progress Bar
var ProgressBar = function(element, startVal, endVal, step, addLefts, addRights) {
    this.element = element;
    this.endVal = endVal;
    this.currentVal = startVal;
    this.step = step;
    this.addLefts = addLefts;
    this.addRights = addRights;
    var self = this;    
}

ProgressBar.prototype.initializeProgressBar = function() {
    jQuery(this.element).progressbar({
        value : this.currentVal,
        max   : this.endVal,
        step  : this.step
    });
    for(var i = 0; i < this.addLefts.length; i++) {
        this.addLefts[i].addEventListener("click", this.removeAmount.bind(this), false);
    }   
    for(var i = 0; i < this.addRights.length; i++) {
        this.addRights[i].addEventListener("click", this.addAmount.bind(this), false);
    }   
}

ProgressBar.prototype.addAmount = function() {  
    if(this.currentVal < this.endVal) {
        this.currentVal += this.step;       
        this.update();
    }       
}

ProgressBar.prototype.removeAmount = function() {
    console.log(self);
    if(this.currentVal > 0) {
        this.currentVal -= this.step;
        this.update();
    }

}

ProgressBar.prototype.update = function() {
    jQuery(this.element).progressbar({
        value : this.currentVal
    });
}

Javascript 客户端代码

//Progress Bar
        var addLefts = document.getElementsByClassName("btn-lft");
        var addRights = document.getElementsByClassName("btn-right");
        var progressBar = new ProgressBar("#progress-bar", 0, jQuery(".signup-part").length, 1, addLefts, addRights);
        progressBar.initializeProgressBar();

如您所见,“addLefts”和“addRights”附加了点击侦听器,如果“progress-bar-ok”类存在,我只想触发“addAmount”和“removeAmount”函数。 有没有办法将它合并到我的代码中? 谢谢

【问题讨论】:

  • “那个”类?什么级别?什么活动?
  • @KevinB 阅读文章顶部,类是'progress-bar-ok',事件注册在initializeProgressBar函数中。

标签: javascript jquery oop prototype


【解决方案1】:

您可以像这样检查DOM中是否存在具有类的元素

if ($('.progress-bar-ok').length) {
    your code
}

【讨论】:

  • 嗨。谢谢。我知道我只想将功能保留在我的对象中。
  • 好的,那么你可以检查你的对象是否有类 if ($(this).hasClass('progress-bar-ok')) { your code }
【解决方案2】:

如果您使用 jQuery 创建事件处理程序,您可以利用Delegated Events,它只会在目标具有您指定的类时触发。在这种情况下,您可以使用 ".progress-bar-ok" 作为选择器,并且只有具有该类的项目才会触发事件。

以下是更新的部分代码:

ProgressBar.prototype.initializeProgressBar = function() {
    jQuery(this.element).progressbar({
        value : this.currentVal,
        max   : this.endVal,
        step  : this.step
    });

    var removeAmount = this.removeAmount.bind(this);
    $(addLeft).on("click", ".progress-bar-ok", function() {
        removeAmount();
    });

    var addAmount = this.addAmount.bind(this);
    $(addRights).on("click", ".progress-bar-ok", function() {
        addAmount();
    });
}

var progressBar = new ProgressBar("#progress-bar", 0, jQuery(".signup-part").length, 1, ".btn-lft", ".btn-right");

我已经更改了您的构造函数以接收您想要定位的类的 jQuery 选择器,您可以看到我是如何使用 jQuery 附加事件处理程序的。

我还整理了一个简单的可运行示例来展示这种效果。我在下面有两个&lt;ul&gt; 标签,它们使用你的类btn-lftbtn-right。我在每个&lt;ul&gt; 中生成了随机数量的项目。每个&lt;li&gt; 可以随机分配一个progress-bar-ok 类。单击该类的项目时,父&lt;ul&gt; 被清除并再次随机填充。单击没有类progress-bar-ok 的项目时,什么也没有发生。运行下面的sn-p看看。

$(function() {
  //generate arbitrary ul content
  generateSide($(".btn-lft"));
  generateSide($(".btn-right"));
});

$(".btn-lft,.btn-right").on("click", ".progress-bar-ok", function() {
  //this is a delegated event, it handles dynamically created items too!
  var ul = $(this).parent();
  generateSide(ul);
});

function generateSide(ul) {
  //add random content to the ul
  var side = ul.hasClass("btn-lft") ? "Left" : "Right";
  ul.empty(); //clear ul
    
  var numberSelected = 0;
  var newItems = Math.ceil(Math.random() * 10);
  for(var i = 0; i < newItems; i++) {
    var li = $("<li>" + side + " " + (i + 1) + "</li>");
    if (Math.random() > 0.5 || (numberSelected === 0 && i === newItems - 1 ))
      li.addClass("progress-bar-ok");
    ul.append(li);
  }
}
ul {
  float:left;
  width: 100px;
}
.progress-bar-ok {
  color: #4AF;
  cursor: pointer;
}
.progress-bar-ok:hover {
  text-shadow: 0 0 2px blue;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="btn-lft">
  <li class="selected">Left 1</li>
</ul>
<ul class="btn-right">
  <li class="selected">Right 1</li>
</ul>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 2012-04-01
    • 2019-01-02
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多