2010-10-14 4 views
5

En utilisant le code suivant, j'obtiens une erreur INDEX_SIZE_ERR: DOM Exception 1 sur la ligne thisRange.setStart. Le code est destiné à parcourir une page entière, trouver des instances de searchString, puis ajouter un lien devant cette chaîne de recherche. Par exemple, s'il trouve 5 occurrences de la chaîne, en ce moment il ajoutera le lien devant le premier mais ensuite l'erreur sur le second et s'arrêtera, laissant quatre mots sans le lien. Des idées?Javascript INDEX_SIZE_ERR: DOM Exception 1 Erreur pour les plages

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

Répondre

5

Une fois que vous avez ajouté un lien, le document a été modifié. Lorsque vous appelez le thisRange.setStart, il utilise l'index de la chaîne d'origine, mais le paramètre dans le document maintenant modifié.

Vous devez les ajouter dans l'ordre inverse. Essayez de stocker les index de correspondance dans un tableau, puis retournez votre tableau d'index vers l'arrière pour injecter vos liens.

+0

Correct ........ –

+0

J'ai en quelque sorte pensé que cela pourrait être ce qui se passe et j'ai pensé à l'ordre inverse. Cependant, je ne savais pas comment faire cela, car les boucles sont une boucle while utilisant l'objet RegExp. Aucune suggestion? – joshholat

+0

Vous pouvez stocker les index de vos correspondances dans un tableau et parcourir le tableau dans une boucle distincte. J'ai mis à jour ma réponse. – gilly3

0

Je l'ai compris. Voici comment:

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

Au lieu d'ajouter à la plage dans la boucle au-dessus, je l'ai ajouté à et le réseau, puis passé par ce tableau arrière.