使用“.remove()”函数时代码未运行

时间:2013-02-05 09:04:40

标签: javascript jquery

我正在写这个jquery代码:

$('form').after('<p id="suc"></p>');
$('#suc').html('success !');
$('#suc').show(700);
setTimeout(function(){$('#suc').hide('slow')},2500);
$('#suc').remove();

当我删除这样的$('#suc').remove();时:

$('form').after('<p id="suc"></p>');
$('#suc').html('success !');
$('#suc').show(700);
setTimeout(function(){$('#suc').hide('slow')},2500);  

代码运行成功,但是当我把它运行时,它不会运行!!

那有什么问题? 但$('#suc').remove();在这里是违法的吗?

4 个答案:

答案 0 :(得分:1)

setTimeout调用不会在代码继续之前等待回调运行,因此您将立即删除该元素。当回调中的代码试图隐藏元素时,它就不存在了。

删除hide methodcomplete回调中的元素:

setTimeout(function(){
  $('#suc').hide('slow', function(){
    $('#suc').remove();
  });
},2500);

答案 1 :(得分:1)

当您使用hide时,您也可以安全地使用delay,所以:

$('#suc').show(700).delay(2500).hide('slow', function () {
  $(this).remove();
});

就足够了。

演示http://jsbin.com/isediz/2/


另外,作为一点澄清,关于:

  

代码运行成功,但是当我把它运行时,它不会运行!!

实际上代码运行(在某种意义上),问题是你的remove不会等待两个异步事件(setTimeout.hide('slow'))。因此,在这两个人完成他们应该做的事情之前,它会被执行。

答案 2 :(得分:0)

您正在使用已在setTimout之后的语句中删除的元素setTimout回调。 setTimeout的回调将在语句删除元素#suc之后由setTimeout的下一个语句执行。 删除隐藏回调中的#suc,以便删除后脚本无法访问

$('form').after('<p id="suc"></p>');
$('#suc').html('success !');
$('#suc').show(700);
setTimeout(function(){
      $('#suc').hide('slow', 
           function(){$(this).remove();
      }); 
},2500);

答案 3 :(得分:0)

您需要将remove()放在setTimeout内以及hide()函数的回调中:

$('form').after('<p id="suc"></p>');
$('#suc').html('success !');
$('#suc').show(700);

setTimeout(function() { 
    $('#suc').hide('slow', function() { $(this).remove(); })
}, 2500);