使用jquery隐藏表单元素而不提交?

时间:2010-02-22 02:27:23

标签: jquery kohana

我有一个包含一些动态元素的表单。这些基本上是文本输入框,其中包含电话号码,右侧有一个按钮可删除该元素。 另一个按钮添加一个新元素,最后一个按钮将其保存到数据库中。 我想要做的是“标记”已更改,已删除或新数字的数字。 这样我就可以在数据库上进行更新,插入或删除,因为我不想删除所有内容并在数据库中每次都插入。

delDisaNumber不是我想要的......我想要隐藏元素,以便将其标记为已删除。但这样做会使表单看起来像提交。另一方面,使用.remove可视地表现我想要的方式,但完全删除了我想要的元素(我希望它隐藏)。

到目前为止,这是有问题的代码。 (这是使用kohana在jquery和php中编写的)

<script type="text/javascript">
  var disaId = 1;

  function setModified(element){
    $(element).attr('name', 'update');
  }

  function delDisaNumber(element){
      $(element).prev('name','delete');
      $(element).parent().remove();  /* has the effect I want, but removes the element */
      // $(element).parent().hide() /* this is what I want but submits the form */
  }

  function addDisaNumber(){
      $("#disa_numbers").append('<li id="disa_num"'+disaId+'><input /><button onClick="delDisaNumber">X</button></li>');
    $disaId++;
  }
  </script>

  ...

<div id="disa">
  <?php
    echo form::open("edit/saveDisaNumbers/".$phone, array("class"=>"section", "id"=>"other"));
    echo form::open_fieldset(array("class"=>"balanced-grid"));
  ?>
  <ul class="fields" id="disa_numbers">
    <?php
      $disaId = 1;
        foreach ( $disa_numbers as $disa_number ){
           $disaid_name = 'disa_num'.$disaId;
           echo '<li id="'.$disaid_name.'">';
           echo form::input("disa".$disaId, $disa_number->cid_in, "onKeyDown='setModified(this)'");
           echo form::button("",'X','onClick="delDisaNumber(this)" class="button image"');
           echo "</li>";
           $disaId++;
        }
     ?>   
    </ul>
    <button type="button" onclick="addDisaNumber()">Add another number</button>
    <?php
      echo form::submit('submit', 'Save');
      echo form::close();
    ?>
</div>

编辑:似乎form :: button的行为不符合预期。如果我用echo'X'替换它,它不会发布表单。

3 个答案:

答案 0 :(得分:1)

我的建议是,不要更改名称,而是添加类似“已修改”的类。然后只提交那些。

$("form").submit(function() {
  $("input:not(.modified)").attr("disabled", true);
});

这是如何工作的,禁用的输入元素不会提交给服务器。

答案 1 :(得分:0)

在delDisaNumber里面

$(element).parent().css("visibility", "hidden");

答案 2 :(得分:0)

我认为有几种方法可以解决您的问题。

这个可能更快,更优雅。您需要创建一系列操作,然后通过AJAX将它们提交给服务器。让我解释一下:

假设您的“电话”字段包含“phone”类和带有“id”的包装DIV: 示例:(id可以是您的数据库ID或带有前缀的手机(如我所示)。或者如果您愿意,可以先将它们添加到数组并指定一个时间ID。这样您就可以验证更改了端)。

<div id="p_18003526445">
    <input type="text" class="phone" value="1800-3526-445" />
    <button class="del">Delete</button>
</div>
...
<button id="add">Add More...</button>  
<button id="save">Save Changes</button>  

现在是JQuery:

var phones = new Array();
var new_id = 0; //keep track of added ids
$(window).load(function() {
    $("input.phone").change(function() { 
         //you could check here if the phone id is the same as the val... (and skip)
         phones[$(this).parent().attr("id")] = $(this).val();             
    });
    $("button.del").click(function() {
         var id = $(this).parent().attr("id");
         $(this).prev("input.phone").val("deleted"); //setting to "deleted"
         $("#"+id).hide(); //hide the DIV (input + button)
    });
    $("#add").click(function() {
         new_id++;
         $("#main").append("<div id='n_"+new_id+"'>
             <input type='text' class='phone' />
             <button class='del'>Delete</button>
         </div>");
    });
    $("#save").click(function() {
         $.post("save.php",{ phones : $.toJSON(phones) },
             function(reply, status){
                  if(status == "success" && reply == "OK") {
                       alert("UPDATED!");
                  } else {
                       alert("ERROR: Try again");
                  }
             }
         );
    });
});

现在你在“save.php”中需要执行类似的操作:

<?php
   $import = json_decode($_POST["phones"]);
   if($import) {
    $phones = array();
    foreach($import as $i => $p) {
         $phones[$i] = $p;
    }
   }
   //print_r($phones);
   ...
   echo "OK"; //Tell JQuery everything went fine!
?>

在PHP中,您将拥有一个数组,其中包含要执行的ID和操作。如果操作被“删除”,则继续删除它(请记住该ID将是p _ #####),如果是一个数字,则更新,如果ID以“n_”开头则为新的。另一种方法是创建3个数组,其中一个用于更新,一个用于删除,一个用于插入并分别发送。但为了简单起见,我决定这样做。此外,您可以在发送列表之前执行一些检查。

您不再需要“form”标记,也不需要标记内的javascript操作。 如果你想完全兼容(JQuery - &gt; PHP),我建议你使用JSON Jquery plugin

此代码未经测试且未完成,这只是想法......您需要实现它。如果您愿意,可以在表单传输到服务器时添加一些JQuery UI对话框以显示“Please wait ...”。

如果您想继续使用您的方法,您可以随时更改输入类型:

$("#disa_num input").attr("type","hidden"); 

并向表单附加另一个带有操作“隐藏”的输入,或者附加到值前面 动作的标识符,如:

var oldvalue = $("#disa_num input").val();
$("#disa_num input").val("d-"+oldvalue); //prepend "d-" to identify it as "deleted"

就是这样..我希望它有用。