редактирование строки в таблице

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

привет, у меня есть таблица с несколькими строками, и в каждой строке есть кнопка для редактирования данных этих строк

вот моя таблица

 <table>
<tr>
<td  class="it_name"> 1111 </td> 
<td  class="it_price"> 1111 </td> 
<td  class="it_info"> 1111 </td> 
<td  class="it_val"> 1111 </td> 
<td  class="BTN"> <INPUT TYPE="button" CLASS="edit_items" /> <td/> 
</tr>
<tr>
...
</tr>
</table>
  

в одном из tds у меня есть кнопка, которую я собираюсь использовать для редактирования этой строки

сначала я получаю значение каждого td в этой строке, затем я собираюсь поместить текстовое поле в этот td и установить значение этого текстового поля на старое значение этого td

и, наконец, я собираюсь изменить кнопку на другую кнопку для завершения редактирования

 jq(function(){
jq('.edit_items').click(function(){

/////// getting value of each td                    
var  name  = jq.trim(jq(this).parent().siblings('.it_name').text());
var  price = jq.trim(jq(this).parent().siblings('.it_price').text());
var info   = jq.trim(jq(this).parent().siblings('.it_info').text());
var   av   = jq.trim(jq(this).parent().siblings('.it_av').text());

////// putting a textfild on each td

jq(this).parent().siblings('.it_name').html('<input class="it_name_f" type="text" value="' name '" />');

jq(this).parent().siblings('.it_price').html('<input class="it_price_f" type="text" value="' price '" />');

jq(this).parent().siblings('.it_info').html('<input class="it_info_f" type="text"   value="' info '" />');

jq(this).parent().siblings('.it_av').html('<input class="it_va_f" type="text" value="' va '" />'); 

 ///////// changing button                  
jq(this).parent().html('<input name="" class="final" type="button" value="edit_now" />');
})
  

теперь он отлично работает при размещении текстового поля в tds, но по какой-то причине кажется, что я не могу изменить свою кнопку после того, как я изменил другой html tds!
или
, если я переместил строку кнопки изменения (которая является последней в этом коде)

 jq(this).parent().html('<input name="" class="final" type="button" value="edit_now" />');
  

в верхней части моего кода теперь кнопка меняется, но другие tds не собираются менять ее так или иначе!
я что-то упустил?

Комментарии:

1. Эта строка: <ТИП ВВОДА=»кнопка» КЛАСС=»»edit_items» /> имеет дополнительные двойные кавычки перед edit_items . Я не говорю, что это причина; просто указываю на это. Также в ваших строках у вас есть <td/> вместо </td> . Может быть просто сломанный HTML. Кроме того, вы потеряете привязку к клику после уничтожения и воссоздания кнопки.

2. Почему, о, почему вы не используете один из (многих) существующих компонентов jQuery для редактирования таблиц?

3. Что сказал Мэтт. Увы, я потратил слишком много времени, чтобы отредактировать свой собственный комментарий, чтобы он был более кратким.

4. @gregp thnx я просто написал таблицу здесь и не копировал / вставлял эту часть из оригинала, это не проблема

5. @ matt на самом деле я собираюсь отредактировать эти строки и в базе данных, это не просто таблица, поэтому я не был уверен, смогу ли я сделать это с помощью плагина, и, кажется, достаточно легко сделать это самостоятельно

Ответ №1:

Вопреки моему здравому смыслу, у меня есть эта скрипка: http://jsfiddle.net/dTncS/3 /

Для создания скрипки потребовалось удивительно много работы, потому что исходное сообщение не копировало / вставляло код, над которым вы работали. Были опечатки и недостающие фрагменты, которые необходимо было исправить, прежде чем проблема могла быть решена. Вот почему всегда полезно иметь готовый пример кода. Однако даже без образца опечатки сбивают с толку человека, который в противном случае был бы рад помочь.

В скрипте можно выполнить еще больше кэширования, но я хотел сохранить код в состоянии, более похожем на то, что вы написали. Нет смысла сходить с ума от вас. 😉

 var jq = jQuery.noConflict();

jq(function() {

    var $table = jq('table');

    // any time there's a finalize button in a table, bind this to it
    $table.delegate('.final', 'click', function() {
        // do finalize stuff here
        alert('finalizing!');
    });

    // ditto for edit_items buttons. Bind this to those              
    $table.delegate('.edit_items', 'click', function() {

        var $thisParent = jq(this).parent(); // for the love of all things good and holy, cache!
        /////// getting value of each td                    
        var name = jq.trim($thisParent.siblings('.it_name').text()),
            price = jq.trim($thisParent.siblings('.it_price').text()),
            info = jq.trim($thisParent.siblings('.it_info').text()),
            av = jq.trim($thisParent.siblings('.it_av').text());

        ////// putting a textfild on each td
        $thisParent.siblings('.it_name').html('<input class="it_name_f" type="text" value="'   name   '" />');
        $thisParent.siblings('.it_price').html('<input class="it_price_f" type="text" value="'   price   '" />');
        $thisParent.siblings('.it_info').html('<input class="it_info_f" type="text"   value="'   info   '" />');
        $thisParent.siblings('.it_av').html('<input class="it_va_f" type="text" value="'   av   '" />');

        $thisParent.html('<input name="" class="final" type="button" value="finalize" />');
    });
});
  

Насколько я могу судить, причина, по которой ваш оригинал не работал (даже если он не был в состоянии готовности к производству IMO), заключается только в одной причине: вы пытались использовать переменную «va», когда объявленная вами переменная была «av». Использование консоли JavaScript предупредит вас о подобных проблемах на ранней стадии.

Основные улучшения, из которых вы должны извлечь уроки::

  1. кэшируйте свои объекты jQuery. Нет абсолютно никакой причины использовать $(this) столько раз, сколько вы делали, когда вы можете просто кэшировать его в переменной. Поскольку каждый из ваших вызовов $(this) …siblings() выполняется дважды, вы можете пойти еще дальше и кэшировать их тоже. Я этого не делал.

  2. использовать .делегировать (), особенно когда вы знаете, что собираетесь добавлять и удалять узлы из DOM. Это просто намного проще.

Одна вещь, которую вам нужно будет изучить по мере продвижения, — это использование итератора (в jQuery .each() довольно прост; но есть и другие, такие как циклы «for» и «while», которыми вы могли бы воспользоваться). Вы заметите, что каждая из ваших 4 строк, получающих текст, представляет собой почти один и тот же код. Тогда ваши 4 строки, создающие текстовые поля, представляют собой почти тот же код. Вы могли бы создать фрагмент кода, который просто повторяется X # раз, меняя местами значения по мере необходимости.