2016-08-20 24 views
8

Ich suche nach einer Möglichkeit, die Textauswahl auf einer Webseite zu verfolgen. Ich brauche Code, der ausgeführt wird, wenn die Auswahl geändert wird. Ich habe das erfolgreich in allen gängigen Desktop-Browsern gemacht, aber das scheint nicht für Firefox für Android zu funktionieren.JavaScript: Tracking Auswahl ändern auf Firefox für Android

versuchte ich drei Ansätze (keiner von ihnen arbeitete!):

  1. Versuchte das "mouseup" Ereignis zu kontrollieren und zu überprüfen, ob es eine nicht leere Textauswahl ist. Problem ist "mouseup" wird nicht wird ausgelöst, wenn eine Auswahl während der mousedown-move-up Sequenz getroffen wurde!
  2. Versucht, das gleiche mit dem "touchend" Ereignis zu tun - das gleiche Ergebnis.
  3. Versucht, das Ereignis "selectionchange" zu fangen. Ich sah, dass es nicht ausgelöst wird, wenn die Auswahl ändert, wie es die Konfigurationsschlüssel "dom.select_events.enabled" gesetzt werden muss. Dies ist false standardmäßig aktiviert und ich kann natürlich nicht meine Besucher fragen nach Browser-Einstellungen zu optimieren :-)

auch, wie erwartet, die ersten beiden Ereignisse nicht ausgelöst werden, wenn die Auswahl erweitert oder reduziert wird, indem Sie die Auswahl Start/Ende Marker.

Die einzige Lösung, die ich jetzt denken kann, ist ein periodischer Poller (mit setInterval), der überprüft, ob es eine Textauswahl gibt. Das ist definitiv unrein und anti-performance.

Alle Alternativen und/oder Ratschläge sind sehr hilfreich.

Danke

+0

Wo binden Sie mouseup-Ereignis an body/document/html an? versuche eine Kombination von ihnen. –

+0

Nur getestet auf Firefox Mobile und in der Tat löst es kein Ereignis aus>.> – seahorsepip

+0

Sie können einen Poller erstellen, wenn eine Auswahl mit dem MouseUp-Ereignis gestartet wurde, und dann den Poller entfernen, wenn X-Sekunden lang keine Auswahl getroffen wurde . Ich kann mir nichts anderes einfallen lassen, um dieses Problem zu lösen, außer dass ich hoffe, dass das selectionchange-Ereignis bald zum Standard wird:/ – seahorsepip

Antwort

2

1) Natives Textauswahl Events

Derzeit scheint Polling die einzige Behelfslösung zu sein. Jedoch die selectionchange Ereignis is currently experimentally implemented in Firefox for Android Nightly. Er kann aktiviert werden, indem das Flag dom.select_events.enabled auf true gesetzt wird (standardmäßig false).

In Nightly-Builds ist dieses Flag bereits standardmäßig true, also gibt es eine Chance, dass Sie es normalerweise in ein paar Monaten verwenden können.

 

2) Ereignisse, die

(UNTESTED !! arbeiten)

Auch wenn onselectstart nicht produktiv in Firefox für Android noch verwendet werden, die einzig gangbare einfache Lösung Polling .

Um die Leistung zu verbessern und die Kosten zu senken, Polling kann auf dem Fenster blur Ereignis gestartet werden. Denn wenn der Benutzer eine Auswahl trifft, sollte der Fokus auf das Ansichtsfenster gesetzt werden (ungetestet).

window.addEventListener('blur', function(){ 
    // start polling for text selections 
}); 

Wenn der Fokus gegeben zurück kann Polling gestoppt werden.

window.addEventListener('focus', function(){ 
    // stop polling 
}); 

Um zu überprüfen, ob der Browser Ereignisse Textauswahl tatsächlich unterstützt, können Sie diese Funktion nutzen zu können:

var browserSupportsTextSelectionEvents = function(){ 
    return !!('onselectstart' in document.body); 
} 

 

3) Hacking

Eine dritte Idee ist, Deaktivieren Sie die Textauswahl für mobile Firefox-Benutzer über CSS (-moz-user-select: none), implementieren Sie eine benutzerdefinierte Textauswahl Diese Funktion basiert auf den Start- und Endpositionen der Berührung und drückt den nativen Auswahlbereich über HTMLElement.setSelectionRange() zurück zum Browser.

+0

Ja, Polling scheint der einzige Ausweg zu sein, zumindest bis "selectionchange" in den stabilen Kanal übernommen wird. Danke trotzdem für Ihre effizienzbezogenen Eingaben, wann der Poller gestartet/gestoppt werden soll. Obwohl ich es noch nicht getestet habe, sieht es nach dem Weg aus. Vielen Dank. – techfoobar

+0

Ich denke, die "Hacking" -Methode (3) ist die vielversprechendste. Ich kann es nicht versuchen, weil ich kein Android + Firefox habe, um es zu testen, aber mit dieser Lösung wird kein Polling benötigt. Rufen Sie 'window.getSelection()' nach dem Ereignis 'touchend' auf. Dieses Ereignis wird ausgelöst, wenn die Benutzerauswahl über CSS deaktiviert ist. – Gerald

Verwandte Themen