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 options属性集合操作代码
Dec 28 Javascript
js 设置缓存及获取设置的缓存
May 08 Javascript
jQuery中:selected选择器用法实例
Jan 04 Javascript
JS实现点击上移下移LI行数据的方法
Aug 05 Javascript
vuejs2.0运用原生js实现简单的拖拽元素功能示例
Feb 24 Javascript
原生JS仿QQ阅读点击展开、收起效果
Mar 08 Javascript
Bootstrap与Angularjs的模态框实例代码
Aug 03 Javascript
详解EasyUi控件中的Datagrid
Aug 23 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
vue-cli配置文件——config篇
Jan 04 Javascript
使用Three.js实现太阳系八大行星的自转公转示例代码
Apr 09 Javascript
vue移动端屏幕适配详解
Apr 30 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
新浪SAE搭建PHP项目教程
2015/01/28 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
extjs 学习笔记(一) 一些基础知识
2009/10/13 Javascript
Javascript 静态页面实现随机显示广告的办法
2010/11/17 Javascript
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
js实现下拉框二级联动
2018/12/04 Javascript
Angular8 简单表单验证的实现示例
2020/06/03 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
[16:04]DOTA2海涛带你玩炸弹 9月5日更新内容详解
2014/09/05 DOTA
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python实现合并字典的方法
2015/07/07 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
浅谈Python中的继承
2020/06/19 Python
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
公积金接收函格式
2015/01/30 职场文书
兴趣班停课通知
2015/04/24 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
2016年清明节网上祭英烈活动总结
2016/04/01 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
pytorch加载预训练模型与自己模型不匹配的解决方案
2021/05/13 Python
js实现自动锁屏功能
2021/06/02 Javascript
深入浅析Django MTV模式
2021/09/04 Python