Μήκος (Length) string ή κατι αλλο;

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από Christianago » 26 Μάιος 2012 11:11

Το παρον προγραμμα διαλεγει εναν αριθμο απο ενα τυχαιο κουτακι για πχ. 20 φορες,
εμφανιζει τους αριθμους απο τα κουτακια στο χρηστη που εχουν επιλεγει μεχρι στιγμης, και επειτα τους διαγραφει απο τα εκταστοτε κουτακια.
Αυτο που θελω να κανω ειναι το προγραμμα να διακοπτεται μολις σχηματιστει string με μηκος πχ. 5 χαρακτηρες.
Το προγραμμα δουλευει κανονικα, μονο που ειτε τερματιζει οταν σχηματισει string κατω απο 5 αριθμους ειτε πάνω από 5,
ενώ σπάνια τερματιζει οταν σχηματισει string ακριβως 5 αριθμων, που ειναι το ζητουμενο.

HMTL

Κώδικας: Επιλογή όλων

<html>
<head>
<script type="text/javascript" src="http&#58;//code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="word.js"></script>
<title>Words</title>
</head>
<body>
<div id="various"></div>
</body>
</html>
Javascript

Κώδικας: Επιλογή όλων

$&#40;document&#41;.ready&#40;function&#40;&#41;&#123;

for &#40;var i = 0; i < 15; i++&#41;&#123;
if&#40;i % 5 == 0&#41; 
$&#40;"body"&#41;.append&#40;"<br><input type=text id="+i+" />"&#41;;
else $&#40;"body"&#41;.append&#40;"<input type=text id="+i+" />"&#41;;
&#125;

$&#40;"body"&#41;.append&#40;"<br><input type=button value=Words id=words />"&#41;;
$&#40;"body"&#41;.append&#40;"<input type=button value=Populate id=populate />"&#41;;
  
$&#40;'#words'&#41;.click&#40; function &#40;&#41; &#123; processWords&#40;&#41;; &#125;&#41;; // Κυρια συναρτηση
$&#40;'#populate'&#41;.click&#40; function &#40;&#41; &#123; populate&#40;&#41;; &#125;&#41;;   //Συναρτηση για καταχωρηση τυχαιων αριθμων στα κουτακια
&#125;&#41;; 


function processWords&#40;&#41;&#123;
 
var letter = 0;
var i = 0;
while&#40;i < 20&#41;&#123;

if &#40;letter.length == 5&#41; break; //Λογικο λαθος;;

var k3ys = "";
var klidi;

$&#40;"input&#91;type=text&#93;"&#41;.each&#40;function&#40;&#41; &#123; k3ys += "," + $&#40;this&#41;.attr&#40;'id'&#41;; &#125;&#41;;

$.ajax&#40;&#123;
        type&#58; "POST",
        data&#58; "keys=" + k3ys,
        url&#58; "http&#58;//localhost/processWords.php",
        success&#58; function&#40;html&#41;&#123;
        klidi = html - 5;
        $&#40;'#various'&#41;.html&#40;letter&#41;;
        
        if &#40;klidi < 0 || $&#40;'#'+klidi&#41;.val&#40;&#41;.length == ""&#41;&#123;  //Επιλογη αριθμων μονο απο κουτακια πρωτης γραμμης
//ή απο επομενη γραμμη εφοσον το ακριβως απο πανω κουτακι εχει επιλεγει.
        letter = letter + $&#40;'#'+html&#41;.val&#40;&#41;;
        $&#40;'#'+html&#41;.val&#40;""&#41;;
        &#125;
        
        &#125;&#125;&#41;;  
        
i++;        
    &#125;
&#125;

function populate&#40;&#41;&#123;
for &#40;var i = 0; i < 15; i++&#41;
$&#40;'#'+i&#41;.val&#40;Math.ceil&#40;Math.random&#40;&#41;*9&#41;&#41;;    //Εισαγωγη τυχαιων αριθμων στα κουτακια
&#125;

PHP

Κώδικας: Επιλογή όλων

