JavaScript DOM 学习第三章 内容表格


Posted in Javascript onFebruary 19, 2010

如果你也想这么做,那么你还需要我的getElementByTagNames()函数。

function createTOC() { 
    var y = document.createElement('div'); 
    y.id = 'innertoc'; 
    var a = y.appendChild(document.createElement('span')); 
    a.onclick = showhideTOC; 
    a.id = 'contentheader'; 
    a.innerHTML = 'show page contents'; 
    var z = y.appendChild(document.createElement('div')); 
    z.onclick = showhideTOC; 
    var toBeTOCced = getElementsByTagNames('h2,h3,h4,h5'); 
    if (toBeTOCced.length < 2) return false;     for (var i=0;i<toBeTOCced.length;i++) { 
        var tmp = document.createElement('a'); 
        tmp.innerHTML = toBeTOCced[i].innerHTML; 
        tmp.className = 'page'; 
        z.appendChild(tmp); 
        if (toBeTOCced[i].nodeName == 'H4') 
            tmp.className += ' indent'; 
        if (toBeTOCced[i].nodeName == 'H5') 
            tmp.className += ' extraindent'; 
        var headerId = toBeTOCced[i].id || 'link' + i; 
        tmp.href = '#' + headerId; 
        toBeTOCced[i].id = headerId; 
        if (toBeTOCced[i].nodeName == 'H2') { 
            tmp.innerHTML = 'Top'; 
            tmp.href = '#top'; 
            toBeTOCced[i].id = 'top'; 
        } 
    } 
    return y; 
} 
var TOCstate = 'none'; 
function showhideTOC() { 
    TOCstate = (TOCstate == 'none') ? 'block' : 'none'; 
    var newText = (TOCstate == 'none') ? 'show page contents' : 'hide page contents'; 
    document.getElementById('contentheader').innerHTML = newText; 
    document.getElementById('innertoc').lastChild.style.display = TOCstate; 
}

解释
这段代码运行如下:
准备阶段
首先我创建一个<div id="innertoc">来放置表格内容
function createTOC() { 
var y = document.createElement('div'); 
y.id = 'innertoc';

然后在他的上面添加一个<span>标签。点击这个元素就会运行showhideTOC()函数,我会在下面解释。
var a = y.appendChild(document.createElement('span')); 
a.onclick = showhideTOC; 
a.id = 'contentheader'; 
a.innerHTML = 'show page contents';

然后我再创建一个DIV用了放置真正的链接。在这个div上单击(真正的含义是:在这个div里的任何一个链接上单击)一样会触发showhideTOC()函数。
var z = y.appendChild(document.createElement('div')); 
z.onclick = showhideTOC;

得到标题
然后新建一个toBeTOCced数组,再用我的getElementByTagNames()函数来得到整个页面的左右标题。
var toBeTOCced = getElementsByTagNames('h2,h3,h4,h5');

如果数组里只有一个元素(比如这个页面只有一个h2标题)就停止。我不想让ToC只有一个元素。

创建ToC
现在开始创建ToC。首先遍历toBeTOCced数组。对于每个元素我都创建一个和他们的标题相同的链接。注意innerHTML的使用:网站里有些标题包含<code>这样的HTML标签,我也想让这些在ToC里面显示。我把这些新的链接添加在ToC的里面的<div>上。

for (var i=0;i<toBeTOCced.length;i++) { 
var tmp = document.createElement('a'); 
tmp.innerHTML = toBeTOCced[i].innerHTML; 
tmp.className = 'page'; 
z.appendChild(tmp);

如果标题是h4或者h5我就添加一个额外的类。

if (toBeTOCced[i].nodeName == 'H4') 
tmp.className += ' indent'; 
if (toBeTOCced[i].nodeName == 'H5') 
tmp.className += ' extraindent';

现在我们需要把a元素链接到他真正的标题上。这需要一个唯一的ID。然而,这些标题可能已经包含一个ID了。我不想破坏原有的内部链接,所以我更愿意使用标题本来的ID。只有当标题没有ID的时候我才创建一个新的ID。
var headerId = toBeTOCced[i].id || 'link' + i;

我们刚刚创建的链接的href属性就应该是#+headerId,标题本身也就有了一个ID。
tmp.href = '#' + headerId; 
toBeTOCced[i].id = headerId;

一个特殊情况:如果标题是H2,那就是页面的顶部,也会得到一个ID。
if (toBeTOCced[i].nodeName == 'H2') { 
tmp.innerHTML = 'Top'; 
tmp.href = '#top'; 
toBeTOCced[i].id = 'top'; 
} 
}

现在表格就生产了,我们返回给调用它的地方。
return y;}

显示和隐藏ToC
最后这个函数用了显示和隐藏ToC。非常的简单,先检测ToC的状态,然后根据信息生产一个新的文本和display值。

var TOCstate = 'none'; 
function showhideTOC() { 
TOCstate = (TOCstate == 'none') ? 'block' : 'none'; 
var newText = (TOCstate == 'none') ? 'show page contents' : 'hide page contents'; 
document.getElementById('contentheader').innerHTML = newText; 
document.getElementById('innertoc').lastChild.style.display = TOCstate; 
}

这个函数在用户点击<span>的时候调用,那样他就可以切换ToC的显示。另外当用户在链接上点击的时候也会马上隐藏ToC的。
翻译地址:http://www.quirksmode.org/dom/toc.html
转载请保留以下信息
作者:北玉(tw:@rehawk)
Javascript 相关文章推荐
javascript 流畅动画实现原理
Sep 08 Javascript
jquery验证手机号码、邮箱格式是否正确示例代码
Jul 28 Javascript
jquery $.fn $.fx是什么意思有什么用
Nov 04 Javascript
javaScript中的this示例学习详解及工作原理
Jan 13 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
Feb 21 Javascript
JavaScript参数个数可变的函数举例说明
Oct 10 Javascript
PHP PDO操作总结
Nov 17 Javascript
jquery禁止回车触发表单提交
Dec 12 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
Sep 04 Javascript
详解Chart.js轻量级图表库的使用经验
May 22 Javascript
vue+element实现打印页面功能
May 20 Javascript
JavaScript DOM 学习第二章 编辑文本
Feb 19 #Javascript
JavaScript DOM学习第一章 W3C DOM简介
Feb 19 #Javascript
JavaScript 题型问答有答案参考
Feb 17 #Javascript
JavaScript 学习技巧
Feb 17 #Javascript
JavaScript Timer实现代码
Feb 17 #Javascript
两个比较有用的Javascript工具函数代码
Feb 17 #Javascript
类似GMAIL的Ajax信息反馈显示
Feb 16 #Javascript
You might like
PHP测试程序运行时间的类
2012/02/05 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
php web环境和命令行环境下查找php.ini的位置
2019/07/17 PHP
Prototype使用指南之form.js
2007/01/10 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
js判断上传文件类型判断FileUpload文件类型代码
2014/05/20 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
javascript中select下拉框的用法总结
2016/01/07 Javascript
JavaScript事件学习小结(三)js事件对象
2016/06/09 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
Python3 能振兴 Python的原因分析
2014/11/28 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
上海期货面试题
2014/01/31 面试题
母亲节演讲稿范文
2014/01/02 职场文书
工作交流会欢迎词
2014/01/12 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
大学生优秀自荐信范文
2014/02/25 职场文书
教师节活动主持词
2014/04/02 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
中央空调节能方案
2014/06/15 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers