【问题标题】:jQuery preventDefault on first click onlyjQuery preventDefault 仅在第一次点击时
【发布时间】:2014-02-12 10:55:32
【问题描述】:

我一直在为我的客户购物网站上的附加功能开发一些 jQuery。我被要求创建一个快速购买按钮,该按钮位于从 Locatya 拉入的类别页面上的产品顶部 - 到目前为止非常简单。

对于桌面站点,以下代码可以完美运行:

jQuery('#main_cat_prods').delegate('img', 'mouseenter', function(){
                var $skuID = this.src.match(/[a-z][a-z][a-z]\d\d\d\d\d/)[0];

            if ( !jQuery('#QuickBuyProdBox').length ) {
                jQuery(this).closest('.image').prepend('<div id="QuickBuyProdBox">');
            };
                jQuery("#QuickBuyProdBox").click(function(){
                    jQuery.event.trigger('lightbox', $skuID);
                });
                jQuery('.image, #QuickBuyProdBox').mouseleave(function(){
                    jQuery('#QuickBuyProdBox').remove();
            });
        });

现在,当尝试在平板电脑上开发稍微不同的功能时,困难就来了;我的客户希望在 QuickBuyProdBox 之前单击一下,然后再轻点一下:

如果在 QuickBuyProdBox 外部单击,则继续正常进入产品页面 如果单击 QuickBuyProdBox,则启动灯箱。

我首先在努力:

防止类别页面上 img 的默认行为,我尝试了 preventDefault 但这会停止 main_cat_prods div 上的所有点击事件。我还尝试为第一个实例绑定单击然后解除绑定,这似乎也不起作用:

jQuery("#main_cat_prods").bind('img', 'click', function( event) {
            if ( !jQuery('#QuickBuyProdBox').length ) {
                jQuery(this).closest('.image').prepend('<div id="QuickBuyProdBox">');
            };
            console.log("this works");
            event.preventDefault();
            jQuery(this).unbind( event );
        });

总而言之,上面的代码不起作用。我需要能够:

单击 main_cat_prods div 并在添加 QuickBuyProdBox 时阻止默认功能。 能够单击 main_cat_prods 或 QuickBuyProdBox 通过单击(此)img 外部或单击另一个产品来删除 QuickBuyProdBox。

有什么建议吗?

如果这没有意义,请告诉我,我可以尝试改写它!

干杯, 迈尔斯

【问题讨论】:

  • 你可以缩短你的问题。
  • 尝试使用使用.one() 注册的处理程序来阻止默认操作 - 这样它只会执行一次
  • @ArunPJohny 那么该功能将不起作用。 OP 只想第一次阻止默认设置,而不是它的功能。
  • @C-link 这就是我的意思,使用.one() 编写一个单独的处理程序,其中只有一行说阻止像$(selector).one('click', function(e){e.preventDefault()}) 这样的默认操作
  • 处理代码的主函数将有其余的函数 - 阻止默认代码

标签: jquery click preventdefault


【解决方案1】:

使用$.data 存储计数器,然后在第一次点击时递增计数器。
在事件处理程序中,将阻止默认逻辑包装在 if 中,在继续之前检查计数器值。

jQuery("#main_cat_prods img").data('clicked', 0);
jQuery("#main_cat_prods").bind('img', 'click', function( event) {
   var state = $(this).data('clicked') || 0;
   if(state === 0){
      // this will only happen the first time
      event.preventDefault();
      state++; // <-- we increment the state
      $(this).data('clicked', state);// <-- and store it back in data
   }
   // other code
});

这还有一个额外的好处,就是不需要您声明全局变量。


编辑

这可能会更好:

jQuery("#main_cat_prods img").data('clicked', 0);
jQuery("#main_cat_prods").bind('img', 'click', function( event) {
   var state = $(this).data('clicked') || 0;
   if(state === 0){
      // this will only happen the first time
      event.preventDefault();
      event.stopPropagation();
      state++; // <-- we increment the state
      $(this).data('clicked', state);// <-- and store it back in data
      return; // <-- we stop the rest of the handler from running
   }
   // other code
});

【讨论】:

  • 好东西,很好的答案 - 将测试并回复您。谢谢@ekhaled。
  • 公平地说..您实际上不必增加它..只需将其设置为除0之外的任何其他值
  • 啊!这是行不通的。再次, preventDefault 根本没有触发......我认为我需要使用委托才能使其工作 - 任何方式都可以工作?
  • 您可能需要event.preventDefault();event.stopPropagation();。检查我刚刚所做的编辑,您可能还需要短路处理函数
  • 感谢您的更新,但它仍然没有播放 - 不太清楚为什么。我会坚持下去,做一些调试!
【解决方案2】:

我也有这个问题。

在这里查看:Form submit after preventDefault

你只需要在 preventDefault 周围加上一个 if 语句

【讨论】:

  • 这有什么帮助?如果语句需要两个不同的变量条件,我在这里检查什么?我可以与此答案相关的唯一方法是通过某种方式检查状态以查看单击 main_cat_prods 时 QuickBuyProdBox 是否存在,如果不存在,则 preventDefault
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多