andreaseto Δημοσ. 21 Δεκεμβρίου 2008 Δημοσ. 21 Δεκεμβρίου 2008 Προσπαθώ να κάνω σύγκριση 2 αριθμών που παίρνω από 2 πεδία που έχουν αριθμούς που επιλέγονται μέσω select σε μία φόρμα. Υποτίθεται ότι το ένα πεδίο είναι ο αρχικός μήνας και το 2ο τελικός μήνας υλοποίησης μίας εργασίας. Στον έλεγχο λαθών λοιπόν δε πρέπει να αφήνω την περίπτωση που ο αρχικός μήνας είναι μεγαλύτερος από τον τελικό. Το θέμα είναι όμως ότι η javascript δε μου κάνει καλά τον έλεγχο. Αν για παράδειγμα έχω: Αρχικός μήνας - Τελικός μήνας 1 - 11 ---> όλα καλά είναι αποδεκτό 4 - 11 ---> Ενω θα έπρεπε να είναι αποδεκτό δεν είναι και πετάει ότι είναι λάθος!! 4 - 9 ---> όλα καλά είναι αποδεκτό Τι κάνω λάθος? Σας παραθέτω τον κώδικα της συνάρτησης που ασχολείται με τον συγκεκριμένο έλεγχο και όλο τον κώδικα html που έχει να κάνει με τα 2 select πεδία Javascript: > var re = document.getElementById('end_month').value < document.getElementById('start_month').value; alert('end month--> ' + document.getElementById('end_month').value + ' start month --> ' + document.getElementById('start_month').value + ' result = ' + re); if(document.getElementById('end_month').value < document.getElementById('start_month').value) { alert('end month--> ' + document.getElementById('end_month').value + ' start month --> ' + document.getElementById('start_month').value); document.getElementById('spry_start_month_msg').setAttribute("class", "formErrorMessage"); document.getElementById('start_month').setAttribute("class", "formErrorSign"); return false; } else return true; Τα alert είναι για λόγους testing. Η αντίστοιχη html (το επίμαχο κομμάτι): > <tr valign="top"> <td width="<%= categoryWidth%>" class="category"><a href="" id="start_monthExplain" rel="start_monthHelpBox"><%= Constants.QUESTION_MARK %> Start Month:</a></td> <td width="26%"> <span id="spry_start_month_wp"> <label> <select name="start_month" id="start_month" > <option selected="selected">1</option> <% int projectPeriod = Constants.mySqlFactory.getProjectDAO().getProjectDurationInMonths(project); for(int i = 2; i <= projectPeriod; ++i) { if(newWp != null && newWp.getStartMonth() == i) out.print("<option selected=\"selected\">" + i + "</option>"); else out.print("<option >" + i + "</option>"); } %> </select> </label> <span id="spry_start_month_msg" class="invisible">Smaller or equal value required</span> </span> </td> <td width="11%" class="category"><a href="" id="end_monthExplain" rel="end_monthHelpBox"><%= Constants.QUESTION_MARK %> End Month:</a></td> <td width="50%"> <span id="spry_end_month_wp" > <label> <select name="end_month" id="end_month"> <option selected="selected">1</option> <% for(int i = 2; i <= projectPeriod; ++i) { if(newWp != null && newWp.getEndMonth() == i) out.print("<option selected=\"selected\">" + i + "</option>"); else out.print("<option>" + i + "</option>"); } %> </select> </label> </span> </td> </tr> Αν μπορεί κάποιος ας με βοηθήσει. Ευχαριστώ!
kfyros Δημοσ. 21 Δεκεμβρίου 2008 Δημοσ. 21 Δεκεμβρίου 2008 Μάλλον πρέπει να του πεις να κάνει numeric comparison (τα πεδία είναι αριθμοί και όχι strings) . Αν αυτά τα βλέπει σαν text, τότε η μετατροπή τους σε numeric value είναι σωστή και σου πετάει το alert. Αν προσέξεις στο κάνει με τα διψήφια: Πχ. η μετατροπή του string "11" σε αριθμητική αξία μπορεί να είναι 2 το οποίο είναι μικρότερο από το 4. Δεν θυμάμαι πως το κάνεις αυτό με java . Δες και το www.w3schools.com για βοήθεια.
andreaseto Δημοσ. 21 Δεκεμβρίου 2008 Μέλος Δημοσ. 21 Δεκεμβρίου 2008 Ευχαριστώ για την άμεση απάντηση. Μου πέρασε από το μυαλό σε μια φάση, αλλά αν θυμάμαι καλά και από όσο είδα εδώhttp://www.devarticles.com/c/a/JavaScript/The-Power-of-Javascript-Operators/2/ η javascript αυτόματα μετατρέπει σε αριθμούς το κείμενο αν μπορεί. Και σε μένα είναι αριθμοί. Μου διαφεύγει κάτι;
fromaz Δημοσ. 21 Δεκεμβρίου 2008 Δημοσ. 21 Δεκεμβρίου 2008 Η θα κάνεις σύγκριση του selectedIndex ή θα χρησιμοποιήσεις την parseInt για μετατροπή του value σε integer (ο αυτοματισμός που λες δεν γίνεται καθώς συγκρίνεις δύο strings). Το οποίο value - by the book - πρέπει να το παίρνεις γράφοντας selObj.options[selIdx].value, και όχι σκέτο selObj.value. Αλλά εσύ δεν χρησιμοποιείς το attribute value στο markup σου (κακώς). Οπότε θα πρέπει να γράψεις parseInt(selObj.options[selIdx].text). Συνεπώς, ο κώδικας σου αντιμετωπίζει θεματάκια συμβατότητας. Η απλούστερη λύση στην περίπτωσή σου είναι: var sm = document.getElementById('start_month').selectedIndex; var em = document.getElementById('end_month').selectedIndex; if (em < sm) ... Sorry που στα γράφω λίγο μπερδεμένα, είμαι insomniac σήμερα...
andreaseto Δημοσ. 21 Δεκεμβρίου 2008 Μέλος Δημοσ. 21 Δεκεμβρίου 2008 Ευχαριστώ πολύ!!!! Χρησιμοποίησα την parseInt που δεν την είχα υπόψη μου γιατί είχα μείνει στην αυτόματη μετατροπή των αριθμητικών strings σε αριθμούς. Και όσο για το value που λες πάντα το χρησιμοποιώ απλά στην προκειμένη περίπτωση τα είχα αφαιρέσει μήπως και "φταίγανε" αυτά (δεν είμαι καλός γνώστης της javascript ακόμα). Τα επανέφερα και με την parseInt όλα ρολόι! Σας ευχαριστώ και τους 2 που μπήκατε στον κόπο κυριακάτικα να βοηθήσετε!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.