2010-11-22 4 views
2

Ich kämpfe, um zu bekommen, was ich denke, sollte ein einfaches bisschen jquery/javascript sein, um zu arbeiten. Ich habe eine Textbox und zwei Radios bekam wie so, dass ich will, automatisch die ‚total‘ Textbox aktualisieren, wenn ein Benutzer ihre Werte ändert:Wie man ein "totales" Textfeld von den Werten in einem anderen Textfeld und Radios mit Jquery aktualisiert

<tr> 
    <td>Value:</td> 
    <td> 
    <input name="value" type="text" id="value" /> 
    </td> 
</tr> 

<tr> 
    <td>Postage:</td> 
    <td> 
    <input id="express" type="radio" name="postageradio" value="PostageExpressRadio" /> 
    Express post ($3.50) 

    <input id="registered" type="radio" name="postageradio" value="PostageRegisteredRadio" /> 
    Registered post ($5.00) 
    </td> 
</tr> 

<tr> 
    <td>Total:</td> 
    <td colspan="2"> 
    <input name="total" type="text" readonly="readonly" id="total" /> 
    </td> 
</tr> 

Hier ist das Bit von jquery ich habe kommen mit, die doesn Funktioniert in Chrome nicht sehr gut (es ist langsam zu aktualisieren) und funktioniert in IE überhaupt nicht mit den Radios. Ich bin mir sicher, dass es einen besseren Weg dafür gibt, daher sind alle Vorschläge willkommen.

function calctotal() { 
    var value = $('#value').val(); 
    var amount = parseInt(value.replace(' ', '').replace('$', '')); 
    if (isNaN(amount)) amount = 0; 
    var post = 0; 
    if ($('#express').is(':checked')) post = 3.5; 
    if ($('#registered').is(':checked')) post = 5.0; 
    $('#total').val('$' + (amount + post).toFixed(2)); 
} 

// The timeout is used because otherwise the 'change' events get the previous value (???) 
function calctotalsoon() { 
    setTimeout(function() { 
    calctotal(); 
    }, 100); 
} 

$(document).ready(function() { 
    $('#value').keyup(function(event) { 
    calctotalsoon(); 
    }); 

    $('#express').change(function(event) { 
    calctotalsoon(); 
    }); 

    $('#registered').change(function(event) { 
    calctotalsoon(); 
    }); 
}); 

Vielen Dank

+0

scheint für mich in Chrome und IE8 gut zu funktionieren. Welche Version von jQuery verwenden Sie? –

+0

Einige weitere Details darüber gefunden, warum die Funkgeräte nicht im IE auslösen: http://norman.walsh.name/2009/03/24/jQueryIE – Chris

+0

Verwenden von IE9 und Jquery 1.4.1 – Chris

Antwort

2

Hier ist, wie ich es zu rationalisieren wählte, jemand anderes kann einen besseren Vorschlag. Konzeptionell war alles, was Sie getan haben, gut.

Als Erstes gibt das Attribut "value" des Optionsfelds die entsprechende Menge an Porto an, die hinzugefügt werden sollte.

<input id="express" type="radio" name="postageradio" value="3.50" /> 
<input id="registered" type="radio" name="postageradio" value="5.00" /> 

Dann rationalisiert ich das Javascript in etwa so:

function calctotal() { 
    var value = $('#value').val(); 
    var amount = parseFloat(value) || 0; 
    var post = parseFloat($("input[name=postageradio]:checked").val()) || 0; 

    $('#total').val('$' + (amount + post).toFixed(2)); 
} 

$(document).ready(function() { 
    $('#value').keyup(function(event) { 
    calctotal(); 
    }); 

    $('#express, #registered').bind('click change', function(event) { 
    calctotal(); 
    }); 
}); 

ich es in IE8, FF und Chrome getestet. Sie müssen das setTimeout nicht verwenden. Der Portowert wird nun basierend auf dem Wert des ausgewählten Optionsfelds berechnet, anstatt den Wert fest zu codieren. Die Radios werden sowohl klicken und Änderung gebunden für IE willen

Fiddle hier: http://www.jsfiddle.net/NzrBj/

+0

Ich finde, dass ich das "Klicken" -Ereignis im IE fangen muss, damit die Radios arbeiten – Chris

+0

ich sehe. Eine Sache, die ich auch bemerkte, ist, dass (und Sie können dies auch in der Geige beobachten) jQuery 1.3.2 funktioniert nicht richtig (es hat das Problem, das Sie in Ihrem ursprünglichen Posting hatten), also stellen Sie jQuery 1.4+ für das Beste sicher Ergebnisse :) – aaronofleonard

+0

@Amleonard: können Sie eine Lösung für diese http://stackoverflow.com/questions/7736434/jquery-dynamic-addition-subtraction-multiplication-division-of-multiple-text-box bieten – Ghostman

1

um die IE Probleme hacken, könnten Sie die Handler zu Ihrem Dokument hinzuzufügen. Dies bedeutet, dass Sie mehr Ereignisse als Sie wollen, aber es sollte nicht Tonnen sein:

$(document).ready(function() { 
     $(document).keyup(function(event) { 
     calctotalsoon(); 
     }); 

     $(document).click(function(event) { 
     calctotalsoon(); 
     }); 
}); 
Verwandte Themen