2010-11-04 4 views
0

Je dois avouer que je ne connais pas grand-chose à JavaScript, c'est pourquoi ma question peut sembler un peu ridicule.Shortening JavaScript Fonction

Mais ce que j'essaie de faire est de saisir des valeurs de groupes radio sélectionnés par nom.

Il ressemble à ceci

function calc() { 
    var op1 = document.getElementsByName('form[radio1]'); 
    var op2 = document.getElementsByName('form[radio2]'); 
    var op3 = document.getElementsByName('form[radio3]'); 

    var result = document.getElementById('result'); 

    result.value = 0; 

    result.value = parseInt(result.value); 

    for (i = 0; i < op1.length; i++) { 
     if (op1[i].checked) result.value = parseInt(result.value) + parseInt(op1[i].value); 
    } 

    for (i = 0; i < op2.length; i++) { 
     if (op2.options[i].selected) result.value = parseInt(result.value) + parseInt(op2[i].value); 
    } 

    for (i = 0; i < op3.length; i++) { 
     if (op3.options[i].selected) result.value = parseInt(result.value) + parseInt(op3[i].value); 
    } 

    return false; 
} 

Et ceci est ma forme. Im en utilisant le formulaire rs pour joomla.

<form action="index.php" enctype="multipart/form-data" id="userForm" method="post"> 

    <input name="form[radio1]" value="25" id="radio20" type="radio"> 
     <label for="radio20">Description1</label> 

    <input name="form[radio1]" value="35" id="radio21" type="radio"> 
     <label for="radio21">Description2</label> 



    <input name="form[radio2]" value="20" id="radio20" type="radio"> 
    <label for="radio20">Description1</label> 

    <input name="form[radio2]" value="30" id="radio21" type="radio"> 
    <label for="radio21">Description2</label> 


    <input type="hidden" value="0" id="result" name="form[result]"> 

    <input type="submit" class="rsform-submit-button" onclick="calc()" id="submit" name="form[submit]" value="submit"> 

Et tout serait OK, car la fonction fonctionne. le seul problème est que j'ai environ 80 radiogrammes.

Existe-t-il un moyen de le raccourcir?

Répondre

4

Utilisez des tableaux d'objets (comme tous les boutons radio, par exemple) et parcourez-les. Commencez comme ceci:

var opts = [], 
    numOpts = 80; 

for (var i=0; i<numOpts, i++) 
{ 
    opts.push(document.getElementsByName('form[radio' + i + ']')); 
} 

Edit: jetons un coup à la pleine fonction. La seule chose dont je ne suis pas sûr à 100% est de savoir si vous voulez utiliser opX[i].checked ou opX.options[i].selected (puisque votre code fait des choses différentes pour op1 et op2/3). Il ne devrait pas être trop difficile d'extrapoler si j'ai mal deviné, cependant.

function calc() 
{ 
    var opts = [], 
     numOpts = 80, 
     value = 0, 
     result = document.getElementById('result'), 
     i, j, opt; 

    for (i=0; i<numOpts; i++) 
    { 
     opts.push(document.getElementsByName('form[radio' + i + ']')); 
    } 

    numOpts = opts.length; 

    for (i=0; i<numOpts; i++) 
    { 
     opt = opts[i]; 
     for (j=0; j<opt.length; j++) 
     { 
      // or did you mean: 
      // if (opt.options[j].selected) ? 
      if (opt[j].checked) 
      { 
       value = value + parseInt(opt[j].value, 10); 
      } 
     } 
    } 

    result.value = value; 

    return false; 
} 
+0

Très bon je crois, le fait est que je ne connais tout simplement pas JavaScript, donc je pourrais simplement demander une fonction qui fonctionnera s'il vous plaît? – Dom

+0

@Dom voir mon edit.Je pense que j'ai recréé ce que ta fonction essayait Cela dit, si vous "ne connaissez tout simplement pas JavaScript" alors peut-être que vous devriez travailler sur _actively_ l'apprentissage plutôt que de _sayer pour la réponse_ –

+0

@ Matt I c complètement d'accord avec vous. Et c'est ma prochaine étape. Im genre de débutant avec jQuery et JavaScript et s'il vous plaît croyez-moi, mais celui-ci - j'avais juste besoin de solution. Malheureusement, cela ne fonctionne pas de moi. J'ai vraiment besoin d'aide à ce sujet. Désespéré. Y a-t-il autre chose que je dois poster pour aider à trouver une solution? – Dom

0

jQuery est une bibliothèque géniale qui ressemble à du JavaScript sur les stéroïdes. Cela vaut la peine d'apprendre et il y a beaucoup d'exemples dans la nature.

Vous pouvez écrire complexe « selectors » tout à fait comme ceci:

$('input[name=form[radio1]]').attr('checked').each(function() { 
     result.value = $(this).attr('value') 
}) 

(Je ne sais pas si elle acceptera un nom comme « forme [Radio1] » comme valable, mais essayer.

+1

Vous devriez échapper le '[]' comme '\\\ ['. Et voudrait probablement utiliser [l'attribut commence par le sélecteur] (http://api.jquery.com/attribute-starts-with/) comme ''input [name^= form \\\ [radio]''. – user113716

+2

Je ne sais pas si +1 ou -1 cette réponse, pour recommander jQuery. –

+2

@Matt - Oui, je n'aime pas vraiment quand des solutions de bibliothèques js non sollicitées sont données. – user113716