2012-06-05 4 views
6

Ich habe den absolut seltsamsten Fehler, den ich jemals erlebt habe, und ich bin in der Nähe meines Witzes Ende auf diesem. Jeder mit Ideen, wie dies zu debuggen ist (oder irgendwelche cleveren Workarounds) wäre großartig.Firefox-Cursor unsichtbar, wird sichtbar, wenn Sie auf etwas anderes klicken

Das Problem:

Ich bin ein einfaches WYSIWYG-Editor in Firefox contenteditable machen. Das Problem tritt auf, wenn ich den zu bearbeitenden Text über Ajax lade. Vor dem Laden erscheint der Cursor fein (für einen Sekundenbruchteil), und sobald der Text geladen ist, verschwindet er. Sie können immer noch Text eingeben, und der Cursor ist definitiv immer noch "da" (ein Statusfeld zeigt die aktuelle Zeile/Spalte an), aber der Cursor ist nicht sichtbar und das Auswahl-Overlay erscheint nicht.

Hier ist, was dies wirklich seltsam macht: Klicken Sie anywhere, auf einem anderen dom-Element, auf firebug, auch in einem anderen Fenster - macht den Cursor zurück und verhalten sich wie normal. In der Tat ist der einzige Zeitpunkt, an dem der Cursor irgendwelche Probleme hat, ganz am Anfang, wenn die Seite anfänglich geladen oder aktualisiert wird. Durch Klicken auf eine beliebige Stelle innerhalb des zufrieden stellenden Divs wird es nicht repariert - Sie müssen außerhalb klicken, damit es aktualisiert wird.

Gerade jetzt, ich brauche nur einen Workaround. Ich habe 500 Varianten von $ (irgendein Element) .click oder $ (irgendein Element) .focus ausprobiert, aber sie replizieren einen "tatsächlichen" Klick von einem Benutzer nicht vollständig.

Hat jemand schon einmal so etwas gesehen? Vielen Dank.

+0

Firefox hatte und hat zweifellos immer noch große Probleme mit dem Caret verschwinden unter verschiedenen Umständen. Am besten können Sie auf Versuch und Irrtum hoffen, um eine Problemumgehung für Ihren speziellen Fall zu finden. –

Antwort

6

Nun, ich habe nicht herausfinden, was das Problem verursacht, aber ich fand eine schnelle und unsaubere Fix funktioniert der Trick. Ich füge einfach ein Anchor-Tag an das DOM an, fokussiere es (mit jQuery .focus) und entferne es dann.

Ich versuchte .focus viele Male vorher, aber ich versuchte es immer auf div oder li Elementen, die den Trick nicht taten. Es muss ein Anker-Tag sein. Ich vermute, dass es daran liegt, dass das Anchor-Tag tatsächlich eine sichtbare Komponente zu seinem Fokus hat, was etwas in firefox's internem Cursor-Anzeigemechanismus zurücksetzt.

So oder so, wenn Sie versuchen, Probleme wie diese zu lösen und dies nicht beheben, schauen Sie sich MorganTiley's Erklärung an - das könnte Ihnen ein paar gute Anhaltspunkte geben.

+0

Fantastisch. Ich habe lange nach einer Lösung für dieses Problem gesucht. Das funktioniert für mich. Andere Fragen und Antworten versuchen, einen Bereich von Text auszuwählen, aber das hat nicht funktioniert. Vielen Dank. – mkaj

2

Dies ist, weil Sie beim Laden des Inhalts die Struktur der HTML-Knoten ändern und somit die Auswahl ungültig machen (ein Cursor ist nur eine minimierte Auswahl). Ich empfehle, es über Rangy zurücksetzen. Es funktioniert gut in Kombination mit jQuery. Verwenden Sie jquery, um das erste Element in Ihrem contentEditable-Bereich abzurufen, z. der erste Absatz, dann einen neuen Rangy-Bereich und wählen Sie diesen Absatz (Knoten) und Kollaps zum Starten. Dies bringt den Cursor ganz am Anfang Ihres Inhalts. Hier einige grobe Code

$(document).ready(function() { 
    //init rangy 
}); 

function ajaxLoaded { 
    var p = $(".contenteditablediv p:first")[0]; 
    var sel = rangy.getSelection(); 
    sel.collapse(p, 0); 
} 
+0

Leider hat Rangy mein Problem nicht gelöst, obwohl Ihre Erklärung einige wertvolle Einblicke in die Auswahl gegeben hat. Vielen Dank. –

+0

was ist passiert? Kannst du mehr Kontext geben? z.B. irgendwelche anderen Skripte, die Sie auf der Seite ausgeführt haben oder wie die HTML eingerichtet ist? Rangy sollte auf jeden Fall in der Lage sein, den Cursor an eine beliebige Stelle zu bewegen. – MorganTiley

+0

Es gibt eine Reihe anderer Skripts, die auf der Seite ausgeführt werden, aber ich habe sichergestellt, dass mein gesamter Auswahl-/Änderungscode (der von Ihnen gepostete Rangy Code) nach dem Abschluss aller anderen Skripts auftritt. Ehrlich gesagt, liegt mein Problem wahrscheinlich tief im externen Javascript, das ich lade. Ich muss noch etwas graben. In jedem Fall denke ich, dass Firefox schlau genug sein sollte, um meinen Cursor trotzdem zurücksetzen zu können, also ist das vielleicht ein Bug, mit dem ich mich anmelden sollte. Ich schätze jedoch Ihre Eingabe. –