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 相关文章推荐
js cookies 常见网页木马挂马代码 24小时只加载一次
Apr 13 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
Nov 13 Javascript
EXT窗口Window及对话框MessageBox
Jan 27 Javascript
js中判断文本框是否为空的两种方法
Jul 31 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
jQuery遍历json中多个map的方法
Feb 12 Javascript
vue在使用ECharts时的异步更新和数据加载详解
Nov 22 Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 Javascript
监控微信小程序中的慢HTTP请求过程详解
Jul 05 Javascript
Vue.js获取手机系统型号、版本、浏览器类型的示例代码
May 10 Javascript
详解JavaScript之ES5的继承
Jul 08 Javascript
原生js实现自定义滚动条组件
Jan 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和XSL stylesheets转换XML文档
2006/10/09 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
php+ajax简单实现全选删除的方法
2016/12/06 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
Vue.js 实现微信公众号菜单编辑器功能(二)
2018/05/08 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
用tensorflow实现弹性网络回归算法
2018/01/09 Python
Python程序运行原理图文解析
2018/02/10 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
质量月活动策划方案
2014/03/10 职场文书
安全目标责任书
2014/07/22 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
工厂仓库管理员岗位职责
2015/04/09 职场文书
联谊会开场白
2015/06/01 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python