document.getElementById (id) .focus () funktioniert nicht für Firefox oder Chrome

71

Wann immer ich ein Änderungsereignis mache, wird es innerhalb dieser Funktion validiert, aber der Fokus kommt nicht, den ich benutze document.getElementById('controlid').focus();

Ich verwende Mozilla Firefox und Google Chrome, beide funktionieren nicht. Ich möchte keinen IE. Kann mir jemand sagen, was mir der Grund sein könnte.

Danke im Voraus

Hier ist der Code:

var mnumber = document.getElementById('mobileno').value; 
if(mnumber.length >=10) {
    alert("Mobile Number Should be in 10 digits only"); 
    document.getElementById('mobileno').value = ""; 
    document.getElementById('mobileno').focus(); 
    return false; 
}
SKSK
quelle
1
Bitte geben Sie einen Code ein, damit wir sehen können, was los ist. Versuchen Sie auch, Ihre Frage ein wenig zu bereinigen.
Andy E
Tun Sie dies im Onload-Handler?
Maurice Perry
Ok .. ich mache Handy nein. Validierung, in diesem Änderungsereignis habe ich wie folgt geschrieben: var mnumber = document.getElementById ('mobilo'). value; if (mnumber.length> = 10) {alert ("Handynummer sollte nur 10-stellig sein"); document.getElementById ('mobilo'). value = ""; document.getElementById ('mobilo'). focus (); falsch zurückgeben; } Wenn hier jemand Ziffern unter 10 eingibt, wird eine Warnung angezeigt und das Textfeld gelöscht, nachdem der Fokus auf das nächste Feld gelegt wurde. Ich versuche, in demselben Feld anzugeben, dass es nicht für Mozilla und Crome kommt.
SKSK
Hast du dein HTML-Attribut 'index' hinzugefügt?
Alberto Acuña

Antworten:

108

Versuchen Sie es mit einem Timer:

var mnumber = document.getElementById('mobileno').value;
if (mnumber.length >=10) 
{ 
    alert("Mobile Number Should be in 10 digits only");
    document.getElementById('mobileno').value = "";
    window.setTimeout(function ()
    {
        document.getElementById('mobileno').focus();
    }, 0);
    return false;
}

Ein Timer mit einer Anzahl von 0 wird ausgeführt, wenn der Thread inaktiv wird. Wenn dies nicht hilft, versuchen Sie stattdessen den Code (mit dem Timer) im Ereignis onblur.

Andy E.
quelle
1
Ich mag es nicht zu verstehen, weil ich alles vergesse, aber wenn ich etwas verstehe, verstehe ich es einfach und ich muss mich nicht daran erinnern. Ich habe also eine Frage an @AndyE. Wo hast du das gelernt? Ich würde gerne etwas über Javascript-Spezifikationen lesen. Ich weiß, dass Implementierungen nicht unbedingt folgen werden, aber wenn Sie sagen " wird ausgeführt, wenn der Thread inaktiv wird ", habe ich sofort verstanden, warum es nicht funktioniert hat. Also würde ich gerne etwas über Interna lernen.
Iharob Al Asimi
1
Ich möchte das ausgraben, aber ja, wie oben erwähnt, warum funktioniert das?
Duc
Eine Erklärung finden Sie hier stackoverflow.com/questions/33955650/… und hier stackoverflow.com/questions/779379/…
Ted Whitehead
Dies ist auch eine wirklich gute visuelle Darstellung der JS Event Loop blog.sessionstack.com/…
Ted Whitehead
@AndyE Soooper neugierig, genau zu wissen, wie es funktioniert.
aeXuser264
60

2 Dinge zu erwähnen, wenn focus()nicht funktioniert:

  • Verwenden Sie diese Funktion, nachdem Sie sie an das übergeordnete Element angehängt haben
  • Wenn die Konsole ausgewählt ist, wird das Element nach dem Aktualisieren der Seite nicht fokussiert. Wählen Sie daher beim Testen die Webseite aus (klicken Sie darauf)

