2008-11-10 7 views
2

HI Tous,JavaScript: Dynamic Noms des champs

J'ai un morceau de code JavaScript qui supprime les virgules d'une chaîne fournie (dans mon cas la valeur des devises)

Il est:

function replaceCommaInCurrency(myField, val) 
    { 
     var re = /,/g; 

     document.net1003Form.myField.value=val.replace(re, ''); 
    } 

' MyField 'était ma tentative d'avoir dynamiquement ce travail sur n'importe quel domaine que je passe, mais cela ne fonctionne pas, j'obtiens des erreurs en disant que' MyField 'n'est pas valide. J'ai en quelque sorte eu mon, mais je pensais que c'était valide.

Je fais appel à l'aide: onBlur = "replaceCommaInCurrency (this.name, this.value); return false;"

this.name et this.value passent dans les bonnes valeurs ... le nom du champ et sa valeur.

Comment procéder dynamiquement?

-Jason

Répondre

4

Vous pouvez utiliser eval pour faire fonctionner votre extrait de code:

eval("document.net1003Form." + myField + ".value=val.replace(re, '');"); 

Comme mentionné ci-dessous, la carrés supports de travail (et ne sucent pas comme eval), moi stupide pour oublier les:

document.net1003Form[myField].value=val.replace(re, ''); 

Sinon, essayez quelque chose comme ceci:

function replaceCommaInCurrency(field){ 
    var re = /,/g; 
    field.value = field.value.replace(re, ''); 
} 

Ce qui est appelé comme ceci:

onBlur="replaceCommaInCurrency(this); return false"; 

Vous devriez envisager d'utiliser une boîte à outils javascript pour des choses comme ça. Vous pouvez définir une classe comme « monnaie » sur chaque entrée, utilisez ce bout de jQuery basé Javascript pour tout gérer:

$(function(){ 
    $("input.currency").bind('blur', function(){ 
     this.value = $(this).val().replace(',', ''); 
    }) 
}); 

Ce code feu sur le document prêt, joindre un gestionnaire d'événements à chaque entrée avec monnaie sa classe, et ensuite faire les remplacements. Notez que vous n'avez pas besoin d'une regex pour le remplacement.

+1

Si jamais vous pouvez éviter d'utiliser la fonction eval-, vous devez car il est le plus contre Fonction umingg dans tout le monde ECMAscript ... – roenving

+0

Vous pouvez l'éviter. Utilisez des crochets. – bart

+0

Doh, ouais, je l'ai mis à jour avec la syntaxe aussi. – MrKurt

3

Si vous le code à droite dans le balisage comme, par exemple onblur = "replaceCommaInCurrency (this)", le contrôle à l'origine de l'événement est passé en paramètre. Ensuite, vous devriez être en mesure de faire quelque chose comme:

myField.value = myField.value.replace(re, ''); 

avec jQuery:

var jqField = $(myField); 
jqField.val(jqField.val().replace(re, '')); 
0
function removeCommaInCurrency(myField) 
    { 
      var re = /,/g; 

      myField.value=myField.value.replace(re, ''); 
    } 

- puis l'appeler comme ceci:

<input type="text" name="..." onchange="removeCommaInCurrency(this);"> 
1

En général, vous devez utiliser un cadre qui traitera des fonctionnalités de bas niveau comme celui-ci, mais la réponse précise à votre question est de utiliser la notation de support pour le nom du champ:

function replaceCommaInCurrency(myField, val) 
{ 
    var re = /,/g; 

    document.net1003Form[myField].value=val.replace(re, ''); 
} 
0

Flatline et la solution de roenving avec « ceci » est l'approche plus propre, il permet également d'éviter les problèmes de « document.formname.fieldname ». (Utilisez 'document.forms.formname' pour accéder à un formulaire sans conflit possible sur les formulaires ayant le même nom que les membres de l'objet document, et 'forms.elements.fieldname' pour faire de même avec les champs. Vous pouvez également utiliser l'objet JavaScript, l'objet [nomvariable] ou, mieux, ajouter des ID et utiliser la méthode document.getElementById sans ambiguïté.)

En déplaçant la liaison dans le script, vous pouvez également supprimer le JavaScript en ligne de l'attribut onclick, rendant le nettoyeur de balisage encore:

<input type="text" class="number" name="something" /> 
... 
<script type="text/javascript"> // external script is best, linked after all forms 
    function numberfield_bind() { 
     var inputs= document.getElementsByTagName('input'); 
     for (var inputi= inputs.length; inputi-->0;) 
      if (inputs[inputi].className=='number') 
       inputs[inputi].onchange= numberfield_change; 
    } 
    function numberfield_change() { 
     this.value= this.value.split(',').join(''); 
    } 
    numberfield_bind(); 
</script> 
Questions connexes