2012-01-18 53 views
0

我想要求用户确认删除表格行。如果他们说是的,那么我想在具有设定持续时间的表行上使用jquery fadeOut()方法,并在淡出完成后使用回调来删除表格行。使用.confirm()条件来调用jquery .fadeOut(),并用持续时间来调整回调时间

这工作正常没有确认,但确认增加奇怪和不一致的行为。如果我立刻点击“确定”,那么它按预期工作。但是如果我在等待几秒钟后点击“确定”,则淡出有时会被跳过,然后在删除该行之前需要几秒钟。这是不一致的,有时我需要先做其他事情(比如添加一行),然后得到错误行为(请参阅下面的演示链接)。另外,如果我在Facebook中将页面加载为iframe,每次都会遇到问题。

我认为这与异步与渐进式编码有关,并尝试改变我的代码以调用fadeOut作为自定义确认函数的回调函数,但这并没有解决任何问题。很可能我没有做好。除非有要求,否则我不会发布该代码以避免混淆。我也认为它可能与jQuery事件队列或执行上下文有关,但我不知道足够了解/调试它。

所以这里是我的代码片段,其中的问题是。需要注意的是,如果我拿出的确认工作正常,或者如果我拿出了淡出,只是使用remove:

// handler to remove question (uses "on" to bind event to future added rows) 
     $("#questions").on("click",".removeQuestion", function(){ 
      if (confirm('Are you sure you want to remove this question?')) { 
       // be sure to leave one question to fill in 
       if ($("table#questions tr").length == 1) { 
        $(this).parents("td").find("textarea").val(''); 
        $(this).parents("td").find("input[type=radio]").attr('checked', false); 
       } 
       else { 
        $(this).parents("tr").fadeOut(300, function() { 
         $(this).remove(); 
        }); 
        // update total questions text 
        $(".total_questions").text(function(index, text) { 
         return parseInt(text)-1; 
        }); 
       } 
      } 
     }); 

下面是一个演示页面,您可以尝试复制错误的链接(你可能有一些高级玩 - 见上面关于不一致笔记 - 第几次尝试往往很好地工作),并查看整个源: https://xcitemediacustomfacebookpages.com/hebetsmccallin/admin_test.php

顺便说一句,我在Chrome Mac上测试它。

谢谢你的帮助!我一直在这个圈子里,这太令人沮丧了。

+0

其他人?我注意到的另一个奇怪的事情是,有时当它“卡住”时,我需要做一些事情,例如在行将消失之前滚动页面。 – Jeff 2012-01-18 23:15:15

回答

0

如果您删除对jquery.tablednd_0_5.js的引用,您仍然会遇到问题吗?

约如果你改变了事件绑定功能是什么:

$(".removeQuestion").live("click", function(){ 
    //rest of previous function content 
}); 
+1

从jQuery 1.7开始,不推荐使用.live()方法。使用.on()附加事件处理程序(http://api.jquery.com/live)。 – 2012-01-18 03:20:22

+0

就这样。谢谢。 – gscragg 2012-01-18 03:30:37

+0

谢谢@ KeesC.Bakker供您参考。我曾尝试删除tablednd代码,但没有骰子。我甚至试过。活着看,但同样的错误。 – Jeff 2012-01-18 23:08:22

0

我没有得到一台Mac,所以我真的不能看它是否是一个“苹果”的问题。我看着你的代码,并重写它有点让它重用一些东西:

$('#questions .removeQuestion').on('click', function() { 

     var element = $(this).closest('tr'); 

     if (confirm('Are you sure you want to remove this question?')) { 

      var nrOfQuestions = $('#questions tr').length;  

      if (nrOfQuestions == 1) { 
       element.find('textarea').val(''); 
       element.find('input[type=radio]').removeAttr('checked'); 
      } 
      else { 
       element.fadeOut(300, function() { 
         element.remove(); 
       }); 

       // update total questions text 
       $('.total_questions').text(nrOfQuestions - 1); 
      } 
    } 
}); 

注:

  1. 我节省了点击后的行处理 - 我用一个closest得到最近的“父母”。
  2. Find操作可以做寻子元素在整个子树问题,每一次(复用以前的结果)
  3. 的点击将触发删除链接上,而不是在#questions表
  4. 重新计算数量。
+0

再次感谢,但仍然没有运气。你的代码绝对清洁,但可惜我有同样的问题。另外,请注意,'.on'的格式不会将事件处理程序添加到新添加的表格行中 - 它需要将'.removeQuestion'作为选择器作为每次倒数第二个委派事件例如http://api.jquery.com/on/。 – Jeff 2012-01-18 23:11:50

+0

@jeff当我看文档http://api.jquery.com/on/我看到选择器是可选的。旧的'live'声明没有额外的选择器,所以我不知道你是否对'on'正确。也许这是一个好主意,在http://www.jsfiddle.net – 2012-01-19 08:28:20

+0

中创建一个示例感谢您仍然在考虑这一点。你是对的,选择器是可选的,但我需要使用它,因为''.on'时只有现有的DOM元素被调用,将点击处理器应用到它们。这意味着我添加的任何附加表行都不会获得点击处理程序,除非通过在'.on'中设置可选的选择器参数来使用事件委托。您建议的方式适用于现有的表格行,不适用于新的表格行。使用选择器可以在任何时候添加所有行。 不幸的是,这似乎没有任何影响我的错误,虽然'.fadeOut'。 – Jeff 2012-01-19 17:47:28

1

我有使用confirm()与.animate()函数相同的问题。看起来.fadeOut()或在我的情况下.animate()只要confirm()被调用就开始计数。我找到了解决办法是添加自定义功能的队列:

$('#myId').queue(function(){ 
    $(this).delay(0).dequeue(); 
}).animate({ 
    top: 0 // Example 
}, 'slow'); 

在你的情况,这将是:

$(this).parents("tr").queue(function(){ 
    $(this).delay(0).dequeue(); 
}).fadeOut(300, function() { 
    $(this).remove(); 
}); 

额外的功能基本上是等待0毫秒,然后与队列,继续其似乎保持动画不被立即调用。它不工作没有.delay()虽然...

希望这会有所帮助!

+0

感谢您回答一个半旧的问题!你绝对是在做某件事,但它不是很有效 - 现在我没有问题,在几秒钟之后它就会消失,而是像我想要的一样消失......但是,看起来如果我等待大约5秒钟后再按确定,等待大约3秒钟淡出,如果我等待10秒钟,它将等待大约8秒钟。如果我立刻按下它,它会马上工作。所以我猜想队列里有什么事情,任何想法?我想我们可能会接近,再次感谢!很好的故障排除迄今! – Jeff 2012-03-15 16:27:44