我的jQuery排队函数在第一次运行后失败

我的jQuery排队函数在第一次运行后失败,jquery,Jquery,描述我想要的与上述代码:我有两个按钮。当我单击其中一个时,我想将值“2”发送到url,并在类status2中加载status2.php的内容,在3secs之后清空类status2。如果我单击另一个按钮,则依此类推。我认为上面的代码可以完成这项工作。 如果我在单击按钮时从回调中删除“()”,则只发送值“2”,而不会发生其他任何情况。要使其与动态添加的内容一起工作,请在上连接事件 <input id='lightson' class="buttonl" type="button" value=

描述我想要的与上述代码:我有两个按钮。当我单击其中一个时,我想将值“2”发送到url,并在类status2中加载status2.php的内容,在3secs之后清空类status2。如果我单击另一个按钮,则依此类推。我认为上面的代码可以完成这项工作。
如果我在单击按钮时从回调中删除“()”,则只发送值“2”,而不会发生其他任何情况。

要使其与动态添加的内容一起工作,请在
上连接事件

<input id='lightson' class="buttonl" type="button" value="On" />
<input id='lightsoff'  class="buttonl" type="button" value="Off" />
<p class="status2"></p>

<script type="text/javascript">
$('#lightson').click(function(){
    $.get('http://<?php echo $_SESSION['ip']?>/?2', {}, callbacka());
    function callbacka() {
        $('.status2').load('status2.php').delay(3000).queue(function(){
            $('.status2').empty().dequeue();
        });
    }
});

$('#lightsoff').click( function () {
    $.get('http://<?php echo $_SESSION['ip']?>/?3', {}, callbackb());
    function callbackb(){
       $('.status2').load('status3.php').delay(3000).queue(function() {
           $('.status2').empty().dequeue();
       });
    } 
});
</script>
我成功地测试了这一点,但我不认为我能够让ajax负载正常工作:)

不要将
()
放在
callbacka
/
callbackb
之后。这将调用它们,并将
$.get
的回调设置为返回值(
在本例中为未定义的


$('#lightson')。单击(函数(){
$.get(“http://2”);
callbacka();
} );
函数callbacka(){
$('.status2').load('status2.php').delay(3000).queue(function(){
$('.status2').empty().dequeue();
});
}
$('#lightsoff')。单击(函数(){
$.get('http://?3');
callbackb();
} );
函数callbackb(){
$('.status2').load('status3.php').delay(3000).queue(function(){
$('.status2').empty().dequeue();
});
}

我不认为
#lightson
正在被重新加载。只有
.status2
的内容。实际上,在
load
回调中,
this
是调用
load
的DOM元素。从
load
返回的数据作为第一个参数传递给回调函数。@Rocket-你说得对-谢谢。当然,
调用setTimeout回调时,这个
是另一回事,这就是为什么我需要$status:)@Rocket-我想你是对的。我会相应地告诉你的。嗨,亚当。如果您不介意我说,虽然事件委派很好,但文档级别的事件委派通常不是最好的主意。在页面上进行的每次单击都需要针对与
文档相关联的每个选择器进行测试。对于与一个特定元素关联的处理程序,通常最好直接绑定它,或者至少将委托缩小到更本地的容器中。:)
.delay()
适用于排队的任何对象。它不一定需要是动画。@amnotiam:除非我做错了什么,否则它似乎不适用于添加到队列中的任意函数@Rocket:我必须承认你的例子让我有点困惑,因为我不习惯使用自定义队列名称和传递函数数组。在这里,我去掉了数组,为
delay
调用指定了自定义名称,并手动将内联出列。初始的
delay
显然也需要手动退出队列,因为它不是默认的
fx
队列的一部分。@amnotiam:Cool,因此
delay
适用于所有队列,而不仅仅是
fx
队列。
<input id='lightson' class="buttonl" type="button" value="On" />
<input id='lightsoff'  class="buttonl" type="button" value="Off" />
<p class="status2"></p>

<script type="text/javascript">
$('#lightson').click(function(){
    $.get('http://<?php echo $_SESSION['ip']?>/?2', {}, callbacka());
    function callbacka() {
        $('.status2').load('status2.php').delay(3000).queue(function(){
            $('.status2').empty().dequeue();
        });
    }
});

$('#lightsoff').click( function () {
    $.get('http://<?php echo $_SESSION['ip']?>/?3', {}, callbackb());
    function callbackb(){
       $('.status2').load('status3.php').delay(3000).queue(function() {
           $('.status2').empty().dequeue();
       });
    } 
});
</script>
 $(document).on("click", "#lightson", function () {
    var $status = $('.status2');
    $status.load('status2.php', function() {
        setTimeout(function() { $status.empty(); }, 3000); 
    });
 }
$.get( 'http://<?php echo $_SESSION['ip']?>/?2', {}, callbacka );
$('.status2').load('status2.php', function() {
    var $this = $(this);
    setTimeout(function(){
       $this.empty();
    }, 3000);
});
<script type="text/javascript">
    $( '#lightson' ).click( function () {
            $.get( "http://<?php echo $_SESSION['ip']?>/?2" );
            callbacka();
    } );

     function callbacka() {           

                $( '.status2' ).load( 'status2.php' ).delay( 3000 ).queue( function() {
                    $('.status2').empty().dequeue();
                });

    }

    $( '#lightsoff' ).click( function () {
            $.get( 'http://<?php echo $_SESSION['ip']?>/?3' );
            callbackb();
    } );

    function callbackb() {

                $( '.status2' ).load( 'status3.php' ).delay( 3000 ).queue( function() {
                    $( '.status2' ).empty().dequeue();
                });

    }
</script>