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; 
}

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.


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


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().


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.


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.


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


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.


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.


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);

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.


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; 
    }    
}

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>

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.


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);

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>

0

Platzieren Sie diese Quelle über Ihrem Modal:

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

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


0

Versuchen location.href='#yourId'

So was:

<button onclick="javascript:location.href='#yourId'">Show</button>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.