Tak jak mogę uzyskać element z punktu o numerze document.elementFromPoint
lub document.getElementFromPoint
, czy jest możliwe, aby uzyskać węzeł tekstowy, jeśli punkt znajduje się w węźle tekstowym? Sądzę, że gdybym przynajmniej mógł uzyskać położenie i rozmiar węzła tekstowego, mógłbym określić, który z nich zawiera punkt. Ale wtedy węzły DOM nie mają właściwości położenia. Czy można to w ogóle zrobić?Uzyskaj węzeł tekstowy DOM z punktu?
Odpowiedz
Tutaj jest implementacją, która działa we wszystkich aktualnych przeglądarek: 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;
};
Można użyć element.nodeName
aby sprawdzić, czy jest to węzeł tekstowy, a następnie element.nodeValue
dla jego wartości.
Założę, że 'getElementFromPoint' tylko zwróci Węzły elementów. –
Ach, tak, masz rację: https://developer.mozilla.org/en-US/docs/DOM/document.elementFromPoint stwierdza, że 'element musi być obiektem elementu' (który jest innym typem XML niż obiekt tekstowy) – Ben
Biorąc pod uwagę ten dokument (fiddle):
<html>
<body>
some text here
<p id="para1">lalala</p>
bla bla
</body>
</html>
i ten kod:
$(document).on('click', function(evt) {
var elem = document.elementFromPoint(evt.clientX, evt.clientY);
console.log(elem);
});
Po kliknięciu w dowolnym miejscu wewnątrz znacznika <p>
, sam element znacznik jest rejestrowane. Jednak po kliknięciu otaczającego tekstu zwracana jest wartość <body>
, ponieważ fragmenty tekstu nie są elementami.
Wnioski
To nie jest możliwe, aby osiągnąć to, co chcesz z elementFromPoint()
i dlatego fragmenty tekstu nie odbierać zdarzenia kliknięcia, nie sądzę, że to w ogóle możliwe.
Dla Firefox, należy użyć document.caretPositionFromPoint
Oto greap demo: https://developer.mozilla.org/en-US/docs/Web/API/document.caretPositionFromPoint
Dla Chrome i Edge, spróbuj document.caretRangeFromPoint(x,y)
Niestety, jest to funkcja specyficzna dla Firefoksa :-( – Michael
@Michael yah dla innych przeglądarek, spróbuj document.caretRangeFromPoint (x, y) –
- 1. jQuery uzyskać węzeł DOM?
- 2. Zastąpić węzeł tekstowy tekstem HTML w JavaScript?
- 3. Uzyskaj węzeł nadrzędny z wartości potomnej XPATH
- 4. Uzyskaj współrzędne ekranu elementu DOM
- 5. Jak utworzyć węzeł DOM jako obiekt?
- 6. Uzyskaj współrzędne punktu od mkmapview na iphone
- 7. Uzyskaj wartość css bez elementu DOM
- 8. Uzyskaj element DOM elementu iframe z adresem URL:
- 9. Uzyskaj zasięg z elementu DOM za pomocą $ compileProvider.debugInfoEnabled (false);
- 10. Wybierz węzeł tekstu z CSS
- 11. Wybierz następny węzeł wybranego węzła w PHP DOM?
- 12. jak sprawdzić aktualny węzeł DOM za pomocą enzymu reakcji
- 13. Jak skopiować węzeł DOM za pomocą detektorów zdarzeń?
- 14. Pobierz węzeł nadrzędny Xpath z DomDocument PHP?
- 15. Uzyskaj współrzędną 3D klikniętego punktu myszy trzema .js
- 16. Uzyskaj nowe współrzędne x, y punktu na obróconym obrazku
- 17. Uzyskaj względną pozycję między 2 elementami DOM za pomocą JavaScriptu
- 18. Jak znaleźć węzeł DOM w danej pozycji (X, Y)? (Hit test)
- 19. Uzyskaj obliczony rozmiar czcionki dla elementu DOM w JS
- 20. Uzyskaj listę wartości używając parsera dom w Androidzie
- 21. Uzyskaj poziom hierarchii elementu DOM (poziomy poziomów potomka)
- 22. Obracanie punktu wokół innego punktu
- 23. Czytanie plik tekstowy z jQuery
- 24. Parse plik tekstowy z XSLT
- 25. Jak wymienić węzeł XML z SimpleXMLElement PHP
- 26. Węzeł js często praktyk
- 27. iterację każdy węzeł xml z Groovy, drukowanie każdy węzeł
- 28. Uzyskaj numer wiersza z węzła xml - java
- 29. Wyłącz wyświetlanie "Tekst - pusty węzeł tekstowy" na pasku narzędzi programisty IE.
- 30. Jak dopasować węzeł tekstowy, a następnie wykonaj węzły nadrzędne za pomocą XPath
Po prostu świetnie, właśnie skończyłem pisać tę dokładną funkcję ~ no cóż :) Miałem mój pomysł na odgadnięcie części 'createRange', zabrało mi kilka minut zanim mnie uderzyło: P –
Dzięki! Jesteś najlepszy :) –