2010-08-09 2 views
0

Я пытаюсь заменить индекс элементов формы. У меня есть следующее:JavaScript не заменяет все элементы

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

Я получаю интересные результаты. Первое скрытое поле заменяется вторым игнорируется

т.е. моего ответа что-то вроде этого:

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

EDIT:

ОК, спасибо этих методов работали на моем простом примере. Однако на самом деле моя строка немного сложнее. Вот содержание "вар 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> 

и здесь функция 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(); 
    }); 

ответ

5

В JavaScript передача строки в качестве первого параметра в replace() заменит только первое вхождение. Вы должны использовать регулярное выражение, с глобальным флагом:

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

Лишние слэш (\) избежать скобки ([ и ]).


Edit: реагирует на редактирование операционного, в, если вы хотите, чтобы динамически построить регулярное выражение, вы не можете использовать регулярное выражение буквальным - это вещь с разделителями косой чертой (/), не кавычки ("), как в вашем правлении. Вы передаете строку в replace(), я передаю литерал регулярного выражения. Используйте JavaScript RegExp() constructor, чтобы исправить ваши:

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

Обратите внимание на различие в характере побега.

+0

спасибо, эта работа на моем примере. Так что да, вы правильно заслуживаете правильного ответа. Надеюсь, вы могли бы быстро взглянуть на редактирование. – frosty

+0

Посмотрите мои правки. Есть более чистый способ сделать это - работая над этим сейчас. –

+0

Не обращайте внимания на мой предыдущий комментарий. Я забыл, что JavaScript не поддерживает lookbehind (и [faking это серьезная головная боль] (http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript))! –

0

заменить замену на это replace(/[1]/g, '[2]'); Это глобальная замена. Однако я не уверен [] и. являются юридическими символами для идентификаторов/имен.

Смежные вопросы