Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > вставка editbox в тег <td>


Автор: yngwie19 23.10.2009, 22:32
здравствуйте у меня есть таблица что-то типа такого:
Код

<table>
   <tr>
         <td>10</td>
         <td>5</td>
   </tr>
</table>

можно ли как-нибудь сделать чтобы при щелчке курсором мыши по ячейке под ней создавался editbox в который можно было бы ввести значение, чтобы оно после потери фокуса ячейки записалось в нее (в ячейку таблицы)?
P.S: по-моему подобный эффект использует Excel и другие подобные контролы - типа DataGrid. 

Автор: comtat 23.10.2009, 23:38
Код

<html>
<body onload="initEvent();">
<style>
    .hidden {display:none;}
</style>
<script>
var editElemId;

function initEvent(){
    td_list = document.getElementsByTagName('td');
    for (i=0;i<td_list.length;i++){
        td_list[i].setAttribute('width', 50);
        td_list[i].onclick = editData;
    }
}
function editData(e){
    editElemId = e.target.id;

    buff = document.getElementById('buff');
    buff.className = '';
    buff.value = e.target.innerHTML;
}
function saveData(){
    buff = document.getElementById('buff');
    buff.className = 'hidden';
    
    document.getElementById(editElemId).innerHTML = buff.value;
}
</script>
<input id="buff" type="text" class="hidden" onblur="saveData();" value=""/>
<table border='1' style="margin:10px 0px 0px 5px;">
   <tr id="tr_1">
         <td id="td_1_1">10</td>
         <td id="td_1_2">5</td>
   </tr>
</table>
</body>
</html>

Проверил в FF 3, Safari и Chrome ...

Автор: Michael.de 24.10.2009, 00:16
Цитата(yngwie19 @  23.10.2009,  22:32 Найти цитируемый пост)
...при щелчке курсором мыши по ячейке под ней создавался editbox...
Только что проверил - в Excel при клике по ячейке писать можно в ней. Это можно эмулировать тем же инпутом, растянутым под её размеры и расположенным сверху, но для этого нужны её координаты smile

Автор: bars80080 24.10.2009, 00:37
Цитата(Michael.de @  24.10.2009,  00:16 Найти цитируемый пост)
но для этого нужны её координаты

зачем координаты? достаточно заменять значение в ячейке на поле со значением

Автор: Michael.de 24.10.2009, 02:34
bars80080, "над ней" - подразумевается "ближе" к юзеру (у инпута больше z-index и он закрывает собой ячейку) . Так (imho) красивее, хотя, конечно, о вкусах не спорят smile

Автор: youri 24.10.2009, 03:23
Цитата(Michael.de @  24.10.2009,  02:34 Найти цитируемый пост)
bars80080, "над ней" - подразумевается "ближе" к юзеру (у инпута больше z-index и он закрывает собой ячейку) . Так (imho) красивее, хотя, конечно, о вкусах не спорят

зачем располагать инпут поверх ячейки, если можно просто вставить ячейку внутрь ячейки?

Автор: IDVsbruck 24.10.2009, 04:05
еще бы знать, что такое editbox, и можно было бы советовать smile

Автор: bars80080 24.10.2009, 13:08
Цитата(IDVsbruck @  24.10.2009,  04:05 Найти цитируемый пост)
еще бы знать, что такое editbox, и можно было бы советовать

ну, по умолчанию решили, что это input type="text"


Цитата(Michael.de @  24.10.2009,  02:34 Найти цитируемый пост)
"над ней" - подразумевается "ближе" к юзеру

спорный вопрос. в таблице 50 строчек, верхнего поля будет не видно. придётся скролить туда-сюда. так что либо прямо в ячейке, либо плавающим слоем под ячейкой с кликом

Автор: youri 24.10.2009, 13:44
Цитата(bars80080 @  24.10.2009,  13:08 Найти цитируемый пост)
либо плавающим слоем под ячейкой с кликом

под ячейкой?

Автор: yngwie19 24.10.2009, 15:06
Цитата(Michael.de @  24.10.2009,  00:16 Найти цитируемый пост)
Только что проверил - в Excel при клике по ячейке писать можно в ней. Это можно эмулировать тем же инпутом, растянутым под её размеры и расположенным сверху, но для этого нужны её координаты


Michael.de, подскажите как это можно сделать?


comtat, спасибо за пример, только при щелчке по ячейке input text создается выше самой таблицы, а мне нужно чтобы прямо в ячейке. 

