2010-10-14 8 views
5

Utilizzando il codice seguente, viene visualizzato un errore INDICE_SIZE_ERR: DOM Eccezione 1 sulla riga thisRange.setStart. Il codice è pensato per passare attraverso un'intera pagina, trovare istanze di searchString e quindi aggiungere un collegamento davanti a quella stringa di ricerca. Ad esempio, se trova 5 istanze della stringa, in questo momento aggiungerà il collegamento davanti al primo ma poi l'errore sul secondo e si fermerà, lasciando quattro parole senza il collegamento. Qualche idea?Javascript INDEX_SIZE_ERR: DOM Eccezione 1 Errore per gli intervalli

if(searchString.length > 0) { // make sure the string isn't empty, or it'll crash. 
    // Search all text nodes 
    for(var i = 0; i < textNodes.length; i++) { 
     // Create a regular expression object to do the searching 
     var reSearch = new RegExp(searchString,'gmi'); // Set it to 'g' - global (finds all instances), 'm' - multiline (searches more than one line), 'i' - case insensitive 
     var stringToSearch = textNodes[i].textContent; 

     while(reSearch(stringToSearch)) { // While there are occurrences of the searchString 
      // Add the new selection range 
      var thisRange = document.createRange(); 

      //alert((reSearch.lastIndex - searchString.length) + " <-> " + reSearch.lastIndex); 

      thisRange.setStart(textNodes[i], reSearch.lastIndex - searchString.length); // Start node and index of the selection range 
      thisRange.setEnd(textNodes[i], reSearch.lastIndex); // End node and index of the selection 

      var myLink = document.createElement('a'); 
      var href = document.createAttribute('href'); 
      myLink.setAttribute('href','http://www.google.com'); 
      myLink.innerText ="GO"; 
      thisRange.insertNode(myLink); 

      //theSelection.addRange(thisRange); // Add the node to the document's current selection 
      //thisRange.deleteContents(); 
     } 
    } 
} 

risposta

5

Dopo aver aggiunto un collegamento, il documento è cambiato. Alla successiva chiamata thisRange.setStart, sta utilizzando l'indice della stringa originale, ma lo si imposta nel documento ora modificato.

È necessario aggiungerli in ordine inverso. Prova a memorizzare gli indici delle corrispondenze in una matrice, quindi sposta l'array di indici all'indietro per iniettare i collegamenti.

+0

Correggere ........ –

+0

Ho immaginato che questo potrebbe essere ciò che sta accadendo e ho pensato all'ordine inverso. Non sapevo come fare, tuttavia, dato che i loop sono un ciclo while usando l'oggetto RegExp. Eventuali suggerimenti? – joshholat

+0

È possibile memorizzare gli indici delle corrispondenze in una matrice e spostare l'array in un ciclo separato. Ho aggiornato la mia risposta. – gilly3

0

L'ho capito. Ecco come:

for (var i = rangeArray.length - 1; i >= 0; i--) { 
    var myLink = document.createElement('a'); 
    var href = document.createAttribute('href'); 
    myLink.setAttribute('href','http://www.google.com'); 
    myLink.innerText ="GO"; 
    rangeArray[i].insertNode(myLink); 
} 

Invece di aggiungere alla gamma nel ciclo precedente, ho aggiunto a e la matrice e poi passato attraverso tale matrice all'indietro.

Problemi correlati