【问题标题】:How to stop removing added class on click again on the element?如何在再次单击元素时停止删除添加的类?
【发布时间】:2018-03-22 12:39:20
【问题描述】:

我的页面上有尺寸样本。当我单击样本“选定”类添加到单击的样本。 如果我再次单击,则添加的类将被删除。

我想在再次单击该元素时停止删除该类。

HTML:

<div class="swatch-attribute-options clearfix">
<div class="swatch-option text selected" option-type="0" option-id="143" option-label="L" option-tooltip-thumb="" option-tooltip-value="L">L</div>
<div class="swatch-option text" option-type="0" option-id="142" option-label="XL" option-tooltip-thumb="" option-tooltip-value="XL">XL</div>
</div>

【问题讨论】:

  • 用来添加类的jquery代码在哪里?
  • 不知道,从哪里来的?
  • 你的意思是点击时执行的代码不是你的吗?
  • 是的,这不是我编码的。我想在同一元素上再次单击时停止删除该类。
  • @OwaisAslam:我怀疑该行为来自 OP 包含的插件。无论如何,您可以简单地禁用 click 事件来避免它。只需在您的 javascript 末尾包含 $(".swatch-attribute-options .swatch-option").on("click", function() {$(this).off("click")})

标签: jquery magento2.1


【解决方案1】:

如果删除selected 类的代码来自外部处理程序,请尝试将此代码放在您确定会在该处理程序之前运行的位置(最好在您的包含中尽可能高)。

请注意,这也会取消外部处理程序中的任何其他操作

这是一个示例,说明如何防止不受欢迎的代码运行。我包括了两个处理程序,第二个不应该作为演示你不需要的代码应该发生什么而运行。

让我知道它是否有效

$('.swatch-option').click(function(e){
  e.stopImmediatePropagation();
  $(this).addClass("selected").siblings('.swatch-option').removeClass('selected');
  alert('notice how "unwanted code" does not run');
});

$('.swatch-option').click(function(e){
  alert('unwanted code');
});
.selected{
  background: red
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="swatch-attribute-options clearfix">
<div class="swatch-option text selected" option-type="0" option-id="143" option-label="L" option-tooltip-thumb="" option-tooltip-value="L">L</div>
<div class="swatch-option text" option-type="0" option-id="142" option-label="XL" option-tooltip-thumb="" option-tooltip-value="XL">XL</div>
<div class="swatch-option text selected" option-type="0" option-id="143" option-label="L" option-tooltip-thumb="" option-tooltip-value="L">L</div>
<div class="swatch-option text" option-type="0" option-id="142" option-label="XL" option-tooltip-thumb="" option-tooltip-value="XL">XL</div>
<div class="swatch-option text" option-type="0" option-id="143" option-label="L" option-tooltip-thumb="" option-tooltip-value="L">L</div>
<div class="swatch-option text" option-type="0" option-id="142" option-label="XL" option-tooltip-thumb="" option-tooltip-value="XL">XL</div>
<div class="swatch-option text selected" option-type="0" option-id="143" option-label="L" option-tooltip-thumb="" option-tooltip-value="L">L</div>
<div class="swatch-option text" option-type="0" option-id="142" option-label="XL" option-tooltip-thumb="" option-tooltip-value="XL">XL</div>

</div>

【讨论】:

  • 使用此代码后,我无法将产品添加到购物车中。
  • 所以确实不需要的代码在你的之后运行,它不仅仅是切换selected类,对吧?所以你需要一个解决方案,只阻止类的切换,但保留所有其他行为,对吗?
  • 这是因为e.stopImmediatePropagation() 阻止了其余处理程序在click 事件中执行。
  • 我们可以使用 e.stopImmediatePropagation() 的替代方法
【解决方案2】:

看起来该行为来自您正在使用的库。要覆盖该行为,只需在第一次单击后禁用 click 事件回调。但请注意,这也会禁用在您的 click 回调中定义的任何其他操作。

原始答案: (此解决方案对于 OP 将失败,因为从 cmets 中可以明显看出,click 事件在选择后具有更多句柄。请参阅底部答案的更新我的帖子) 在页面上的 javascript 末尾添加:

$(".swatch-attribute-options .swatch-option").on("click", function() {
  $(this).off("click");
});

Demo fiddle here

如果您怀疑回调中有更多事件,只需再次添加类selected。这将暂时删除选择,但几乎会立即将其添加回来,除非在处理 click 事件的插件代码中有任何耗时的活动。

$(".swatch-attribute-options .swatch-option").on("click", function() {
    $(this).addClass("selected"));
});

根据评论更新: 这应该保留唯一的最后一个选择,并且如果再次单击不会取消选择。此外,它不会阻止 click 事件中的任何后续句柄

$(".swatch-attribute-options .swatch-option").on("click", function() {
    $(this).siblings(".swatch-option").removeClass("selected");
    $(this).addClass("selected");
});

Updated Fiddle

【讨论】:

  • 我只想一次选择一个
  • 你的意思是只选择一个色板并取消选择任何以前选择的色板?
  • 是的,同样的元素没有被再次点击。
  • 这里有两个样本,加载后没有选择任何内容。当我们选择样本时,添加了“选定的类”,但是当我们再次单击时,该元素取消选择。如果用户选择样本,则必须至少选择其中一个
  • 检查更新的答案。要删除加载时的所有选择,只需从 HTML 中的霜色样本中删除 selected 类。见this fiddle
猜你喜欢
  • 2017-09-10
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 2021-07-19
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多