2010-08-09 10 views
0

J'essaie de remplacer l'index des éléments de formulaire. J'ai le suivantJavaScript ne remplace pas tous les éléments

var test = "<input name='[1].Id' value='598' type='hidden' /><input name='[1].OrderItemId' value='867' type='hidden' />"; 
    alert(test.replace('[1]', '[2]')); 

Je reçois des résultats curieux. Le premier champ caché est remplacé par le second est ignoré

-à-dire ma réponse est quelque chose comme ceci:

"<input name='[1].Id' value='598' type='hidden' /><input name='[2].OrderItemId' value='867' type='hidden' />" 

EDIT:

OK, grâce à ces méthodes ont travaillé sur mon exemple simple. Cependant, en réalité, ma chaîne est un peu plus complexe. Voici le contenu de "var LastRow"

<td> 

       <a class="deleteAddress" href="#"> 
       <img alt="remove" src="/images/icons/delete_button.gif"> 
       </a></td> 
       <td class="p-5" width="100"> 
        <input name="[1].Id" value="612" type="hidden"> 
        <input name="[1].OrderItemId" value="868" type="hidden"> 
        <input class="itemAddressQuantity" name="[1].Quantity" value="" type="text"> 

       </td> 
       <td class="p-5" width="100"> 
       <select name="[1].AddressId"><option value="2">address1</option></select>        
       </td> 

et ici est la fonction js

$('#addNewAddress').click(function (event) { 

     event.preventDefault(); 
     var length = $('.table-item-address tbody').find('tr').length; 
     var previousLength = length - 1; 
     var previousIndex = "/\[" + previousLength + "\]/g"; 
     var currentIndex = "[" + length + "]"; 
     var lastRow = $('.table-item-address tbody tr').last(); 
alert(lastRow.html()); // html is shown above 
     var newRow = lastRow.html().replace(previousIndex, currentIndex); 
     $('.table-item-address tr').last().after('<tr>' + newRow + '</tr>'); 
     AdjustValues(); 
    }); 

Répondre

5

En JavaScript, le passage d'une chaîne en tant que premier paramètre à replace() ne remplace que la première occurrence. Vous devez utiliser une expression régulière, avec le drapeau global:

test.replace(/\[1\]/g, '[2]'); 

Les antislashs supplémentaires (\) échapper aux crochets ([ et ]).


Edit: répondant à l'édition de l'OP, si vous voulez construire dynamiquement une expression régulière, vous ne pouvez pas utiliser une expression régulière littérale - c'est la chose délimité par des barres obliques vers l'avant (/), pas citations (") comme dans votre édition. Vous passez une chaîne dans replace(), je passe dans un littéral regex. Utilisez le JavaScript RegExp() constructor pour fixer le vôtre:

// The first argument is the regex, the second is a string of flags. 
var previousIndex = new RegExp("\\[" + previousLength + "\\]", "g"); 

// Then, it's exactly the same as before. 
// The second argument to replace is still a string. 
var newRow = lastRow.html().replace(previousIndex, currentIndex); 

Notez la différence de caractère échapper.

+0

merci, ce travail sur mon exemple. Alors oui, vous méritez à juste titre la bonne réponse. J'espère que vous pourriez jeter un coup d'œil rapide sur le montage. – frosty

+0

Jetez un oeil à mes modifications. Il y a une façon plus simple de le faire - travailler là-dessus maintenant. –

+0

Ne tenez pas compte de mon commentaire précédent. J'ai oublié que JavaScript ne supporte pas lookbehind (et [faire semblant c'est un mal de tête majeur] (http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript))! –

0

Remplacer le remplacer par ceci replace(/[1]/g, '[2]'); Ceci fait un remplacement global. Cependant je ne suis pas sûr [] et. sont des caractères légaux pour les identifiants/noms.

Questions connexes