Diese Methode funktioniert sowohl in Firefox als auch in Chrome ohne setTimeOut().


quelle
33
Das Schließen der Konsole in Chrome löste dieses seltsame Problem.
Boaz
9
Teufel noch mal! Sie haben mir Stunden beim Debuggen erspart. Wenn die Konsole ausgewählt ist, funktioniert die Fokusmethode nicht. Wenn ich dich kennen würde, würde ich dir ein Bier kaufen!
Mauricio Soares
2
Ich habe immer die Konsole vergessen -.- danke, dass du dich an mich erinnert hast =)
Can Rau
6
Ich hatte auch die Firefox Development Tools (dh console) geöffnet, und das Schließen hat das Problem für mich
behoben
1
Vielen Dank für die Klarstellung über die Konsole. Weil ich mich gefragt habe, warum mein einfaches a [0] .focus () nicht funktioniert
Roma
31
window.setTimeout(function () { 
    document.getElementById('mobileno').focus(); 
}, 0); 

Das hat auch bei mir funktioniert. Firefox würde den Wert meines Elements festlegen, ihn aber nicht fokussieren.

Robin B.
quelle
17

Mein Fall war etwas anders. Ich habe versucht, focus()eine Eingabe über eine Browser-Entwicklerkonsole vorzunehmen. Es stellte sich heraus, dass es irgendwie die Eingabe störte, und als ich die Konsole minimierte, funktionierte alles wie erwartet . Ich verstehe, dass dies keine programmatische Lösung ist, aber falls jemand dies wie ich in einer Suchmaschine gefunden hat, besteht die Möglichkeit, dass diese Informationen hilfreich sind.

aexl
quelle
3
Das ist eigentlich die Antwort! Chrome Dev Tools verhindern die Fokusaktion.
elad.chen
16

Nicht alle Elemente sind fokussierbar, aber standardmäßig gibt es ein tabindex-Attribut, um dies zu beheben.

Wenn Sie einem Element tabindex = zuweisen:

Es wird fokussierbar. Ein Benutzer kann die Tabulatortaste verwenden, um vom Element mit weniger positivem Tabindex zum nächsten zu wechseln. Die Ausnahme ist ein spezieller Wert. Tabindex = "0" bedeutet, dass das Element immer das letzte ist. Der tabindex = -1 bedeutet, dass ein Element fokussierbar wird, aber die Tabulatortaste überspringt es immer. Nur die focus () -Methode funktioniert

Dharmendra Pokhariya
quelle
Tolle Erklärung. Alle meine tabIndex-Probleme wurden behoben
Guy Sopher
5

Eine weitere Sache, die Sie zu dieser Liste hinzufügen müssen, um Folgendes zu überprüfen:

Stellen Sie sicher, dass das Element, das Sie fokussieren möchten, zum Zeitpunkt des Fokussierens weder selbst noch in einem Element mit "display: none" enthalten ist.

justFatLard
quelle
4

So stellen Sie den Fokus wieder her, um das Textfeld für das Kennwort in Javascript erneut einzugeben:

window.setTimeout(function() { document.forms["reg"]["retypepwd"].focus(); },0);

Hier regist der Name des Registrierungsformulars.

veena
quelle
3

Ich vermute, der Grund dafür ist, dass das Browser-Rendering im selben Thread wie Javascript und setTimeout (function () {}, 0) ausgeführt wird. Stellt die Javascript-Funktion in setTimeout in die Warteschlange, um sie auszuführen, wenn der Browser inaktiv wird. Wenn jemand eine ausführlichere Erklärung hat, teilen Sie diese bitte mit.

setTimeout(function(){ 
 if(document.getElementById('mobileno')){
  document.getElementById('mobileno').focus();
 } 
},0);
Alejandro Esquivel
quelle
2

