2010-08-10 14 views
18

Qualcuno sa di eventuali librerie di range di selezione utente cross browser scritte in javascript?Libreria intervallo selezione cross-browser?

Ho trovato alcuni plugin jQuery, (che francamente sono troppo limitanti e molto buggy). Ho già implementato e sto utilizzando il seguente per tirare fuori alcuni dei miei trucchi:

http://plugins.jquery.com/project/wrapSelection http://perplexed.co.uk/1020_text_selector_jquery_plugin.htm

e pochi altri piccoli script e così via.

Vorrei solo sapere cosa avete scoperto là fuori. Non mandatelo a googling di nuovo, (ho passato giornate a lavorare su tutto questo). Speriamo che questo possa essere il luogo in cui i futuri programmatori possono trovare la risposta.

+1

Entrambi tuoi link 'http: //plugins.jquery. com/project/wrapSelection' e 'http: // perplexed.co.uk/1020_text_selector_jquery_plugin.htm' non funziona più. Puoi aggiornarli? – John

+0

aggiorna i tuoi collegamenti, per favore – Anthony

risposta

37

Ho sviluppato una libreria di selezione e intervallo per il cross-browser denominata Rangy. Il suo nucleo non è dissimile nel concetto di IERange ma va oltre, in termini di implementazione del DOM 2 Range e delle specifiche di selezione HTML5, e anche in termini di stabilità e soluzioni per i bug del browser. Penso che sia il meglio che ci sia là fuori.

Esistono anche moduli aggiuntivi per il salvataggio, il ripristino e la serializzazione delle selezioni e l'applicazione della classe CSS agli intervalli e alle selezioni.

https://github.com/timdown/rangy

i seguenti usi alcune estensioni longilineo alle gamme per scorrere facilmente sopra i nodi di testo all'interno di una selezione e surround ciascuno:

function surroundSelectedText(templateElement){ 
    var range, sel = rangy.getSelection(); 
    var ranges = sel.getAllRanges(); 
    var textNodes, textNode, el, i, len, j, jLen; 
    for (i = 0, len = ranges.length; i < len; ++i) { 
     range = ranges[i]; 
     // If one or both of the range boundaries falls in the middle 
     // of a text node, the following line splits the text node at the 
     // boundary 
     range.splitBoundaries(); 

     // The first parameter below is an array of valid nodeTypes 
     // (in this case, text nodes only) 
     textNodes = range.getNodes([3]); 

     for (j = 0, jLen = textNodes.length; j < jLen; ++j) { 
      textNode = textNodes[j]; 
      el = templateElement.cloneNode(false); 
      textNode.parentNode.insertBefore(el, textNode); 
      el.appendChild(textNode); 
     } 
    } 
} 

var span = document.createElement("span"); 
span.style.color = "green"; 
span.style.fontWeight = "bold"; 

surroundSelectedText(span); 
+0

Meraviglioso! Darò un'occhiata. – UpHelix

+0

Una volta che hai il supporto per il confezionamento di gamme con campate questo sarà, (a mia conoscenza) caratterizzato da completa. Pubblica di nuovo quando rilasci quella parte del codice. Purtroppo devo averlo risolto e completato entro un giorno circa. – UpHelix

+0

pubblicheremo un esempio un po 'più tardi ... –

1

Per il funzionamento dell'intervallo generico (a differenza della gestione della selezione di input/area di testo), considerare ierange. Tenta di implementare il modello standard di Livello 2 DOM DOM supportato da altri browser in IE. Tipo di opere.

+0

Una delle caratteristiche principali di cui ho bisogno è di circondare una selezione con un intervallo. Questo codice può farlo ma non gestisce il wrapping di un intervallo attorno a una selezione che si sovrappone ad altri tag finali. – UpHelix

+1

Beh, una cosa del genere sarebbe impossibile, ovviamente! Una span, come ogni elemento, deve avere un solo genitore. Se si desidera aggiungere un'evidenziazione a una porzione di testo i cui endpoint non erano all'interno dello stesso elemento, si dovrebbe passare sopra ogni elemento della selezione aggiungendo un elemento separato '' attorno a ciascun elemento il cui genitore non è completamente contenuto all'interno la selezione. (Oppure potresti farlo semplicemente avvolgendo ogni nodo di testo non-bianco tra gli endpoint.) – bobince

+0

Ho implementato una funzionalità in Rangy (vedi la mia risposta) che applicherà la formattazione a una selezione circondando ogni nodo di testo all'interno la selezione con uno span, anche rimuovendo e unendo le estensioni identiche adiacenti, dove appropriato. Spero di pubblicarlo entro poche settimane. –

2

Per l'opzione plug-in jQuery c'è jCaret, è possibile controllare lo homepage here e lo examples here.

L'ho usato su alcuni progetti per varie applicazioni, funziona bene a rimuovere le incongruenze cross-browser.

+0

Sembra fantastico, tuttavia funziona solo in input e in textareas. Ho lavorato per convertirlo a funzionare su qualsiasi elemento ma non ancora dadi.Una delle caratteristiche principali è che ho bisogno di essere in grado di avvolgere span (e qualsiasi altro elemento che specifichi) attorno a una selezione utente. Il codice wrapSelection (http://plugins.jquery.com/project/wrapSelection) funziona perfettamente e ho modificato che per le mie esigenze, però, il codice per qualche motivo non funziona in IE8, anche se vanta il supporto per IE. – UpHelix

+0

I collegamenti non funzionano. – John

Problemi correlati