$strings = substr&#40;$_POST&#91;'keys'&#93;, 1&#41;;
$indices = explode&#40;",", $strings&#41;;
echo $arr&#91;0&#93; = array_rand&#40;$indices&#41;;
Φανταζομαι το προβλημα βρισκεται στην προταση:

Κώδικας: Επιλογή όλων

if &#40;letter.length == 5&#41; break;
που αν και (μαλλον) αληθευει η προταση, εντουτοις συνεχιζεται η εκτελεση του κωδικα,
αντι να διακοπτεται. Σιγουρα υπαρχει καποιο λογικο λαθος αλλα δεν ξερω ποιο ειναι. :-?

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 12:45

var letter = "" όχι 0 (string όχι integer) και όπου / αν το θες integer κάντο με parseInt(letter), νομίζω αυτό είναι το πρόβλημά σου αν και δεν είμαι σίγουρος ότι κατάλαβα το function

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από Christianago » 26 Μάιος 2012 13:02

Βασικα δεν αλλαζει κατι γιατι ουτως η αλλως παιρνω το μηκος της μεταβλητης, δε με απασχολει αν ισουται με strings ή αριθμους.
Δες εδω αν αλλαξω αυτη τη γραμμη:

Κώδικας: Επιλογή όλων

$&#40;'#various'&#41;.html&#40;letter&#41;;
σε:

Κώδικας: Επιλογή όλων

$&#40;'#various'&#41;.html&#40;letter.length&#41;;
θα μου δειχνει συνεχεια το μηκος της.
Πολλες φορες το μηκος ειναι 4, αλλες 7, αλλα παρολα αυτα δεν τερματιζει το προγραμμα
μονο οταν το μηκος εινια 5.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 17:50

Christianago έγραψε:Βασικα δεν αλλαζει κατι γιατι ουτως η αλλως παιρνω το μηκος της μεταβλητης, δε με απασχολει αν ισουται με strings ή αριθμους.
Δες εδω αν αλλαξω αυτη τη γραμμη:

Κώδικας: Επιλογή όλων

$&#40;'#various'&#41;.html&#40;letter&#41;;
σε:

Κώδικας: Επιλογή όλων

$&#40;'#various'&#41;.html&#40;letter.length&#41;;
θα μου δειχνει συνεχεια το μηκος της.
Πολλες φορες το μηκος ειναι 4, αλλες 7, αλλα παρολα αυτα δεν τερματιζει το προγραμμα
μονο οταν το μηκος εινια 5.
Παίζει ρόλο, δοκίμασε αυτό:

Κώδικας: Επιλογή όλων

var integervar = 5647;
var stringvar = "5647";

alert&#40;integervar.length&#41;; // undefined
alert&#40;stringvar.length&#41;;//4
Οπότε δεν έχει νόημα να ελέγξεις κάτι που είναι undefined.

Βέβαια από ένα σημείο και μετά γίνεται string γιατί μπαίνει html, αλλά ίσως θέλει λίγο ψάξιμο.

Το ένα θέμα είναι αυτό και το άλλο θέμα με τα ασύγχρονα request που πιθανώς να μην φέρνουν το αποτέλεσμα την σωστή στιγμή για να το ελέγξεις, κάνω και εγώ κάποια δοκιμή τώρα με τον κώδικά σου και αν δω πιο συγκεκριμένα κάτι σου λέω.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από Christianago » 26 Μάιος 2012 18:13

Αλλαξα τις παρακατω γραμμες και εξακολουθω να παιρνω την ιδια συμπεριφορα.
Παντως οντως ειχες δικιο πιο πανω.

Κώδικας: Επιλογή όλων

var letter = "";

Κώδικας: Επιλογή όλων

if &#40;parseInt&#40;letter.length == 5&#41;&#41;

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από cpulse » 26 Μάιος 2012 18:25

Από το τελευταίο που έγραψες, σβήσε το parseInt και είσαι μια χαρά

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από Christianago » 26 Μάιος 2012 18:30

Το εγραψα λαθος, το σωστο ειναι:

Κώδικας: Επιλογή όλων

if &#40;parseInt&#40;letter.length&#41; == 5&#41;
Και παλι με το

Κώδικας: Επιλογή όλων

 if &#40;letter.length == 5&#41; 
μια απο τα ιδια.
Σε οσους το δοκιμασαν τους τρεχει σωστα;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 18:36

Δεν ξέρω αν υπάρχει καλύτερος τρόπος, αλλά πρέπει να γίνει ο έλεγχος εκεί μαλλον για να έχεις το σωστό αποτέλεσμα.

Εμένα έτσι μου φάνηκε ΟΚ:

Κώδικας: Επιλογή όλων

function processWords&#40;&#41;&#123;
var stringletter = ""
var letter = 0;
var i = 0;

while &#40;i < 20 &#41;&#123;
var k3ys = "";
var klidi;
$&#40;"input&#91;type=text&#93;"&#41;.each&#40;function&#40;&#41; &#123; k3ys += "," + $&#40;this&#41;.attr&#40;'id'&#41;; &#125;&#41;;
$.ajax&#40;&#123;		
        type&#58; "POST",
        data&#58; "keys=" + k3ys, 
		url&#58; "processWords.php",
        success&#58; function&#40;html&#41;&#123;
        if &#40;html == 'stop'&#41; &#123;
		alert&#40;'stoped'&#41;;
		return false;
		&#125; else &#123;
			//var exhtml = $&#40;'div#testit'&#41;.html&#40;&#41;;
			//$&#40;'div#testit'&#41;.html&#40;exhtml + html&#41;;
			klidi = html - 5;
			if &#40;stringletter.length < 7 &#41; &#123;
        		$&#40;'#various'&#41;.html&#40;letter&#41;;
        		if &#40;klidi < 0 || $&#40;'#'+klidi&#41;.val&#40;&#41;.length == ""&#41;&#123;  //Επιλογη αριθμων μονο απο κουτακια πρωτης γραμμης
				//ή απο επομενη γραμμη εφοσον το ακριβως απο πανω κουτακι εχει επιλεγει.
				//alert&#40;stringletter.length&#41;;
				letter = letter + $&#40;'#'+html&#41;.val&#40;&#41;;
        		$&#40;'#'+html&#41;.val&#40;""&#41;;
        		&#125;
				stringletter = letter + "a";
			&#125;
		&#125;
       
        &#125;&#125;&#41;; 
       
i++;       
    &#125;
&#125;

Το επόμενο που θα δοκίμαζα θα ήταν στα data να στέλνω και την τιμή του letter και να τσεκάρω εκεί αν θα επιστρέψω αποτέλεσμα αλλά μάλλον είναι είναι πιο μπέρδεμα.

edit: έκανα remark 2 γραμμές που είχα για να δω τι επιστρέφει η php

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από Christianago » 26 Μάιος 2012 19:04

Ενδιαφερον ο κωδικας σου μπορει να μου εξηγησεις λιγο την αρχιτεκτονικη του; Σε ευχαριστω παντως.
Αν δε σου ειναι κοπος μπορεις να μου πεις πως μπορω να βελτιστοποιησω το προγραμμα
με το να μην επιλεγω 2 φορες το ιδιο κουτακι και να γλυτωσω τις επαναληψεις;
Αυτο θα γινεται μαλλον μεσω php και κυριως μεσω της array_rand.

EDIT: Η γραμμη που κανει μαλλον τη δουλεια ειναι αυτη απο οτι ειδα:

Κώδικας: Επιλογή όλων

stringletter = letter + "a";
Τα υπολοιπα πρεπει να τα εβαλες για να τεσταρεις μαλλον.
Γιατι προσθετεις ενα χαρακτηρα στο string?
Τελευταία επεξεργασία από το μέλος Christianago την 26 Μάιος 2012 19:20, έχει επεξεργασθεί 1 φορά συνολικά.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 19:18