Автор: Michael.de 26.10.2009, 00:24
bars80080, youri: да, инпут в ячейке проще (т.к. не надо его позиционировать) smile

yngwie19: я тут вчера вечером пытался "сваять":
Код

<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'>
<html>
<head>
<title>Edit table</title>
<style type='text/css'>
#table {margin:2cm auto;font-size:16px;border:1px solid #55A;background-color:#FFE}
.title {font-size:18px;color:#55A}
.edit {padding:2px;font-weight:bold;border:1px solid #5E5;color:#33E;background-color:#EFE}
</style>
<script type='text/javascript'>
var cell, clicked=false;
function init(){
 var td, i, l;
 document.onkeydown=endEditing;
 var td=document.getElementById('table').getElementsByTagName('tbody')[0].getElementsByTagName('td');
 for (i=0,l=td.length;i<l;i++){
  if (!td[i].firstChild) td[i].appendChild(document.createTextNode(' '));
  td[i].onclick=beginEditing;
 }
}

function beginEditing(){
 if (!clicked){
  cell=this;
  var input=document.createElement('input');
  var textNode=this.firstChild;
  input.className='edit';
  textNode.data==' ' ? input.value='' : input.value=textNode.data;
  textNode.data='';
  this.appendChild(input);
  input.focus();
  clicked=true;
 }
}

function endEditing(event){
 if (cell!='undefined'){
  var event=event||window.event;
  var code=event.which||event.keyCode;
  if (code==13){
   var textNode=cell.firstChild;
   var input=textNode.nextSibling;
   input.value=='' ? textNode.data=' ' : textNode.data=input.value;
   cell.removeChild(input);
   clicked=false;
  }
 }
}

// need implement
function deleteSpace(text){
 return text.replace(/^\s+|\s+$/g, '');
}
</script>
</head>
<body onload='init();'>
<table id='table' rules='all'>
<thead><tr><th class='title' colspan='4'>Title</th></tr></thead>
<tbody>
<tr><td>&nbsp;</td><td>bbb</td><td>ccc</td><td>ddd</td></tr>
<tr><td>eee</td><td></td><td>ggg</td><td>hhh</td></tr>
<tr><td>iii</td><td>jjj</td><td></td><td>lll</td></tr>
<tr><td>mmm</td><td>nnn</td><td>ooo</td><td></td></tr>
</tbody>
</table>
</body>
</html>
При клике мышью по ячейке её можно редактировать. При нажатии на enter содержимое записывается. Но ещё не всё работает: надо стирать пробелы с начала и в конце записи (ф-ция deleteSpace), образующийся инпут расширяет ячейку... воэможны ещё какие-нибудь баги, а времени нет, сорри smile

P.S. Народ, "покидайтесь помидорами" в скрипт - просто интересно, что там можно улучшить.

Автор: comtat 26.10.2009, 00:32
могу еще посоветовать использовать ExtJS там есть прекрасный компонент http://www.extjs.com/deploy/dev/examples/grid/edit-grid.html 

Автор: yngwie19 27.10.2009, 00:00
Michael.de, спасибо большое за пример. Может можно ли как-нибудь не расширять ячейку?

Автор: Michael.de 27.10.2009, 01:20
yngwie19, если ширина <td> в который помещается <input> прописана заранее (или её можно вычислить) то инпуту можно прописать в css width:сколько тоpx или задать её через JavaScript:
Код

...
var input=document.createElement('input');
input.style.width=w+'px'; // где w - пресловутая ширина <td> минус пару пикселей
просто в моём примере она не задана и для подобного случая меня это самого интересует smile

Автор: youri 27.10.2009, 05:26
Цитата(Michael.de @  27.10.2009,  01:20 Найти цитируемый пост)
просто в моём примере она не задана и для подобного случая меня это самого интересует

перед вставкой вычислить ширину ячейки и потом задать ее и ячейке и input'у, я думаю

Автор: yngwie19 27.10.2009, 08:16
Всем большое спасибо! думаю что Я дальше сам.

Автор: Michael.de 27.10.2009, 18:42
Цитата(youri @  27.10.2009,  05:26 Найти цитируемый пост)
...перед вставкой вычислить ширину ячейки и потом задать ее и ячейке и input'у, я думаю
Мысль понятна... но как быть в случае, когда ширина ячейки задаётся через CSS - JavaScript выдаёт undefined ... или я что-то упустил?

Автор: youri 27.10.2009, 22:53
а что offsetWidth не работает? кроме того есть e.currentStyle || window.getComputedStyle(e,null)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)