2010-10-14 12 views
5

Otrzymując następujący kod, otrzymuję błąd INDEX_SIZE_ERR: DOM Exception 1 w linii thisRange.setStart. Kod jest przeznaczony do przechodzenia przez całą stronę, znajdowania instancji searchString, a następnie dodawania linku przed tym ciągiem wyszukiwania. Na przykład, jeśli znajdzie 5 wystąpień ciągu, teraz doda link przed pierwszym, ale potem błąd na drugim i przestanie, pozostawiając cztery słowa bez tego linku. Jakieś pomysły?JavaScript INDEX_SIZE_ERR: Błąd wyjątku DOM 1 dla zakresów

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(); 
     } 
    } 
} 

Odpowiedz

5

Po dodaniu linka, dokument został zmieniony. Podczas następnego wywołania thisRange.setStart używa indeksu z oryginalnego ciągu, ale ustawia go w zmienionym dokumencie.

Należy dodać je w odwrotnej kolejności. Spróbuj zapisać indeksy meczów w tablicy, a następnie przejdź do tyłu tablicy indeksów, aby wstrzyknąć linki.

+0

Poprawnie ........ –

+0

W pewnym sensie doszedłem do wniosku, że może to być sytuacja i myśl o kolejności odwrotnej. Nie wiedziałem jednak, jak to zrobić, ponieważ pętle to pętla while za pomocą obiektu RegExp. Jakieś sugestie? – joshholat

+0

Można przechowywać indeksy swoich dopasowań w tablicy i przechodzić po tablicy w osobnej pętli. Zaktualizowałem swoją odpowiedź. – gilly3

0

Wymyśliłem to. Oto jak:

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); 
} 

Zamiast dodawać je do zakresu w powyższej pętli, dodałem go do tablicy, a następnie przeszedł tej tablicy do tyłu.

Powiązane problemy