2010-05-08 9 views
8

Mi sono guardato intorno per un po ', ma non sembra essere un modo semplice per farlo. jQuery non aiuta affatto, sembra che manchi completamente qualsiasi supporto per le gamme di selezione o DOM. Qualcosa che speravo sarebbe stato semplice come $.selection.filter('img') sembra essere fattibile solo con dozzine di righe di codice che si occupano di enumerare manualmente gli elementi negli intervalli e browser implementation inconsistencies (anche se gli aiuti ierange sono utili qui). Qualche altra scorciatoia?Come ottenere tutti i tag <img> all'interno di una selezione di testo?

+0

questa puzza di qualcosa che si dovrà lavorare per-il browser ho paura ... –

+1

che cosa dovete fare con i tag? modificarli? o solo leggere? se solo leggendo, una ricerca regexp su innerHTML dovrebbe funzionare – ariel

risposta

2
var fragment = getSelection().getRangeAt(0).extractContents(); 

I nodi nella selezione verranno rimossi e restituiti in una DocumentFragment, e ora è possibile accedere alla childNodes di fragment proprio come si farebbe con qualsiasi elemento.

+3

Alcuni punti: in primo luogo, hai perso le parentesi da 'cloneContents()'. Secondo, il nome della variabile è fuorviante in quanto l'oggetto risultante è un 'DocumentFragment', non un Range. Terzo, qualsiasi immagine in questo frammento sarà clona di quelli trovati nell'intervallo originale, quindi è improbabile che sia utile. In quarto luogo, questo non funzionerà in IE. –

+0

@Tim Giù, scusa, era abbastanza tardi;). Per i punti 1, 2 e 3, ho risolto i problemi che hai menzionato (grazie mille). In quarto luogo, a seconda dell'importanza del vostro pubblico di IE (interni aziendali) potrei dire * "do IE hax" * o * "Così?" * –

+0

Come indicato di seguito, extractContents modifica il documento, che non era un effetto collaterale desiderabile . Ho finito per usare: 'var d = document.createElement (" div "); d.appendChild (. window.getSelection() getRangeAt (0) .cloneContents()); var img = $ ("img", d); '. Dal momento che non avevo bisogno di modificare gli elementi, avrei potuto usare anche il suggerimento Reguce di bortao. –

1

sembra del tutto manca qualsiasi supporto per la selezione o DOM gamme

Sì, la ragione di ciò è IE manca il supporto per la selezione e DOM Range. È possibile creare un livello di astrazione sopra gli oggetti non standard "TextRange" di IE, ma a causa dell'interfaccia estremamente scarsa esposta da TextRanges è difficile, lento e abbastanza complicato da costituire una libreria completa di per sé. Vedi ad es. this one.

+0

L'OP menziona IERange nella domanda. –

+0

Hmm, strano ... avrei giurato che non c'era prima! – bobince

+0

Su una nota più leggera, questo dovrebbe essere sorprendente? IE supporta * qualsiasi * tecnologie moderne? Ciao, XHTML? Qualcuno lì? ;) –

1
$("img", window.getSelection().getRangeAt(0).extractContents()); 

Sfortunatamente sarà necessario utilizzare la già citata libreria IERange per supportare IE 6/7/8.

Degno di nota: DOM Range will be implemented in IE9 e ci sono talks of new selection APIs in HTML5

+0

Non sembra funzionare. La dimensione dell'oggetto() risultante è sempre zero. Inoltre, extractContents modifica il documento (sposta * il contenuto di un intervallo in DocumentFragment). –

Problemi correlati