Ausgewählter Textereignisauslöser in Javascript

77

Wie kann eine JavaScript-Funktion ausgelöst werden, wenn jemand mit der Maus ein bestimmtes Textfragment auf einer Seite auswählt ?
Gibt es auch eine Möglichkeit, die Position des ausgewählten Textes auf der Seite zu ermitteln?

Update: Um es klarer zu machen, kann ein Textfragment Teil eines Satzes oder eines Wortes oder einer Phrase oder eines ganzen Absatzes sein.

el-teedee
quelle

Antworten:

78

Es gibt kein Ereignis " Text wurde ausgewählt " (DOM), aber Sie können ein mouseupEreignis an das binden document.body. Innerhalb dieses Ereignishandlers können Sie einfach die überprüfen

document.selection.createRange().text

oder

window.getSelection()

Methoden. Es gibt verschiedene Themen zu Stackoverflow, wie dieses eine Javascript, um einen Absatz des ausgewählten Textes auf der Webseite abzurufen .

Ich bin mir nicht sicher, was Sie mit "Finden der Position" meinen, aber um in meiner Beispielwelt zu bleiben, können Sie die event propertysfür X + Y-Mauspositionen verwenden.

Beispiel: http://www.jsfiddle.net/2C6fB/1/

jAndy
quelle
Danke Andy, ich denke, das Beste, was wir bekommen können, sind X + Y-Mauspositionen.
5
Sie sollten auch die Auswahl über die Tastatur in Betracht ziehen.
Tim Down
2
Es gibt ein "Text wurde ausgewählt" (DOM) -Ereignis
user681814
4
Bei der Tastaturauswahl habe ich darauf document.addEventListener('keyup', function(e) { var key = e.keyCode || e.which; if (key == 16) highlight(); });
geachtet
2
Das Auswahländerungsereignis ist vorzuziehen, da window.getSelection()möglicherweise alte selectionObjekte für mouseupEreignisse zurückgegeben werden.
Cani
60

Hier ist ein kurzes Mashup:

$('div').mouseup(function() {
    var text=getSelectedText();
    if (text!='') alert(text);
});

function getSelectedText() {
    if (window.getSelection) {
        return window.getSelection().toString();
    } else if (document.selection) {
        return document.selection.createRange().text;
    }
    return '';
}​

<div>Here is some text</div>

Demo: http://jsfiddle.net/FvnPS/11/

karim79
quelle
6
Es scheint eine allgegenwärtige Idee zu geben, die window.getSelection();den IE entspricht document.selection.createRange().text;. Kopieren Personen aus derselben ungenauen Quelle? Gibt jedenfalls window.getSelection()ein SelectionObjekt zurück, während document.selection.createRange().text;eine Zeichenfolge zurückgegeben wird, bei der es sich um ein ganz anderes Objekt handelt. Die Verwirrung ergibt sich aus der Tatsache , dass das toStringVerfahren von SelectionObjekt den ausgewählten Text zurückgibt, dass bedeutet , alert(window.getSelection());wird der ausgewählte Text aufmerksam zu machen .
Tim Down
Fest. In den Mozilla-Dokumenten heißt es: "Dadurch wird das Auswahlobjekt wie eine Zeichenfolge angezeigt, wenn es sich tatsächlich um ein Objekt mit eigenen Eigenschaften und Methoden handelt. Insbesondere wird der Rückgabewert des Aufrufs der toString () -Methode des Auswahlobjekts übergeben." :) developer.mozilla.org/en/window.getSelection
karim79
2
Heh. Das hatte ich noch nie gesehen. Es tut mir leid, dass ich Ihre Antwort geändert habe: Wie Sie vielleicht gefolgert haben, habe ich dies einige Male zuvor bei SO korrigiert.
Tim Down
2
@ Tim Down - Du hast nicht geflügelt, du hattest tatsächlich Recht und hast das Richtige getan, um darauf hinzuweisen.
Karim79
11

Es gibt eine neue experimentelle API, die sich damit befasst:

Das Auswahländerungsereignis der Auswahl-API wird ausgelöst, wenn das Auswahlobjekt des Dokuments geändert wird oder wenn sich die mit einer <input>oder einer <textarea>Änderung verknüpfte Auswahl ändert. Das Auswahländerungsereignis wird im ersten Fall auf das Dokument und im zweiten Fall auf das Element ausgelöst.

https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange

Beachten Sie, dass dies auf dem neuesten Stand ist und nicht garantiert wird, dass es auch in großen Browsern funktioniert.

Ricky Han
quelle
2
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - Aus der Überprüfung
Eisbehr
Ich habe die Antwort geändert
Ricky Han
Dem neuesten Standard fehlt auch eine grundlegende "auswählbare" Eigenschaft. Daher ist weiterhin ein Herstellerpräfix erforderlich, da jeder Browser es anders implementiert. Wiederum existiert dies in ActionScript seit 2 Jahrzehnten seit v1: help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
Triynko
1

AFAIK, es gibt kein solches Ereignis, das Sie beschrieben haben. Sie können diese Funktion jedoch emulieren.

Schauen Sie hier nach dem Code und der Demo.

Vikmalhotra
quelle
1
Danke ShiVik, es ist wirklich hilfreich. Hat diese Emulation eine Browserabhängigkeit?
@abhishiktiwari - AFAIU der Blog - keine
vikmalhotra
1

Es gibt das Ereignis "Text wurde ausgewählt". Aber nur für Textbereiche, wie ich sie kenne.

<textarea onselect="message()" name="summary" cols="60" rows="5">
请写入个人简介,不少于200字!
</textarea>
Macist
quelle
0
var selectedText = "";

if (window.getSelection) {
    selectedText = window.getSelection();
}

if (document.getSelection) {
    selectedText = document.getSelection();
}

if (document.selection) {
    selectedText = document.selection.createRange().text;
}

function textSelector() {
   alert(selectedText);
}
textSelector();
Mowneshachar
quelle
0

Ich bin mir bei der Maus nicht sicher, aber diese Zeile funktioniert für Mobilgeräte. Sie wird jedes Mal aufgerufen, wenn eine Änderung an der Textauswahl vorgenommen wird.

document.addEventListener('selectionchange', () => {

});
ozd
quelle
0

Wenn Sie die Maustaste drücken, wird das mousedownEreignis ausgelöst. Wenn Sie die Maustaste loslassen, werden die Ereignisse mouseupund dann clickausgelöst.

Wir hören uns das mouseupEreignis an und prüfen, ob Text ausgewählt wurde, und führen die entsprechenden Vorgänge aus.

const p = document.getElementById('interactiveText');

p.addEventListener('mouseup', (e) => {
  const selection = window.getSelection().toString();

  if (selection === '') {
    console.log('click');
  } else {
    console.log('selection', selection);
  }
});
Damian Czapiewski
quelle