2013-07-31 54 views
0

对不起,模糊的标题,想不到如何标题我的问题。所以我做了一个html/css表格,其中我为每行放置了一个编辑按钮。按下按钮将通过允许用户编辑内部数据将某个文本字段转换为文本输入字段;同时编辑按钮然后转换为保存按钮。编辑完成后,用户将按下保存按钮,然后文本输入字段将恢复为文本字段,并将保存按钮恢复为编辑按钮。但它不完全工作JQuery,Javascript按钮

这是我的问题,编辑里面的数据,在按下保存按钮后,里面的数据被删除并替换为:<input type= and outside the text-input field is: " /> 和保存按钮保持原样,“保存”按钮而不是回到“编辑”按钮

这里的脚本:

$(document).ready(function() { 

    // listen for email edit button click 
    $("button#edit").on('click', function() { 
     // get email inline to this edit button 
     var email = $(this).parent().siblings('td.email').html(); 
     alert(email); 

     // change button from edit to save 
     $(this).attr('id', 'save-email').html('SAVE'); 

     // change email display to input field 
     $(this).parent().siblings('td.email').html('<input type="text" id="user-email" value="' + email + '" />'); 
    }); 

    // listen for email save button click 
    $("button#save-email").on('click', function() { 

     // get new email inline to this save button 
     var newEmail = $(this).parents('tr').find($('input#user-email')).val(); 
     alert(newEmail); 

     // change input field back to display 
     $(this).parent().siblings('td.email').html(email); 

     // change button from save to edit 
     $(this).attr('id', 'edit').html('EDIT'); 
    }); 
}); 

对不起文字的墙。

+0

//将输入字段改回显示 $(this).parent()。siblings('td.email')。html(email);在这里你不会得到“电子邮件”的价值 – Rex

回答

0

一个实施例中的问题是,第一处理程序是在脚本中的仅一个连接

您的JavaScript代码在页面准备就绪时执行。
那时只有第一个处理程序被附加,因为还没有元素button#save-email。当你点击保存,它是第一个处理程序再次执行,而不是一个想法!

为什么不创建两个不同的按钮并显示其中一个?

<table> 
    <tr> 
     <td class="email">[email protected]</td> 
     <td> 
      <button class="btn-edit">Edit</button> 
      <button class="btn-save" style="display:none">Save</button> 
     </td> 
    </tr> 
    <tr> 
     <td class="email">[email protected]</td> 
     <td> 
      <button class="btn-edit">Edit</button> 
      <button class="btn-save" style="display:none">Save</button> 
     </td> 
    </tr> 
</table> 

的Javascript

// listen for email edit button click 
$('.btn-edit').on('click', function() { 

    var $this = $(this), 
     $parentRow = $this.closest('tr'); 

    // get email inline to this edit button 
    var email = $this.parent().siblings('td.email').html(); 

    // change button from edit to save 
    $parentRow.find('.btn-edit').hide(); 
    $parentRow.find('.btn-save').show(); 

    // change email display to input field 
    $(this) 
     .parent() 
     .siblings('td.email') 
     .html('<input type="text" id="user-email" value="'+email+'" />'); 
}); 

// listen for email save button click 
$('.btn-save').on('click', function() { 

    var $this = $(this), 
     $parentRow = $this.closest('tr'); 

    // get new email inline to this save button 
    var newEmail = $(this).parent().siblings('td.email').find('#user-email').val(); 

    // change input field back to display 
    $(this).parent().siblings('td.email').html(newEmail); 

    // change button from save to edit 
    $parentRow.find('.btn-edit').show(); 
    $parentRow.find('.btn-save').hide(); 

}); 

DEMO

+0

哦,好吧,我认为我做了什么会自动创建一个新的句柄,但我想它不会。我整合了你所做的,并最终为我工作。谢谢! – Mandirigma

+0

非常高兴它帮助! –

+0

Hello Didier,后续问题,我的表中有多行,但我不明白为什么其他编辑按钮不起作用。只有第一行的编辑按钮。任何想法为什么这样做?*我想我应该在上面的情景中提到这一点。 – Mandirigma

1

尝试这样说:

$(document).on('click',"button#save-email", function() {...

,而不是

$("button#save-email").on('click', function()

使用第二个将无法工作,因为在运行时,$(“按钮#save-email“),还不存在。

0

看看KnockoutJS,它利用很好的Bindings帮助你做到这一点更容易。下面是可编辑的网格与KnockoutJS

KnockoutJS Editable Data example

+0

感谢提示,虽然我不打算让该字段总是可编辑的,因为该表是用于现场注册的事件。 – Mandirigma

+0

仅仅因为我看到了......不应该将您的点击处理程序的最后一行设置为.val()而不是.html()? – zewa666

+0

这对我来说并没有什么不同。 – Mandirigma

0

整洁&作品

<table>  
    <tr> 
    <td>some text</td> 
    <td><input type='button' value='edit' id='btn'/></td> 
    </tr>   
</table> 


$(document).ready(function() { 
$("#btn").click(function() { 
    var $btn=$(this); 

    var opn= $btn.val() 


    switch(opn){ 

     case 'edit': 
      var $td=$(this).parent().parent().find('td:first'); 
      var email=$td.html(); 
      $td.html("").append('<input type="text" value="'+email+'">'); 
      $btn.val("save"); 
      break; 

     case 'save': 
      var $input=$(this).parent().parent().find('td:first input'); 
      var email=$input.val(); 
      $input.parent().html(email); 
      $btn.val("edit"); 
      break;  
    } 
}); 
}); 

http://jsfiddle.net/h55rc/