1

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

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

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

$(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');
                }
            });
        });
    });
});
4

3 回答 3

1

正如你所说,只需将.click事件移动到 DOM 就绪回调中。就目前而言,每次单击 a 时mach_status,都会分配一个新的单击事件处理程序。因此,如果我单击mach_status10 次,然后单击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
    });
});
于 2013-10-11T12:12:24.293 回答
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');
            }
        });
    });
});
于 2013-10-11T12:36:15.360 回答
0

问题就在这里...

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

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

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

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

于 2013-10-11T12:16:49.483 回答