Proprio come è possibile ottenere un elemento da un punto con document.elementFromPoint
o document.getElementFromPoint
, è possibile ottenere in qualche modo un nodo di testo se il punto si trova su un nodo di testo? Immagino che se almeno riuscissi a ottenere la posizione e la dimensione del nodo di testo, potrei quindi capire quale di essi contiene il punto. Ma poi i nodi DOM non hanno proprietà di posizione. È possibile farlo affatto?Ottieni il nodo di testo DOM dal punto?
risposta
Ecco un'implementazione che funziona in tutti i browser attuali: 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;
};
È possibile utilizzare element.nodeName
per verificare se si tratta di un nodo di testo e quindi element.nodeValue
per il suo valore.
Suppongo che 'getElementFromPoint' restituisca solo s nodi elemento. –
Ah, sì, hai ragione: https://developer.mozilla.org/en-US/docs/DOM/document.elementFromPoint afferma che 'elemento deve essere un oggetto oggetto' (che è un tipo XML diverso da un oggetto di testo) – Ben
Considerando questo documento (fiddle):
<html>
<body>
some text here
<p id="para1">lalala</p>
bla bla
</body>
</html>
E questo codice:
$(document).on('click', function(evt) {
var elem = document.elementFromPoint(evt.clientX, evt.clientY);
console.log(elem);
});
Quando si sceglie un punto qualsiasi all'interno del tag <p>
, l'elemento tag stesso viene registrato. Tuttavia, quando si fa clic sul testo circostante, viene restituito <body>
perché i frammenti di testo non sono considerati elementi.
Conclusione
Non è possibile realizzare ciò che si vuole con elementFromPoint()
e perché frammenti di testo non ricevono eventi click, non credo che sia possibile a tutti.
Per Firefox, è necessario utilizzare document.caretPositionFromPoint
Ecco una demo greap: https://developer.mozilla.org/en-US/docs/Web/API/document.caretPositionFromPoint
per Chrome e bordo, prova document.caretRangeFromPoint(x,y)
ahimè, questa è una funzione specifica di Firefox :-( – Michael
@Michael yah per altri browser, prova document.caretRangeFromPoint (x, y) –
- 1. Come recuperare il testo di un nodo di testo DOM?
- 2. DOM Javascript, ottieni il testo del nodo senza perdere le informazioni sulla spaziatura
- 3. jQuery ottiene il nodo DOM?
- 4. Ottieni il percorso del file .dmg dal punto di montaggio
- 5. Ottieni il nome nodo con minidom
- 6. Ottieni un'immagine di sfondo con Nokogiri dal DOM?
- 7. Seleziona il prossimo nodo del nodo selezionato in PHP DOM?
- 8. Ottieni ComponentRef dall'elemento DOM
- 9. Ottieni un elemento DOM iframe dato il suo URL
- 10. Ottieni il testo dal personaggio e dopo aver usato jQuery
- 11. Ottieni informazioni sul punto dopo il trascinamento
- 12. Ottieni il nodo genitore Xpath con DomDocument PHP?
- 13. efficiente rimozione textnodes dal DOM
- 14. ottenere il testo interno di un nodo
- 15. Ottieni il nodo root di XML doc utilizzando simplexml
- 16. Come posso evidenziare il testo dell'oggetto DOM Range?
- 17. Ottieni l'angolo tra il punto e l'origine
- 18. Ottieni testo dal campo di immissione in Unity3D con C#
- 19. Append personalizzato a un nodo DOM
- 20. Ottieni il numero di secondi dal
- 21. come controllare il vero nodo DOM usando l'enzima reattivo
- 22. Inserimento del punto di inserimento dopo un nodo inserito
- 23. Ottieni valore css senza elemento DOM
- 24. Contenuti nodo di testo Nokogiri
- 25. Leggere il valore dal nodo HTML
- 26. Ottieni il testo di un elemento li
- 27. Ottieni HTML HTML di nodo in JQuery
- 28. Ottenere il testo da un nodo
- 29. Ottieni il file .sql dal database di SQL Server 2012
- 30. Come si forza il rango su un nodo in punto?
Semplicemente fantastico, ho appena finito di scrivere questa funzione esatta ~ oh beh :) Avere la mia upvote per capire la parte 'createRange', mi ci è voluto un paio di minuti prima che mi colpisse: P –
Grazie! Sei il migliore :) –