Genau wie ich ein Element von einem Punkt mit document.elementFromPoint
oder document.getElementFromPoint
bekommen kann, ist es möglich, irgendwie einen Textknoten zu bekommen, wenn der Punkt an einem Textknoten ist? Ich denke, wenn ich wenigstens die Position und Größe des Textknotens herausfinden könnte, könnte ich herausfinden, welcher von ihnen den Punkt enthält. Dann haben DOM-Knoten keine Positionseigenschaften. Ist das überhaupt möglich?DOM-Textknoten von Punkt holen?
Antwort
Hier ist eine Implementierung, die in allen gängigen Browsern funktioniert: https://github.com/nuxodin/q1/blob/master/q1.dom.js
document.betaNodeFromPoint = function(x, y){
var el = document.elementFromPoint(x, y);
var nodes = el.childNodes;
for (var i = 0, n; n = nodes[i++];) {
if (n.nodeType === 3) {
var r = document.createRange();
r.selectNode(n);
var rects = r.getClientRects();
for (var j = 0, rect; rect = rects[j++];) {
if (x > rect.left && x < rect.right && y > rect.top && y < rect.bottom) {
return n;
}
}
}
}
return el;
};
Sie können element.nodeName
verwenden, um zu sehen, ob es ein Textknoten ist, und dann element.nodeValue
für seinen Wert.
Ich würde davon ausgehen, dass 'getElementFromPoint 'nur zurückgeben s Elementknoten. –
Ahh, ja, du hast Recht: https://developer.mozilla.org/en-US/docs/DOM/document.elementFromPoint gibt an, dass 'element ein element object' sein muss (das ist ein anderer XML-Typ als a Textobjekt) – Ben
In Anbetracht dieses Dokument (fiddle):
<html>
<body>
some text here
<p id="para1">lalala</p>
bla bla
</body>
</html>
Und diesen Code:
$(document).on('click', function(evt) {
var elem = document.elementFromPoint(evt.clientX, evt.clientY);
console.log(elem);
});
Wenn Sie irgendwo innerhalb des Tags <p>
klicken, wird das Tag-Element selbst angemeldet ist. Wenn jedoch auf den umgebenden Text geklickt wird, wird <body>
zurückgegeben, da Textfragmente nicht als Elemente betrachtet werden.
Fazit
Es ist nicht möglich, zu erreichen, was Sie mit elementFromPoint()
wollen und weil Textfragmente ich nicht Click-Ereignisse empfangen, glaube nicht, es überhaupt möglich ist.
Für Firefox, Sie document.caretPositionFromPoint
Hier ist ein greap Demo verwenden sollte: https://developer.mozilla.org/en-US/docs/Web/API/document.caretPositionFromPoint
Für Chrome und Rand, versuchen document.caretRangeFromPoint(x,y)
leider, das ist eine Firefox-spezifische Funktion :-( – Michael
@Michael yah für andere Browser, versuche document.caretRangeFromPoint (x, y) –
- 1. Holen Sie Punkt um abgerundetes Rechteck
- 2. rrdtool des doesnt Show holen einzigen Punkt
- 3. Pfeile von Punkt zu Punkt
- 4. Holen Sie sich den Pfad der .dmg vom Mount-Punkt
- 5. Holen Sie Linie als zwei Punkt auf cvCanny() in OpenCV
- 6. Drehen einer Kugel von Punkt zu Punkt
- 7. Punkt Klasse von Referenz
- 8. XmlDeserialization von geo: Punkt
- 9. Punkt ([Punkt] [Leerzeichen] [Dateiname])
- 10. Konvertieren von 3D-Punkt zu 2D-Punkt-Koordinatensystem und umgekehrt
- 11. Punkt auf Linie - Segment Entfernung von einem Punkt
- 12. Überschrift von Punkt A zu Punkt B im 2D-Raum?
- 13. Punkt der Verwendung von NSPersistentStoreCoordinator?
- 14. Debugging von 128 Punkt FFT
- 15. Umleitung von URL mit Punkt
- 16. Bedeutung von ~. (Tilde Punkt) Argument?
- 17. Punkt Produkt von hdf5 Array
- 18. Fangleine von einem bestimmten Punkt
- 19. Holen Extras von Video
- 20. Holen Domain von URL
- 21. Holen Wert von Karte
- 22. Holen Größe von UIView
- 23. Modelldaten von Remote holen
- 24. Holen Quelle von dimens.xml
- 25. Holen Antwort von PostAsJsonAsync
- 26. Holen Domain von URL
- 27. Holen Struktur von Funktionstyp
- 28. Holen Sammlung von Objekt
- 29. Holen von geladenen WebView den HTML-Code
- 30. Holen Lage von Bildschirmmitte Swift MapKit
Einfach toll, gerade habe ich gerade genau diese Funktion fertig geschrieben ~ oh naja :) Habe mein upvote für den 'createRange' Teil herausgefunden, nahm mich ein paar Minuten bevor es mich traf: P –
Danke! Du bist der Beste :) –