ONLY A DREAM - 梦想在线!WWW.ONLYAA.COM
当前位置:首 页 > 界面组件 > 文章内容
双击单元格变成可编辑的文本框
来源:onlyaa.com 发布时间:2008-05-22 阅读次数:
[摘要]:

不知道有没有用过google的在线文档服务, 有excel类型的文档, 大家都知道excel每个单元格都可以编辑, 这里我来说说我实现的思路, 高手有高手的想法和做法, 但是我们菜鸟也可以偶尔的冒充一把, 不亦乐乎, 呵呵。

第一步: 准备工作,建立个tabedit.html
里面的内容很简单, 建立个5X5的表格, 代码如下:

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>双击单元格变成可编辑的文本框</title>
</head>

<body>

<table border="1" width="100%" id="table1">
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
</table>

</body>

</html>

 2. 设计思路:
     当鼠标双击的时候 也就是document.ondblclick的时候, 判断当前鼠标事件作用的对象,可以用event.srcElement获得到,然后判断event.srcElement是否是td, 也就是判断event.srcElement.tagName是否是单元格, 是的话就进行转换成编辑框, 转换成编辑框有几种做法

1. 动态创建,即使用document.createElement('标签的名字'), 代码如下:

   inputItem = document.createElement('input');
   inputItem.type = 'text';
   inputItem.style.width = '100%';
   inputItem.style.height = '18px';
   inputItem.style.fontSize = '12px';

2. 直接用字符串的创建,代码如下:
  var str = "<input id='inputItem type=text>'"


完成该功能还需要一个变量(g_activeItem), 用来保存当前编辑的td引用, 以便切换到其他td后恢复当前td为文本模式

3. 主要功能实现:

文本转换成可以编辑的输入框
代码如下:

function changeToEdit(obj){
 if( !inputItem ) {
  inputItem = document.createElement('input');
  inputItem.type = 'text';
  inputItem.style.width = '100%';
  inputItem.style.height = '18px';
  inputItem.style.fontSize = '12px';
 }
 inputItem.style.display = '';
 inputItem.value = obj.innerText; // 将该单元格的数据文本读到控件上
 obj.innerHTML = ''; // 清空单元格的数据
 obj.appendChild(inputItem);
 inputItem.focus();
 g_activeItem = obj;
}



恢复文本显示, 代码如下

function changeToText(obj){
 if( obj && inputItem ) {
  // 如果存在正在编辑的单元格, 则取消编辑状态, 并将编辑的数据保存起来
  var str = inputItem.value;
  obj.innerText = str;   
 }
}



综合上面所说给出全部代码:

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建网页 1</title>

<script language="javascript">
<!--

var inputItem; // 输入框句柄
var g_activeItem; // 保存正在编辑的单元格

function changeToText(obj){
 if( obj && inputItem ) {
  // 如果存在正在编辑的单元格, 则取消编辑状态, 并将编辑的数据保存起来
  var str = inputItem.value;
  obj.innerText = str;   
 }
}

function changeToEdit(obj){
 if( !inputItem ) {
  inputItem = document.createElement('input');
  inputItem.type = 'text';
  inputItem.style.width = '100%';
  inputItem.style.height = '18px';
  inputItem.style.fontSize = '12px';
 }
 inputItem.style.display = '';
 inputItem.value = obj.innerText; // 将该单元格的数据文本读到控件上
 obj.innerHTML = ''; // 清空单元格的数据
 obj.appendChild(inputItem);
 inputItem.focus();
 g_activeItem = obj;


}

document.attachEvent('ondblclick',function(){
 if (event.srcElement.tagName.toLowerCase() == "td") {
  if( !inputItem ) {
   inputItem = document.createElement('input');
   inputItem.type = 'text';
   inputItem.style.width = '100%';
   inputItem.style.height = '18px';
   inputItem.style.fontSize = '12px';
  }
  changeToText()
  changeToEdit(event.srcElement); 
 } else {
  event.returnValue = false;
  return false;  
 }
});

document.attachEvent('onclick', function(){
 if( event.srcElement.parentNode == g_activeItem || event.srcElement == g_activeItem ) {
  return;
 } else {
  changeToText(g_activeItem);
 }
})

//-->
</script>
</head>
<body>
<table border="1" width="100%" id="table1">
 <tr>
  <td width='130'>Test </td>
  <td width='130'> </td>
  <td width='130'> </td>
  <td width='130'> </td>
  <td width='130'> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
 <tr>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
  <td> </td>
 </tr>
</table>
</body></html>

 演示地址: http://www.onlyaa.com/examples/tabedit/index.htm
编辑
» 进入JAVASCRIPT经典社区讨论 [收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]
网友评论 - (共有 1 位网友发表了评论)
发表评论
    用户名: 密码: 匿名评论
    评论内容:不能超过250字,需审核后才会公布
     请您注意:
    ·不良评论请用报告管理员,以利管理员及时删除。
    ·尊重网上道德,遵守中华人民共和国的各项有关法律法规
    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
    ·本站评论管理人员有权保留或删除其管辖评论中的任意内容 
    ·您在本站发表的作品,本站有权在网站内转载或引用 
    ·参与本评论即表明您已经阅读并接受上述条款