Ich weiß, dass dies ein esoterischer Anwendungsfall sein kann, aber ich hatte Probleme, eine Eingabe zu erhalten, um den Fokus bei der Verwendung des Angular 2-Frameworks zu erhalten. Das Aufrufen von focus () hat einfach nicht funktioniert, egal was ich getan habe.

Letztendlich wurde mir klar, dass Angular es unterdrückte, weil ich kein [(ngModel)] für den Eingang festgelegt hatte. Einstellen löste es. Hoffe es hilft jemandem.

Parlament
quelle
1

Versuchen Sie, auf das Element zu verweisen, bevor das Laden des DOM abgeschlossen ist?

Ihr Code sollte in Body Load (oder einer anderen Funktion, die ausgeführt werden soll, wenn das DOM geladen wurde, z. B. $(document).ready()in jQuery) ausgeführt werden.

body.onload = function() { 
    // your onchange event handler should be in here too   
    var mnumber = document.getElementById('mobileno').value; 
    if(mnumber.length >=10) {
        alert("Mobile Number Should be in 10 digits only"); 
        document.getElementById('mobileno').value = ""; 
        document.getElementById('mobileno').focus(); 
        return false; 
    }    
}
Russ Cam
quelle
1

Stellen Sie sicher, dass Sie "id" und "getElementById" wie hier gezeigt verwenden:

<FORM id="my_form" name="my_form" action="">
<INPUT TYPE="text" NAME="somefield" ID="somefield" onChange="document.getElementById('my_form').submit();">
</FORM>
Westchaser
quelle
1

Fügen Sie ein Steuerelement hinzu, in dem Sie den Fokus festlegen möchten, und ändern Sie dann seine Eigenschaft wie unten

<asp:TextBox ID="txtDummy" runat="server" Text="" Width="2" ReadOnly="true" BorderStyle="None" BackColor="Transparent"></asp:TextBox>

Rufen Sie im Codebehind einfach wie unten auf txtDummy.Focus()

Diese Methode funktioniert in allen Browsern.

Tamilvanan
quelle
1

Das oben vorgeschlagene Zeitlimit hat das Problem in Chrome umgangen. Auf IE8 oder FF3 besteht kein Problem.

Mein Code zum Festlegen des funktionierenden Fokus lautet:

window.setTimeout(function() {
  document.form1.password.focus();
}, 0);
Don
quelle
0

Ihr Fokus arbeitet, bevor Sie false zurückgeben. Danach funktioniert es nicht mehr. Sie versuchen diese Lösung. Kontrolle nach Rückgabe false;

Code in Funktion setzen:

function  validateNumber(){
    var mnumber = document.getElementById('mobileno').value; 
    if(mnumber.length >=10) {
        alert("Mobile Number Should be in 10 digits only"); 
        document.getElementById('mobileno').value = ""; 
        return false; 
    }else{
        return true;
    }
}

Anruferfunktion:

function submitButton(){
        if(!validateNumber()){
            document.getElementById('mobileno').focus();
            return false;
        }
}

HTML:

Input:<input type="text" id="mobileno">
<button onclick="submitButton();" >Submit</button>
Ruk Dee Wa
quelle
0

Platzieren Sie diese Quelle über Ihrem Modal:

<script>
$('body').on('shown.bs.modal', '#IdYourModal', function () {
    document.getElementById('mobileno').focus();
})
</script>
neTurmeric
quelle
0

Eine Sache zu überprüfen, die ich gerade gefunden habe, ist, dass es nicht funktioniert, wenn es mehrere Elemente mit der gleichen ID gibt. Es ist kein Fehler, wenn Sie dies versuchen, es schlägt nur stillschweigend fehl

Joejknowles
quelle
0

Versuchen location.href='#yourId'

So was:

<button onclick="javascript:location.href='#yourId'">Show</button>
Ananth
quelle