[Javascript] Problema focus() solo su osx

antoniocangiano76

Nuovo Utente
27 Ago 2016
4
0
1
24
Salve a tutti, ho iniziato da poco lo studio di javascript ma mi sono già imbattuto in un grosso problema che non riesco a superare e spero nell'aiuto di qualcuno di voi.
Ho realizzato un semplice form in html e, tramite una funzione js, vorrei gestire la validazione dei singoli input.
Ho scelto come evento onblur() perchè mi serve un controllo campo per campo da eseguire appena il campo stesso perde il focus e, per una serie di ragioni, il collegamento tra il tag input e la funzione js vorrei realizzarlo direttamente sul tag html senza utilizzare forme del tipo addEventListener("blur", myFunction) o myobj.onblur=myfunction().
Il controllo si basa sulla verifica che il valore inserito non sia vuoto e non sia 'pippo' (è un esempio, in futuro i controlli saranno passati alla funzione come parametri).
Vi riporto il codice :

HTML:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<form name="form1" action="cli.php" method="POST">
RAGIONE SOCIALE  : <input type="text" id="fname"  tabindex="1" onblur="valid1(this)" >
<br>
RAGIONE SOCIALE 2: <input type="text" id="riga2" tabindex="2" onblur="valid1(this)" >
<br>
INDIRIZZO        : <input type="text" id="findi" tabindex="3" onblur="valid1(this)" >
<br>
CITTA            : <input type="text" id="fcitta" tabindex="4" onblur="valid1(this)" >
<br>
PROV             : <input type="text" id="fprov" tabindex="5" onblur="valid1(this)" >
<br>
CAP              : <input type="text" id="fcap" tabindex="6" onblur="valid1(this)" >
</form>
    
<script>
    function valid1(obj) {       
        var x = obj.value;
        if ((x == "pippo") || (x==""))  {
          alert("VALORE NON CONSENTITO");
            obj.value = "";
            obj.blur();
            obj.focus(false,300);
            return false;
        }
        return true;
    }
</script>
</body>
</html>

Ora veniamo al problema. Funziona perfettamente su tutti i browser provati ma solo sotto os Windows. Io invece lavoro su osx (yosemite 10.10.1) e ho provato con firefox 49.0, chrome 53.0.2785 e safari 8.0.
Il difetto con osx consiste nel fatto che quando simulo un inserimento non consentito, mi visualizza l'alert, poi :
- su chrome imposta il focus correttamente sull'input da correggere ma mi ripresenta l'alert ciclicamente impedendomi di scrivere.
- su firefox invece sbaglia il focus e lo imposta all'input successivo lasciando il campo precedente vuoto (valore non consentito) e permettendomi di inserire il valore dell'input successivo.

Ho iniziato da pochi giorni ad imparare html, js e php ma provengo da tanti anni di programmazione in clipper e cose del genere per me sono davvero inconcepibili. Spero tanto di essere io ad avere sbagliato qualcosa anche perchè mi sembra impossibile che per gli utilizzatori osx non sia possibile risolvere un problema così semplice.
Ringrazio tutti per la pazienza e confido in voi.
 
Ciao, prova cosi
Codice:
function valid1(obj) {
                var x = obj.value;
                if ((x == "pippo") || (x == "")) {
                    alert("VALORE NON CONSENTITO"); 
                    obj.value = "";
                    obj.focus();                 
                }
            }
non è obbligatorio mettere i return se non ti servono. Il metodo focus non accetta parametri se ricordo bene e il blur() a che ti serve?
 
Ciao, grazie per la risposta. La funzione originale era esattamente come quella che mi hai proposto. Le altre aggiunte (blur e i return) le ho inserite successivamente cercando su internet una soluzione al mio problema. Sai, provengo da un linguaggio di programmazione molto diverso e che uno stesso sorgente possa dare origine a risposte così diverse in base al browser e/o al s.o. usato faccio fatica ad accettarlo.
Su google il problema è noto e ho provato molte soluzioni proposte ma nessuna sembra risolvere il problema.
Sto cercando di migrare un programma di gestione che avevo realizzato oltre 20 anni fa in clipper su web e creare una funzione personalizzabile di validazione dati è fondamentale come lo è che debba avere gli stessi comportamenti su tutte le piattaforme.
Comunque provo la routine così come me la proponi e ti faccio sapere.
Spero di venirne a capo.
 

Discussioni simili