Тестирование на существующий элемент с помощью jQuery's .length не видит вновь созданные элементы - PullRequest
2 голосов
/ 28 апреля 2011

Я пытаюсь создать систему копирования / вставки для таблицы HTML, используя jQuery и плагин контекстного меню, и я пытаюсь однозначно назвать все вновь созданные строки.Итак, у меня есть функция, которая клонирует выбранную строку и вставляет новую строку выше:

function cloneAbove(TR) {
    var newRow = $(TR).clone();
    var lastID = $(TR).attr('id');
    var newID = Number(lastID.substring(3))-0.1;

    //See if that row already exists:
    if($('#tr_'+newID).length){
    alert('#tr_'+newID+' Exists');
    //If it does exist, we divide the newID by 10 until we find one that doesn't:
    var i = 0;
    while(i < 1){
        newID = newID/10;
        if($('#tr_'+newID).length > 0){
        i = 1;
        }
    }
    }
    $(newRow).attr('id','tr_'+newID);
    $(TR).before(newRow);
    $(".target").contextmenu(option);
}

Сначала она клонирует выбранную строку (то есть: '# tr_1'), вычитает 0,1 для идентификатора новой строки (то есть: '# tr_0.9'), то он должен проверить, чтобы увидеть, существует ли уже этот идентификатор - вот где моя проблема - если он существует, он входит в цикл для деления на 10, пока не найдет идентификатор, который не 't.

Вот пример таблицы:

<table id="table" border=1>
       <tr class="target" id="tr_1" oncontextmenu="context('tr1')">
           <td id="tr_1_1">Row1</td>
           <td id="tr_1_2">Row1</td>
       </tr>
       <tr class="target" id="tr_2" oncontextmenu="context('tr2')">
           <td id="tr_2_1">Row2</td>
           <td id="tr_2_2">Row2</td>
       </tr>
</table>

.length работает для «жестко закодированных» элементов, поскольку они существуют при загрузке страницы, но не обнаруживаютлюбой из вновь созданных элементов.Есть предложения?

Ответы [ 2 ]

4 голосов
/ 28 апреля 2011

Вы создаете значения "id", которые могут сбить с толку jQuery.Селектор "# tr_0.9" означает "найти элемент с идентификатором 'tr_0' и классом '9'", а не "найти элемент с идентификатором 'tr_0.9'".

Отмена фактато, что мне кажется довольно странным способом построения значений "id", вы можете заставить его работать, "цитируя" "."символы:

if ($(('#tr_' + newId).replace(/\./g, "\\.")).length) {
  // ... found a duplicate ...

То, что это делает, заменяет "."за "."в построенном пробном значении "id".Конечно, вы хотите сделать это только тогда, когда ищет элементов с помощью селектора jQuery;Вы не хотите, чтобы фактическое значение "id" содержало обратную косую черту в нем.

В качестве альтернативы, вы можете заменить "."символы с "_" или что-то.

1 голос
/ 28 апреля 2011

Вам нужно подумать о том, как анализируется ваш селектор jQuery.Когда вы добавляете новую строку, в качестве идентификатора новой строки задается десятичная цифра (т. Е. «0,9»).Но при использовании селектора jQuery $('#tr_0.9') вы говорите:

получить элемент с идентификатором 'tr_0' и классом '9'.

Точечный оператор является обозначением для селектора класса.Попробуйте использовать целые числа вместо десятичных.

Редактировать: Я был слишком медленным!

...