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 相关文章推荐
用于table内容排序
Jul 21 Javascript
Json对象与Json字符串互转(4种转换方式)
Mar 27 Javascript
js中通过split函数分割字符串成数组小例子
Sep 21 Javascript
alert出数组中的随即值代码
Sep 25 Javascript
利用jQuery和CSS将背景图片拉伸
Oct 16 Javascript
javascript实现滚动效果的数字时钟实例
Jul 21 Javascript
node.js中 stream使用教程
Aug 28 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
Dec 08 Javascript
Javascript中的prototype与继承
Feb 06 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
jQuery实时统计输入框字数及限制
Jun 24 jQuery
vue element和nuxt的使用技巧分享
Jan 14 Vue.js
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服务器实现多session并发运行
2006/10/09 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
JS跨域总结
2012/08/30 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
JS使用ajax从xml文件动态获取数据显示的方法
2015/03/24 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
微信小程序 动态修改页面数据及参数传递过程详解
2019/09/27 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python实现读取txt文件并画三维图简单代码示例
2017/12/09 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
园林设计专业毕业生求职信
2014/03/23 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
社区禁毒宣传活动总结
2015/05/07 职场文书
道士塔读书笔记
2015/06/30 职场文书
写作技巧:怎样写好一份优秀工作总结?
2019/08/14 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL
keepalived + nginx 实现高可用方案
2022/12/24 Servers