Η διαφορά σε σχέση με αυτό που είχες είναι ότι για να αφήσω integer την letter και να μη γίνει άλλο μπέρδεμα, έβαλα στο κόλπο άλλη μια μεταβλητή, string που στην πορεία γίνεται letter + a (για να είμαι σίγουρος ότι παραμένει string προσθέτω το a), δηλαδή έχει ένα παραπάνω ψηφία από όσο θέλαμε.

Άρα, τσεκάρεις να είναι τα ψηφία της stringletter μέχρι 6
...
if (stringletter.length < 7 ) {
...

Και βέβαια κάνω τον έλεγχο όταν είναι να αλλάξουν η τιμές στο #various γιατί στην άλλη περίπτωση, με τα ασύγχρονα request το αποτέλεσμα ήταν απρόβλεπτο (που σημαίνει ότι γίνονται παραπάνω request από όσα ενδεχομένως χρειάζονται - αυτό σίγουρα θέλει βελτίωση).

Επειδή και εγώ μαθαίνω πάντως μη φαντάζεσαι ότι είναι απαραίτητα η καλύτερη δυνατή λύση, απλά αυτό σκέφτηκα.

Αν βρω λίγο χρόνο ευχαρίστως να δω αν σκεφτώ κάτι καλύτερο για τις επαναλήψεις.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 19:22

Ασύγχρονα post :P

Νομίζω απάντησα σε αυτό που ρωτάς, είναι για να είμαι σίγουρος ότι θα παραμείνει string και δεν θα είναι undefined το length.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από cpulse » 26 Μάιος 2012 19:29

alou αυτό το κολπάκι με το casting σε string λειτουργεί και με άδειο string
stringletter = letter + "";

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 19:31

cpulse έγραψε:alou αυτό το κολπάκι με το casting σε string λειτουργεί και με άδειο string
stringletter = letter + "";
thanks, λογικό ;)

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από cpulse » 26 Μάιος 2012 19:49

Christianago αυτό που μάλλον σε μπερδεύει και που πάει να αλλάξει ο alou είναι ο τύπος της μεταβλητής.

Άμα είναι integer, είναι αριθμός. Στους αριθμούς ισχύει
v = 1 + 1;
Βγάζει 2

Άμα είναι string, είναι ακολουθεία χαρακτήρων. Στα strings ισχύει
v = "1" + "1";
Βγάζει 11

Στην περίπτωση που πάς να κάνεις μίξη ενός τύπου μεταβλητής με έναν άλλο, γίνεται αυτόματο "casting", δηλαδή μετατροπή τύπου.
v = 1 + "1";
Βγάζει 11

Και έχω την εντύπωση οτι παίζει ρόλο ποιός τύπος ξεκινάει την πράξη. Δηλαδή στο κολπάκι που έκανε πριν ο alou ίσως να είναι σωστότερο
stringletter = "" + letter;

Μετά, μόνο τα strings έχουν μήκος. Δηλαδή μόνο σε strings μπορείς να εφαρμόσεις την μέθοδο .length .

Το parseInt() που πήγες να χρησιμοποιήσεις πριν, μετατρέπει ένα string σε integer. Δηλαδή το parseInt(letter) έχει νόημα γιατί είναι string. Το parseInt(letter.length) δεν έχει νόημα γιατί βάζει από μόνο του αριθμό.

Αν σε μπερδεύει το πρόγραμμα μπορείς να χρησιμοποιήσεις την typeof για να δεις αν είναι string ή integer ή boolean ή object κτλ κτλ. Δηλαδή σε σημεία κλειδιά στον κώδικα σου γράψε alert(typeof letter) για να σιγουρευτείς τι μορφή έχει σε κάθε σημείο.

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Μήκος (Length) string ή κατι αλλο;

Δημοσίευση από alou » 26 Μάιος 2012 20:33

cpulse πάντα μπερδεύω τα type casting rules και ειδικά αν λάβεις υπόψιν τις επιλογές normal ή strict equity ... :/

Ένα bookmark που έχω για αυτό το λόγο είναι:
http://bonsaiden.github.com/JavaScript-Garden/#types

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες