Скрыть элемент формы с помощью jquery без отправки? - PullRequest
0 голосов
/ 22 февраля 2010

У меня есть форма, содержащая некоторые динамические элементы. В основном это текстовые поля ввода, которые будут содержать номера телефонов с кнопкой справа, чтобы удалить элемент. Другая кнопка добавляет новый элемент и последний, чтобы сохранить его в базе данных. То, что я хочу сделать, это «пометить» номера, которые были изменены, удалены или новые номера. Чтобы я мог сделать обновление, вставить или удалить базу данных, поскольку я не хочу удалять все и вставлять все каждый раз в базу данных.

delDisaNumber не совсем то, что я хочу ... Я хочу скрыть элемент, чтобы пометить его как удаленный. Но при этом создается впечатление, что форма отправляется. С другой стороны, использование .remove заметно ведет себя так, как я хочу, но полностью удаляет элемент, а не то, что я хочу (я хочу, чтобы он был скрыт).

Вот код, о котором идет речь, пока. (это написано в 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>

РЕДАКТИРОВАТЬ: Кажется, что форма :: кнопка не работает, как ожидалось. Если я заменю его на echo 'X', форма не будет опубликована.

Ответы [ 3 ]

1 голос
/ 22 февраля 2010

Мое предложение состоит в том, чтобы вместо изменения имени добавить класс типа «измененный». А потом отправляйте только те.

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

Как это работает, так это то, что отключенные элементы ввода не отправляются на сервер.

0 голосов
/ 22 февраля 2010

Я думаю, что есть несколько способов решить вашу проблему.

Этот может быть быстрее и немного элегантнее. Вам нужно будет создать массив действий и затем отправить их через AJAX на сервер. Позвольте мне объяснить:

предположим, что ваши поля "phone" с классом "phone" и DIV-оберткой с "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 у вас теперь будет массив с идентификатором и действием для выполнения. Если действие «удалено», вы продолжаете его удалять (помните, что идентификатор будет p _ #####), если это число, то обновите, и если идентификатор начинается с «n_», то его новое. Другой способ - создать 3 отдельных массива, один для обновления, один для удаления и один для вставки, и отправить их отдельно. Но я решил сделать это так для простоты. Кроме того, вы можете выполнить некоторые проверки перед отправкой списка.

Вам больше не нужен тег «form» и действия javascript внутри ваших тегов. Я рекомендую вам использовать плагин JSON Jquery , если вы хотите полной совместимости (JQuery -> PHP).

Этот код не проверен и не закончен, это всего лишь идея ... вам нужно будет его реализовать. Если вы хотите, вы можете добавить диалоговое окно JQuery UI для отображения «Пожалуйста, подождите ...» во время передачи формы на сервер.

Если вы хотите продолжать свой подход, вы всегда можете изменить входной ТИП:

$("#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"

Вот и все .. Я надеюсь, что это полезно.

0 голосов
/ 22 февраля 2010

внутри delDisaNumber

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