一个网站的诞生- MagicDict未来予想図4 [表格的动态增加行和删除行,完整版]

news/2024/5/19 7:21:52/文章来源:https://blog.csdn.net/weixin_30670965/article/details/95762790

    首先,感谢 路过秋天 开源了他的系统,让园子里的童鞋有了新的研究方向,带动了园子的繁荣,拉动了园子的GDP。

    昨天又花了一整天来做在线单词编辑器,动态表格的增加行和删除行的一些问题,基本算是搞明白了,大致想法还是和昨天一模一样的。这里只是说一些技巧和锦上添花的东西,算不上什么奇技淫巧。DOM这个玩意,真的很有趣,掌握以后可以做很多HTML的工具。

    首先来说说我这个编辑器想要实现的功能:

    1.可以动态在表格后面添加指定格式的行。可以是一行,也可以是多行。

    2.当然也可以在指定行之前插入一行或者多行。

    3.如果插入/添加的多行的话,这些行在删除的时候也必须一并删除。

    4.单行的后面拥有 插入行 和 删除行的按钮。插入什么样的行,也在这里指定。多行的话,这些功能按钮在首行表示。

    5.某些行有特殊意义,必须给予特别的样式。

    6 可以读出所有行的所有输入信息。

功能不算太难,不过,第一次做的朋友可能不是很容易就能完成的。

    首先,插入和追加,都要动态生成控件,不同的是,一个要指定在哪行之前插入,一个则不需要。那么我们将这两个功能写在一个函数里面,参数就是在“某行”之前插入的“某行”。我们将这个函数命名为AddNewRow,参数“某行”RowObj。这里声明一下,RowObj 其实并不是 表格行 对象,而是表格行里面的按钮对象。通过表格行里面的按钮对象,可以获得表格行。追加的时候RowObj为Null。

    其次,我们还要控制动态生成行的类型,我们称这个类型为RowType。如果是追加的时候,我们通过一个ID为ItemType的下拉列表框来选择行的类型。追加的时候,我么则通过每个行的下拉列表框来选择行的类型,这个列表框无需ID。

 

1         function AddNewRow(RowObj) {
2             var RowType;
3 
4 
5             if (RowObj == null) {
6                 RowType = document.getElementById("ItemType").value;
7             } else {
8                 RowType = RowObj.parentNode.childNodes[1].value;
9             }  

 

RowObj.parentNode表示按钮的父控件,这里指包含按钮的单元格。RowObj.parentNode.childNodes[1]表示单元格里面的子控件数组。由于按钮和每个行的插入类型下拉框是兄弟,所以可以这样来获得下拉框。

接下来我们生成一个行对象:

 

            var WordTable = document.getElementById("WordTable");
            
var bodies = WordTable.tBodies;
            
var aBody = bodies[0];
            
var row = document.createElement("tr");

 

有了行对象后,我们生成行的第一个单元格。我的编辑器,第一个单元格标识了行的名字。同时我们希望将种类为1的行,添加一个样式,就是指定一个类名。

 

 1             var cellExplain = document.createElement("td");
 2             switch (RowType){
 3                 case "1":
 4                     cellExplain.innerHTML = "解释";
 5                     row.setAttribute("class""Word_Start_td");
 6                     break;
 7                 case "2":    
 8                     cellExplain.innerHTML = "例句[日语]";
 9                     break;
10                 case "3":
11                     cellExplain.innerHTML = "反义词";
12                     break;
13                 case "4":
14                     cellExplain.innerHTML = "主题";
15                     break;
16             }
17             row.appendChild(cellExplain);

 

设定一个单元格里面的内容有关innerHTML(FF中),设定样式也使用setAttribute。最后将这个单元格追加入行中。

使用同样的方法,我们加入第二个单元格,这里将展示合并单元格的代码:

colspan也可以设定

 1             var str;
 2             var cellExplainInput;
 3             cellExplainInput = document.createElement("td");
 4             cellExplainInput.setAttribute("colspan""3");
 5             switch (RowType) {
 6                 case "1":
 7                     str = "<input type='text' style='width: 400px' />"
 8                     break;
 9                 case "2":
10                     str = "<input type='text' style='width: 400px' />"
11                     break;
12                 case "3":
13                     str = "假名:<input type='text' style='width: 150px' />&nbsp;"
14                     str += "汉字:<input type='text' style='width: 145px' />"
15                     break;
16                 case "4":
17                     str = "<input type='text' style='width: 400px' />"
18                     break;
19             }
20             cellExplainInput.innerHTML = str;
21             row.appendChild(cellExplainInput);

 

接下来,我们希望在每行里面,或者是多行的首行里面追加1个插入行按钮,一个下拉列表框内容,一个删除行按钮。

 

 cellExplainInput = document.createElement("td");
            cellExplainInput.setAttribute(
"colspan""2");
            cellExplainInput.setAttribute(
"align""right");
            str 
= "<input  class='buttonNormal' type='button' value='插入行' οnclick='AddNewRow(this)'/>"
            str 
+= "<select id='ItemType'>";
            str 
+= "<option value='1'>解释</option>";
            str 
+= "<option value='2'>例句</option>";
            str 
+= "<option value='3'>反义词</option>";
            str 
+= "<option value='4'>主题</option>";
            str 
+= "</select>";
            str 
+= "<input class='buttonNormal' type='button' value='删除行' οnclick='RemoveRow(this)'/>"
            cellExplainInput.innerHTML 
= str;
            row.appendChild(cellExplainInput);

请注意,这里的下拉列表框和按钮,是兄弟关系,都在同一个单元格里面。

好了,有了行以后我们可以追加行或者插入行了。

insertBefore没有第二参数,则是追加到最后,有的话则是插入到指定位置之前。

1                 if (RowObj == null) {
2                     aBody.insertBefore(row, null);
3                 } else {
4                     aBody.insertBefore(row, RowObj.parentNode.parentNode);
5                 }
6                 RowCount = RowCount + 1;

 

最后,我们希望如果是类型为2的行,应该是同时拥有2行 一组的多行类型。

这个也很简单,如果是追加的话,追加了首行后,追加第二行。如果是插入的话,在指定行之前顺序插入第一行后,在插入第二行。

 

                if (RowObj == null) {
                    aBody.insertBefore(row, 
null);
                } 
else {
                    aBody.insertBefore(row, RowObj.parentNode.parentNode);
                }

                
var row = document.createElement("tr");
                cellExplain 
= document.createElement("td");
                cellExplain.innerHTML 
= "例句[中文]";
                row.appendChild(cellExplain);

                cellExplainInput 
= document.createElement("td");
                cellExplainInput.setAttribute(
"colspan""3");
                str 
= "<input type='text' style='width: 400px' />"
                cellExplainInput.innerHTML 
= str;
                row.appendChild(cellExplainInput);


                cellExplainInput 
= document.createElement("td");
                cellExplainInput.setAttribute(
"colspan""2");
                str 
= "&nbsp;"
                cellExplainInput.innerHTML 
= str;
                row.appendChild(cellExplainInput);

                
if (RowObj == null) {
                    aBody.insertBefore(row, 
null);
                } 
else {
                    aBody.insertBefore(row, RowObj.parentNode.parentNode);
                }

                RowCount 
= RowCount + 2;

 

 

删除行的代码很简单,先贴出来,再解释。

如果是单行的话,直接删除掉。。。

如果是2行一组的多行,必须同时删除两个行。这个行的认定,我们通过行的第一个单元格内容来判断。

删除的时候先删除第二行,再删除首行。[首行删除了,第二行定位有些麻烦]。

row.nextSibling表示首行的下一行。

        function RemoveRow(obj) {
            
var WordTable = document.getElementById("WordTable");
            
var bodies = WordTable.tBodies;
            
var aBody = bodies[0];
            
var row = obj.parentNode.parentNode;
            
if (row.cells[0].innerHTML == "例句[日语]") {
                aBody.removeChild(row.nextSibling);
                aBody.removeChild(row);
                RowCount 
= RowCount - 2;
            } 
else {
                aBody.removeChild(row);
                RowCount 
= RowCount - 1;
            }
        }

 

获取单元格的数据,就是遍历整个表格,看了代码一下子就理解了。注意,我的表格的前3行是固定的,从第四行开始遍历即可。逐行逐单元的获取每个控件的值,就可以了。。。。

        function GenerateData() {
            
var strJSON = "";
            
var WordTable = document.getElementById("WordTable");
            
var bodies = WordTable.tBodies;
            
var aBody = bodies[0];
                        
            
for (i = 3; i < aBody.rows.length; i++) {
                
switch (aBody.rows[i].cells[0].innerHTML) {
                    
case "解释":
                        strJSON 
+= "{Type: Explain,Data: " + aBody.rows[i].cells[1].childNodes[0].value + "}";
                        
break;
                    
case "例句[日语]":
                        strJSON 
+= "{Type: SentenceJp,Data: " + aBody.rows[i].cells[1].childNodes[0].value + "}";
                        
break;
                    
case "例句[中文]":
                        strJSON 
+= "{Type: SentenceCN,Data: " + aBody.rows[i].cells[1].childNodes[0].value + "}"
                        
break;
                    
case "反义词":
                        strJSON 
+= "{Type: Anti,Kana: " + aBody.rows[i].cells[1].childNodes[1].value;
                        strJSON 
+= ",Kanji: " + aBody.rows[i].cells[1].childNodes[3].value + "}";
                        
break;
                    
case "主题":
                        strJSON 
+= "{Type: Topic,Data: " + aBody.rows[i].cells[1].childNodes[0].value + "}"
                        
break;
                }
                
if (i != aBody.rows.length - 1) {
                    strJSON 
+= ",";
                }
            }
            document.getElementById(
"strJSON").value = strJSON;
            alert(strJSON);
        }

 

问题点:动态加载的控件,控件间距无法控制。

这个例子的演示页面:http://www.magicdict.com/Account/WordEditor.aspx

 

 

初始状态的表格 

   各种行插入后的表格

转载于:https://www.cnblogs.com/TextEditor/archive/2011/06/11/2077978.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_765359.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

div内容横排 html_计算机毕业设计中大学生个人网站案例html

点击上方“蓝字”&#xff0c;关注我们.案例介绍此作品为学生个人主页网页设计题材&#xff0c;代码为简单学生水平 DIV CSS布局制作&#xff0c;整个作品由主页、个人历程、兴趣爱好、学业成绩、联系我们共5页组成&#xff0c;作品下载后可使用任意HTML编辑软件(例如&#xff…

抓取某一个网站整站的记录

经常由于某些原因我们需要爬取某一个网站或者直接复制某一个站点&#xff0c;到网上找了很多工具进行测试&#xff0c;试了很多各有各的问题&#xff0c;最终选择了Teleport Ultra&#xff0c;用起来效果很好&#xff1b;具体的操作手册等东西就不在这里说了&#xff0c;网上搜…

网站中英文转换 php_Markdown 自动添加中英文空格

pangu「有研究顯示&#xff0c;打字的時候不喜歡在中文和英文之間加空格的人&#xff0c;感情路都走得很辛苦&#xff0c;有七成的比例會在 34 歲的時候跟自己不愛的人結婚&#xff0c;而其餘三成的人最後只能把遺產留給自己的貓。畢竟愛情跟書寫都需要適時地留白。與大家共勉之…

如何让sharepoint2010网站根据权限隐藏ribbon

项目要求让普通用户看不到“网站操作”&#xff0c;为了解决该问题&#xff0c;我找了好几篇博客&#xff0c;但都是sharepoint2007&#xff0c;按照sharepoint designer签出&#xff0c;签入&#xff0c;审批&#xff0c;发布。可能是sharepoint2007和sharepoint2010的区别&am…

手机端使用ghelper_手机建站的五个技巧让用户体验得到提升

现今移动设备的使用成为了人们生活中不可或缺的一部分&#xff0c;习惯了在移动端获取信息和购物。所以企业的目光也逐渐转移到移动端&#xff0c;进行移动端建站刻不容缓。但是&#xff0c;移动端网站该如何设计才能获得广大用户的喜爱呢&#xff1f;如何将友好性表达的淋漓尽…

WordPress小工具开发教程(网站公告)

WordPress小工具开发教程&#xff08;网站公告&#xff09; BY TIANQIXIN 2012 年 12 月 26 日 wordpress主题小工具&#xff0c;可以自由拖动到侧边栏&#xff0c;并在前台实现相应功能&#xff01;一般自带的小工具功能有限&#xff0c;我们可以通过自己开发小工具来增强wor…

跳转html时请求头怎么取,爬取网站时请求被拒绝?scrapy轻松解决请求头设置!就是不讲道理...

默认请求头命令行执行&#xff0c;新建爬虫scrapy startproject myspidercd myspider scrapy genspider scrapy_spider httpbin.org我们通过对 https://httpbin.org/get?show_env1 的请求&#xff0c;查看本次请求的浏览器信息&#xff0c;可以打开看一看是否是自己的浏览器信…

seo管理php源码_黑帽SEO,黑帽SEO优化隐身技术(二)

此系统文章总共分为四篇&#xff0c;分别是手法篇、工具篇、隐藏篇、总结篇&#xff1b;本篇为隐身篇&#xff0c;主要介绍黑帽seo中一些隐身的手段。黑帽seo与其他黑产行为不同的是&#xff0c;它需要时间去创造价值。如果是倒卖数据&#xff0c;只需要入侵服务器脱裤走人&…

计算机设置定时原理,可编程定时和计数器-微计算机原理-电子发烧友网站

第四节 可编程定时和计数器在控制系统中,经常需要有一些实时钟以实现实时或延时控制,如定时启动,定时检测,定时通信等,计数器 对外部事件计数.实现这些要求经常有三种方法:(1)设计数字逻辑电路,用硬件实现定时或计数功能,如用NE555芯片实现定时,用74LS163电路实现计数等.(2)软件…

关于算法介绍的一些网站

2019独角兽企业重金招聘Python工程师标准>>> 通过动画的形式展示常见排序算法的排序过程 Sorting Algorithm Animations | Toptal https://www.toptal.com/developers/sorting-algorithms/ 转载于:https://my.oschina.net/ray1421/blog/713796

phpcms选择文件无法加载插件怎么办_网站加速图片优化插件 Smush

如果要推荐一款网站加速图片优化插件&#xff0c;出现在我的推荐名单中应该有 Smush 的身影。别误会&#xff0c;这款插件没用给我广告费用&#xff0c;这篇文章也不是吹捧Smush插件的马屁文章。为了便于一站式集成化操作&#xff0c;所以我在亲测了多款图像压缩优化插件&#…

[网站摘录]数据库查询优化 之 MySQL索引

转载于:https://blog.51cto.com/10237569/1846380

5个基于Linux命令行的下载和网站浏览工具

为什么80%的码农都做不了架构师&#xff1f;>>> Linux命令行是GNU/Linux中最神奇迷人的部分&#xff0c;它是非常强大的工具。命令行本身功能多样&#xff0c;多种内建或者第三方的命令行应用使得Linux变得更加健壮和强大。Linux Shell支持多种不同类型的网络应用&…

url 收录工具_Python与seo的应用,sitemap.xml文件制作工具源码

sitemap.xml文件是严格按照xml语言编写的网站地图&#xff0c;用来引导搜索蜘蛛对本站点文章等内容的索引&#xff0c;它是由google提出来的概念。链接提交使用说明链接提交工具是网站主动向百度搜索推送数据的工具&#xff0c;本工具可缩短爬虫发现网站链接时间&#xff0c;网…

如何查看Drupal网站使用的模块

大家在学习使用Drupal的过程中&#xff0c;总喜欢去查看或借鉴那些做得十分优秀的drupal网站&#xff0c;很想知道这个drupal网站使用了哪些模块&#xff1f;其实很简单&#xff0c;已经有人帮我们实现了这个愿望。 那就是DrupalXray网站(link is external)&#xff0c;通过这个…

酷站欣赏:来自国外的一组耀眼的扁平化网站作品

扁平化设计对于印刷品设计、网页设计和移动操作系统的设计来都带去了新的变化。扁平化网页设计是指设计形式摒弃图案纹理背景&#xff0c;阴影文字以及网站盒模型的部分。谷歌是第一个使用扁平化设计准备对重构 Web 应用程序的公司&#xff0c;现在越来越多的公司正在效仿。 您…

CentOS配置Nginx+Fastcgi+PHP,多网站配置

为什么80%的码农都做不了架构师&#xff1f;>>> 今天帮朋友配置CentOS PHP Nginx环境&#xff0c; 记录一下&#xff0c;希望能帮到更多伙伴 安装nginx yum install nginx php5.x已自带php-fpm&#xff0c;如没有自带 yum install php-fpm 配置nginx.conf server…

字 掉落 炫酷 网站_游戏装备新选择,炫酷、低延迟—Tezo Spark 电竞耳机

前言&#xff1a;好看的皮囊千篇一律&#xff0c;有趣的灵魂万里挑一。蓝牙耳机已经成了百花齐放的时刻&#xff0c;耳机厂商都在各自擅长的领域发布着各具特色的产品&#xff0c;最近就收到了一款专注于电竞领域的耳机Tezo Spark&#xff0c;毫无疑问&#xff0c;延迟必然是这…

在 Debian 8 系统里安装 cmswing 网站程序

环境&#xff1a;Debian 8 64位&#xff0c;cmswing 1.1 过程&#xff1a; 1. curl -sL https://deb.nodesource.com/setup_8.x | bash - 添加node v8安装源 2. apt-get install -y nodejs git mariadb-server nginx 安装node v8 及其它软件 4. npm install -g pm2 --registry…

Python版——博客网站二构建前端编写API

2019独角兽企业重金招聘Python工程师标准>>> 开源地址&#xff1a;https://github.com/leebingbin/Python3.WebAPP.Blog 至此&#xff0c;ORM框架、Web框架和配置都已就绪&#xff0c;我们可以开始编写一个最简单的MVC&#xff0c;把它们全部启动起来。 通过Web框架…