带有ajax的JQuery不断发布多个结果

时间:2013-10-11 12:09:10

标签: javascript jquery ajax

我在页面上有很多图像显示机器的状态。如果单击图像,则会打开模态窗口,您可以选择新状态。状态通过ajax发送到DB。如果我尝试更改其他计算机状态,则先前的计算机状态也会更改。我触摸的每个状态每次都会重新发送,作为我选择的最后一个状态。

它以某种方式创建了我已更改的机器数组,并且每个更改都会发布所有更改。刷新页面会清空数组。

我想我需要在php中使用与unset类似的东西,或者在第一个点击功能之外移动内部点击功能。

$(function() {
    $('#mach_status_dialog').hide();
    $('.mach_status').click(function(){
        var mach = $(this).attr('id');

        $('#mach_status_dialog').dialog({
            modal: true,
            draggable: false,
            resizable: false,
            width: 500,
            title: 'Mach ' + mach + ' status'
        });

        $('.statuses').click(function(){
            var user = user;
            var class = $(this).attr('class');
            class = class.substring(10);
            var status = $(this).first().find('p').parent().text();
            var data_string = 'mach=' + mach + '&status=' + status + '&user=' + user;
            $.ajax({
                url: 'ajax_op_mach_status.php',
                type:'POST',
                data: data_string,
                dataType: 'json',
                cache: false,
                success: function(response){
                    var newSrc = 'images/Circle2_'+class+'_25.png';
                    console.log($('#'+mach+'.mach_status').attr('src', newSrc));
                    $('#'+mach+'.mach_status').attr('src', newSrc);
                    $('#'+mach+'.mach_status').attr('title', status);
                    $( "#mach_status_dialog" ).dialog('close');
                }
            });
        });
    });
});

3 个答案:

答案 0 :(得分:1)

正如您所说,只需将.click事件移动到DOM ready回调中即可。按照目前的情况,每次单击mach_status时,都会分配一个新的单击事件处理程序。因此,如果我点击mach_status 10次,然后点击statuses链接一次,您将收到10个AJAX请求。

如果您只想在用户点击statuses时绑定到mach_status点击,请在元素上添加一个类,告诉它什么时候准备就绪:

$(function() {
    $('#mach_status_dialog').hide();
    $('.mach_status').click(function(){
        $(".statuses").addClass("ready");
        var mach = $(this).attr('id');

        $('#mach_status_dialog').dialog({
            modal: true,
            draggable: false,
            resizable: false,
            width: 500,
            title: 'Mach ' + mach + ' status'
        });
    });
    $('.statuses.ready').click(function(){
        // Do AJAX
    });
});

答案 1 :(得分:1)

$(function() {
  $('#mach_status_dialog').hide();
   $('.mach_status').click(function(){
    var mach = $(this).attr('id');

    $('#mach_status_dialog').dialog({
        modal: true,
        draggable: false,
        resizable: false,
        width: 500,
        title: 'Mach ' + mach + ' status'
    });
});
$(document).on('click', '.statuses', function(){
        var user = user;
        var class = $(this).attr('class');
        class = class.substring(10);
        var status = $(this).first().find('p').parent().text();
        var data_string = 'mach=' + mach + '&status=' + status + '&user=' + user;
        $.ajax({
            url: 'ajax_op_mach_status.php',
            type:'POST',
            data: data_string,
            dataType: 'json',
            cache: false,
            success: function(response){
                var newSrc = 'images/Circle2_'+class+'_25.png';
                console.log($('#'+mach+'.mach_status').attr('src', newSrc));
                $('#'+mach+'.mach_status').attr('src', newSrc);
                $('#'+mach+'.mach_status').attr('title', status);
                $( "#mach_status_dialog" ).dialog('close');
            }
        });
    });
});

答案 2 :(得分:0)

问题出在这里......

$('.statuses').click(function(){

每次单击* .mach_status *元素时,它都会为所有状态添加事件侦听器。您可以将其更改为

$(this).find('.statuses').click(function abc(){
   .
   .
   .
   this.removeEventListner('click', abc);
});

注意我是如何使用命名函数并在触发它们时将它们从事件队列中删除。