【问题标题】:Strange looping problem with jQuery when I try to delete an entry当我尝试删除条目时,jQuery 出现奇怪的循环问题
【发布时间】:2009-10-02 12:17:55
【问题描述】:

我已尝试在代码中尽可能地记录这一点。

当我尝试删除已添加的项目时出现奇怪的循环。

例子:

我添加了 3 个项目:

  • 当我尝试删除第一个 列表中的项目...我得到确认 删除对话框 3 次

  • 删除第二个 列表中的项目...我得到了 2 次确认。

  • 是的……你猜对了……最后一个只给了我一次。

提前致谢。

不管怎样,这里是注释的 jQuery 代码(这是一个很大的):

$(document).ready(function() {

  //hides the message/error console
  $("#console").hide();

//this is the add new button functionality  
  $("#save").click(function(){
    var ul = $("ul.addul");
    var addM = $(".mo").val();
    var addY = $(".yr").val();
    var addC = $(".ct").val();
    var addT = $("textarea#addThoughts").val();

    //submit the add
    $.post("save.php", { month : addM, year : addY, cottage : addC, thoughts : addT },
      function(data){

        //all good
        if(data.success) {

          //returns the item's respective id from db
          var returnID = data.id;

          //resets the form after items inserted into db
          document.getElementById('items').reset();

          //this puts the added item into the html
          $(".added").append(//content in here removed to shorten the example);

          //not implemented yet
          $(".edit").click(function(){
            $(this).parent().siblings("li.addit").hide();
            $(this).parent().siblings("li").children("[name=month], [name=year], [name=cottage], [name=thoughts]").show();
            $(this).parent().siblings("li").children(".showDataMonth, .showDataYear, .showDataCottage, .showDataThoughts").hide();
            $(this).siblings(".del").hide();
            $(this).siblings(".cancel, .save").show();
            $(this).hide();
          });

          //this is functioning properly; this cancels an update
          $("button.cancel").click(function(){
            $(this).parent().siblings("li.addit").show();
            $(this).parent().siblings("li").children("[name=month], [name=year], [name=cottage], [name=thoughts]").hide();
            $(this).parent().siblings("li").children(".showDataMonth, .showDataYear, .showDataCottage, .showDataThoughts").show();
            $(this).siblings(".edit, .del").show();
            $(this).siblings(".save").hide();
            $(this).hide();
          });

          //resetting of values to prepare another entry
          $(".save, .cancel, .month, .year, .cottage, .thoughts").hide();
          $(".showDataThoughts").css({ width : "160px;"});
          $(".mo, .yr, .ct").val("0");

          //shows successful insert of data into db
          $("#console").html(data.message).css({background: "green", color: "white"}).fadeIn().animate({ opacity : "+=0" }, 2000).fadeOut();

          //this is the delete function that I am referring to.
          //I get the "confirm" dialog just fine.
          //say I have 3 entries:
          //if I try to delete the first entry...I get the confirm delete dialog 3 times.
          //if I try to delete the second entry...I get the confirm delete dialog 2 times.
          //and the 3rd entry...I only get it once.
          //I'm stuck in a weird kinda loop.
          $(".del").click(function(){
              var del = this;
              var thisVal = $(del).val();
              $.post("delete.php", { dirID : thisVal },
              function(data){
                if(confirm("Are you sure you want to DELETE this entry?") == true) {
                  if(data.success) {
                    alert(thisVal);
                  }
                }
              return false;
              }, "json");
          });

        } else if(data.error) { //item could not be added
          $("#console").html(data.message).css({background: "red", color: "white"}).fadeIn().animate({ opacity : "+=0" }, 2000).fadeOut();
        }
    }, "json");
    return false;
}); //end of add button

//this populates the select boxes
$.getJSON('dates_in_residence.php', function(data){
    var htmlMonth = '';
    var htmlYear = '';
    var htmlCottage = '';
    var len = data.length;
    for (var i = 0; i < 12; i++) {htmlMonth += '<option class="optionMonth" value="' + data[i].month + '">' + data[i].month + '</option>';
    }
    $('select#addMonth').append(htmlMonth);
    for (var i = 12; i < 34; i++) {htmlYear += '<option class="optionYear" value="' + data[i].year + '">' + data[i].year + '</option>';
    }
    $('select#addYear').append(htmlYear);
    for (var i = 35; i < 42; i++) {htmlCottage += '<option class="optionCottage" value="' + data[i].cottage + '">' + data[i].cottage + '</option>';
    }
    $('select#addCottage').append(htmlCottage);
});

//this adds select menu's value to hidden inputs
$("#addMonth").change(function () {
          var str = '';
          $("#addMonth option:selected").each(function () {
                str += $(this).text() + " ";
              });
          $(".mo").val(str);
        }).change();
$("#addYear").change(function () {
          var str = "";
          $("#addYear option:selected").each(function () {
                str += $(this).text() + " ";
              });
          $(".yr").val(str);
        }).change();
$("#addCottage").change(function () {
          var str = "";
          $("#addCottage option:selected").each(function () {
                str += $(this).text() + " ";
              });
          $(".ct").val(str);
        }).change();
});

还有delete.php文件:

<?php

if($_POST) {

  $data['delID'] = $_POST['dirID'];

  $query = "DELETE from //tablename WHERE dirID = '{$data['delID']}' LIMIT 1";

  $result = $db->query($query);

  if($result) {
    $data['success'] = true;
    $data['message'] = "This entry was successfully removed.";
  }

  echo json_encode($data);
}

?>

【问题讨论】:

    标签: jquery json getjson


    【解决方案1】:

    我想你想看看 jQuery 1.3 中的 live 函数,它自动将事件绑定到新创建的元素。您需要将其完全移出帖子部分,以便它在第一页加载时运行。像这样的东西应该可以工作:

    $(".del").live("click", function(){
      //event code here
    });
    

    【讨论】:

    • 我想知道“实时”功能......我会试一试。谢谢!
    • 我知道必须有一种方法可以将“删除”功能移出“保存”功能。完美!
    【解决方案2】:

    行:

    $(".del").click(function(){
    

    返回所有具有del 类的元素,这意味着每次添加新项目时,都会向每个现有del 元素添加新事件。 (看看你的代码的其余部分,这显然是你的大多数元素的问题)。

    您最好的选择是单独组装构成每个新项目的元素,并在将它们附加到内容之前为其分配特定事件。这样您就知道每个特定元素都会有一个正确的甚至与之关联。

    编辑:

    将数据传递给新函数:

      $("#save").click(function(){
        var ul = $("ul.addul");
        var addM = $(".mo").val();
        var addY = $(".yr").val();
        var addC = $(".ct").val();
        var addT = $("textarea#addThoughts").val();
    
        //submit the add
        $.post("save.php", { month : addM, year : addY, cottage : addC, thoughts : addT },
          function(data){
    
            //all good
              if(data.success) {
                run_success(data);
              }
           }//close function
       }//close #save click
    
       //new, global function
       function run_success(data) {
           //do things with data here
       }
    

    设置全局变量:

      $("#save").click(function(){
        var ul = $("ul.addul");
        var addM = $(".mo").val();
        var addY = $(".yr").val();
        var addC = $(".ct").val();
        var addT = $("textarea#addThoughts").val();
    
        //submit the add
        $.post("save.php", { month : addM, year : addY, cottage : addC, thoughts : addT },
          function(data){
    
            //all good
              if(data.success) {
                my_global_var = data; //note, my_global_var is created without a var
                                      //before it, thereby assigning it a global scope
              }
           }//close function
       }//close #save click
    

    【讨论】:

    • 是否可以将“删除”和“编辑”功能移出“保存”功能?
    • 恐怕这不能解决问题 - 你需要重写它,以便点击事件附加到特定元素,而不是类选择器返回的对象列表
    • 有没有办法将“数据”值从“保存”功能中提取出来?在其他地方使用?谢谢。
    • 如果你感觉难以置信,你可以将它作为参数传递给另一个函数,或者你可以将它设置为一个全局变量(任何没有 var 关键字的变量或在窗口范围内分配的变量)懒惰。
    • 您能举一个小例子来说明我如何获取这些数据吗?对不起,我是个菜鸟。并不一定与我拥有的代码相关......只是一个关于如何在 jQuery 中分配全局变量的小例子。
    猜你喜欢
    • 2021-03-16
    • 2021-09-25
    • 2012-06-20
    • 1970-01-01
    • 2021-10-03
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多