2009-08-16 6 views
1

J'utilise actuellement form.serialize() dans une requête ajax pour soumettre un formulaire de contact, mais mon problème est que form.serialize() saisit TOUS les éléments de formulaire, y compris "buttons".Confusion avec .serialize() et .serializeElements()

forme exemple:

name (input type = text) 
email (input type = text) 
body (text area) 
submit (input type = button) 
clear (input type = reset) 

je voudrais seulement comme sérialiser éléments de formulaire qui ne sont pas de type bouton, RESET ou MOT DE PASSE.

Y at-il une solution facile à cela?

+0

pouvez-vous copier (ou lier à) votre code html de formulaire, et le résultat actuel de l'appel serialize()? – Zed

Répondre

3

Je suppose que si vous omettez le paramètre name sur les entrées de bouton, les boutons ne seront pas sérialisés. Mon attente est basée sur le fait que sérialiser est supposé imiter la façon dont un formulaire est sérialisé sur soumettre et les entrées sans noms ne sont pas envoyées comme paramètres de formulaire. J'ai codé un test simple, qui semble le montrer. Cliquez sur le bouton Examiner et vous obtenez "text = bob". Activez la case à cocher et vous obtenez "cb2 = sur & text = bob". La valeur du bouton submit n'est jamais incluse.

<script type="text/javascript"> 
    $(document).observe('dom:loaded', function() { 
     $('btn').observe('click', function() { 
      alert($('form').serialize()); 
      return false; 
     }); 
    }); 
</script> 
</head> 
<body> 
<form id='form'> 
Checkbox 1 <input type="checkbox" id="cb1" name="cb1" /> 
Checkbox 2 <input type="checkbox" id="cb2" name="cb2" /><br /> 
<input type='text' name='text' value='bob' /> 
<input type="submit" id="btn" value="Examine" /> 
</form> 
+0

oui c'est tout! Par défaut, sans le paramètre "name", les champs du formulaire seront ignorés. – SkyLar

+0

Vous pouvez accepter cette réponse, car elle a résolu votre problème. Cela permettra à d'autres personnes (qui ne lisent pas votre commentaire) que c'était la solution. – tvanfosson

0

Il est un peu une conjecture sauvage, et sans doute pas la seule solution, mais d'une façon que je pense à est:

Dans le code, donc mething comme cela pourrait faire:

Form.serializeElements(
    // We need the list of all elements 
    // that are not rejected by the inner function 
    $('YOUR_FORM_ID').getElements().reject(function (formElement) { 
     // this function must return : 
     // - true for an element that you want to keep 
     // - false for an element you don't want to keep (you have to return false for your buttons, for instance) 
     if (formElement.type == 'radio' || formElement.type == 'checkbox') { 
      return false; 
     } else { 
      return true; 
     } 
    }) 
); 

Et la sortie (que vous voulez capturer dans une variable, bien sûr), est somthing comme ceci:

"lol=15&dt=0" 

Et/ou vous pouvez utiliser le deuxième paramètre facultatif de Form.serializeElements si vous souhaitez obtenir un Hash/un objet, au lieu d'une chaîne de requête.


Note: Pour cet exemple, je ne filtrait pas les éléments que vous avez spécifié: la forme que je l'habitude de test n'a pas exactement ce que vous demandez, donc je filtré quelques autres trucs. ..

Ainsi, vous devrez adapter la condition dans la fonction.


Espérons cette aide; s'amuser !

+0

Je ne suis pas un prototype mais on dirait que vous pouvez utiliser des sélecteurs CSS3 - ça vaut la peine d'essayer aussi. http://overfloweb.com/blog/index.php/archives/11 –