Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Scoperto bug nel DOM di MSIE?

    In questo semplice script la prima funzione aggiunge dei text input inserendoli nel DOM.
    La seconda funzione controlla il form verificando che gli input esistenti contengano dei valori numerici.

    Lanciando il codice sotto riportato si vede che MSIE è in grado di controllare solo gli input statici presenti nell'HTML, non quelli generati dinamicamente nel DOM.
    Firefox invece legge correttamente gli oggetti inseriti successivamente nel DOM.

    Siccome entrambi i browser utilizzati, alle versioni 7.0 (MSIE) e 1.5.0.10 (Firefox) supportano il DOM (anche se con qualche variazione di interpretazione), appare anomalo il comportamento di MSIE e non ho trovato informazioni o riscontri a riguardo.
    Potete darmi qualche feedback please o suggerire qualche hack?

    Prova il file demo.


    codice:
    <html>
    <head>
    <title>MSIE fails</title>
    <script language="javascript" type="text/javascript">
    <!--
    var count = 3; // fields already existing;
    	function addField() {
    		var d = document;
    		if (count < 10) {
    			count++;
    			var newLi = d.createElement('li');
    			d.getElementById('fieldsList').appendChild(newLi);
    			
    			var text2 = d.createTextNode('Value: ');
    			
    			var newValue = d.createElement('input');
    			newValue.setAttribute('type', 'text');
    			newValue.setAttribute('name', 'value_' + count);
    			newValue.setAttribute('size', '2');
    			
    			newLi.appendChild(text2);
    			newLi.appendChild(newValue);
    		}
    		else {
    			alert('Maximum 10 fields allowed.');
    		}
    	}
    
    	function checkFields() {
    		var counter = 1;
    		var msg = '';
    		while (counter <= 10) {
    			var objStr = "document.xForm.value_" + counter;
    			var obj = eval(objStr);
    			if (typeof(obj) != 'undefined') { // if the object exists:
    				var objValue = parseFloat(obj.value); // the value is typecasted, but returns NaN (false) if not numeric;
    				if (!objValue) {
    					msg += 'Field #' + counter + ' is NOT numeric!\n';
    				} else { msg += 'Field #' + counter + ' ok.\n'; }
    			} else { msg += objStr + ' does not exist.\n'; }
    			counter++;
    		}
    		if (msg != '') {
    			alert(msg);
    			return false;
    		} else {
    			alert('OK');
    			return true;
    		}
    	}
    //-->
    </script>
    </head>
    
    <body>
    <h1>MSIE DOM fails (FireFox does not)</h1>
    Click "checkField" button to check if the existing values are numbers.
    
    Add new field (max 10 fields).
    
    <form name="xForm">
    Enter numeric values (integer or double):
    
    1. Value: <input type="text" size="2" name="value_1" />
    2. Value: <input type="text" size="2" name="value_2" />
    3. Value: <input type="text" size="2" name="value_3" />
    <input type="button" value="checkFields" onclick="checkFields();" /> <input type="reset" value="reset values" /> </form> </body> </html>
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    no, i fields sono tutti là... probabilmente l'eval fa casino

    prova infatti a sostituire tutta quella pappardella con un più efficace
    codice:
    function checkFields() {
    		for (var i = 0; i < document.xForm.elements.length; i++) {
    			alert(document.xForm.elements[i].value);
    		}
    	}
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Originariamente inviato da Andrea1979
    no, i fields sono tutti là... probabilmente l'eval fa casino

    prova infatti a sostituire tutta quella pappardella con un più efficace
    codice:
    function checkFields() {
    		for (var i = 0; i < document.xForm.elements.length; i++) {
    			alert(document.xForm.elements[i].value);
    		}
    	}
    Capisco, ma ho adottato quella soluzione perché nel form reale ci sono molti text input differenti, la cui identità posso discriminare solo a partire dal nome (o volendo anche dall'id).

    Spero che l'unica soluzione non sia quella di scorrere tutti gli elementi del form nel for che hai indicato mettendo al suo interno una regExp per controllare il nome del campo...
    Si può fare qualcosa per far mangiare quell'eval a MSIE?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  4. #4
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    a me eval non è mai piaciuto ...

    tra l'altro, se devi raggruppare dei vari signori, invece di dargli nomi tipo value_1 value_2 value_1021081720120, usa un più tranquillo nome_x[] per tutti gli appartenenti al gruppo "x", magari va?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  5. #5
    Sì è vero, eval() non è il massimo...
    Inoltre al client pesa un bel po'.

    Per ora ho risolto con il ciclo for per scorrere tutti gli elementi e uno split() invece della RegExp:
    Codice PHP:
        function checkFields() {
            var 
    msg '';
            for (var 
    0document.xForm.lengthi++) {
                var 
    el document.xForm.elements[i];
                
    fExt el.name.split("_");
                if (
    fExt[0] == 'value') {
                var 
    objValue parseFloat(document.xForm.elements[i].value); // the value is typecasted, but returns NaN (false) if not numeric;
                    
    if ((!objValue) && (objValue.toString() != "0")) {
                        
    msg += 'Field #' + (1) + ' is NOT numeric!\n';
                    } else { 
    msg += 'Field #' + (1) + ' ok.\n'; }
                }
            }
            if (
    msg != '') {
                
    alert(msg);
                return 
    false;
            } else {
                
    alert('OK');
                return 
    true;
            }
        } 
    La soluzione per adesso è ancora lì:
    http://www.netpark.it/test/demo.htm

    Provo anche la tua soluzione: dare un nome con le [] in coda vuol dire creare una matrice di elementi, giusto? Ora testo anche questo.
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  6. #6
    Buona la soluzione della matrice di elementi con lo stesso nome, si eliminano così anche eventuali problemi di attribuzione del nome.
    Ecco la soluzione funzionante:
    Codice PHP:
        function checkFields() {
            var 
    msg '';
            var 
    objs document.xForm.elements["values[]"];
            for (var 
    0objs.lengthi++) {
                var 
    objValue parseFloat(objs[i].value); // the value is typecasted, but returns NaN (false) if not numeric;
                    
    if ((!objValue) && (objValue.toString() != "0")) {
                        
    msg += 'Field #' + (1) + ' is NOT numeric!\n';
                    } else { 
    msg += 'Field #' + (1) + ' ok.\n'; }
            }
            if (
    msg != '') {
                
    alert(msg);
                return 
    false;
            } else {
                
    alert('OK');
                return 
    true;
            }
        } 
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  7. #7
    Grazie del suggerimento Andrea
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  8. #8

    No, MSIE non va!

    Pardon, con MSIE continua a non andare.

    In seguito al suggerimento di andrea1979 ho sostituito gli oggetti simili con oggetti aventi lo stesso nome seguito da [] (creazione di un array di oggetti), accedendo a questi con:

    document.nomeForm.elements["nomeCampo[]"]

    di cui leggevo la proprietà length per contare il numero di input già esistenti.
    Resta il fatto che inserendo dinamicamente nel DOM altri input MSIE non li legge.
    Forse la sintassi un po' datata non veniva interpretata correttamente (o per niente), dal momento che Microsoft tende ad accantonare sintassi obsolete in favore di altre più efficienti (aggiornate), pertanto ho sostituito con:

    document.getElementsByName("nomeCampo[]").length

    ma il problema di MSIE resta.
    Stavolta non è possibile dire che gli elementi ci sono, infatti ho inserito un alert di controllo:

    alert(document.getElementsByName('values[]').length);

    che con MSIE restituisce sempre 3, mentre con Firefox si incrementa all'effettivo numero di input presenti nel documento.

    Il file demo è sempre lì:
    http://www.netpark.it/test/demo.htm
    esteso anche con la funzione errorInfo() per l'autorilevazione degli errori Javascript, che ovviamente non rileva alcun passo falso (ovviamente oltre alla JavaScript Console di Firefox).

    Attendo da voi sapienti una risposta esplicativa...

    MSIE:
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  9. #9
    up
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  10. #10
    Ragazzi me è possibile che nessuno abbia una soluzione a questo problema?

    Io sono mesi che cerco di risolvere questo schifosissimo baco di Explorer (perchè visto che su Firefox funziona benissimo, non può che trattarsi di baco)


    Non è possibile che il browser più utilizzato dagli utenti medi faccia così schifo!
    Il problema è che convincere la gente a non usarlo è impossibile, quindi non resta che adattare le nostre povere pagine a questa sottospecie di browser, cosa che faccio di continuo... ma questa volta proprio non so dove sbattere la testa!


    VI PREGO AIUTATEMIIIIIIII!
    :quote:
    ORA DI VENDERE - La prima vera agenzia di vendita su internet aperta a Torino
    http://www.oradivendere.it

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.