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 removeChild 使用注意事项
Apr 11 Javascript
自制基于jQuery的智能提示插件一枚
Feb 18 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
Apr 17 Javascript
常用的JS验证和函数汇总
Dec 23 Javascript
javascript事件模型实例分析
Jan 30 Javascript
JavaScript实现横向滑出的多级菜单效果
Oct 09 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
基于vue.js快速搭建图书管理平台
Oct 29 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
Dec 15 Javascript
探索JavaScript中私有成员的相关知识
Jun 13 Javascript
Canvas三种动态画圆实现方法说明(小结)
Apr 16 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
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
jQuery打印指定区域Html页面并自动分页
2014/07/04 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
jQuery给动态添加的元素绑定事件的方法
2015/03/09 Javascript
简单的jQuery banner图片轮播实例代码
2016/03/04 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
微信小程序列表中item左滑删除功能
2018/11/07 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
python 实现堆排序算法代码
2012/06/05 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python作用域用法实例详解
2016/03/15 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python下载网络文本数据到本地内存的四种实现方法示例
2018/02/05 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
wxpython绘制音频效果
2019/11/18 Python
Python3操作读写CSV文件使用包过程解析
2020/04/10 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
Bed Bath & Beyond加拿大官网:购买床上用品、浴巾、厨房电器等
2019/10/04 全球购物
药店促销活动策划方案
2014/08/24 职场文书
司法局群众路线教育实践活动整改措施思想汇报
2014/10/13 职场文书
二年级学生期末评语
2014/12/26 职场文书
机器人总动员观后感
2015/06/09 职场文书
运动会通讯稿100字
2015/07/20 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
关于JavaScript轮播图的实现
2021/11/20 Javascript
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
Golang 并发编程 SingleFlight模式
2022/04/26 Golang