充实文档——略缩语列表 文献来源链接 快捷键清单
这篇博客主要是对DOM方法的练习,同时也考虑网页的兼容性可访问性。我们将设计几个实用的小功能来进行练习。下面看这样一段HTML标记:
<!DOCTYPE html>
<html>
<head>
<title>Explaining the Document Object Model!</title>
</head>
<body>
<h1>What is the Document Subject Model?</h1>
<p>
The <abbr title="World Wide Web Consortium"> W3C </abbr> defines the <abbr title="Document Object Model"> DOM </abbr> as:
</p>
<blockquote cite="http://www.w3.org/DOM/">
<p>
A platfrom- and language-neutral interface that will allow programs
and scripts to dynamically access and update the content, structure and style of documents.
</p>
</blockquote>
<p>
It is an <abbr title="Application Programming Interface">API</abbr>
that can be used to navigate <abbr title="HyperText Markup language">
HTML</abbr> and <abbr title="extensible Markup Language"> XML </abbr>documents.
</p>
</body>
</html>
这段标记直接用浏览器打开是:
现在我们完成三个任务:
(1)给略缩语创建略缩语列表,显示他们
(2) 给文献创建文献来源列表,显示他们
(3)设置快捷键,给快捷键创建快捷键列表,显示他们
1. 创建略缩语列表
我们想要创建一个略缩语自定义列表,展示略缩语中的内容,这样一来阅读将会更加方便:
<h2>Abbreviations</h2>
<dl>
<dt>W3C</dt>
<dd>World Wide Web Consortium</dd>
<dt>DOM</dt>
<dd>Document Object Model</dd>
<dt>API</dt>
<dd>Application Programming Interface</dd>
<dt>XML</dt>
<dd>extensible Markup Language</dd>
</dl>
当然我们可以直接修改标记,但是这里我们用DOM方法修改,这将会是一个不错的小技巧,修改步骤如下:
(1)历遍这个abbr标签数组
(2)保存每一个abbr的标签title属性
(3)保存每一个abbr标签的文本
(4)创建一个自定义列表元素dl
(5)历遍保存的标签数组
(6)创建一个自定义标题元素dt
(7)把abbr的标签title属性插入到dt上
(8)创建一个自定义描述元素dd
(9)吧abbr的文本插入到dd元素上
(10)把dt,dd追加到dl元素上
(11)创建一个h2元素,追加文本节点
(13)把h2元素和dl元素追加到body元素上
我们将会编写displayAbbreviations()函数来处理上述步骤:
function addLoadEvent(func)
{//为了后续添加函数,addLoadEvent()十分重要,
var old=window.onload;
if(typeof window.onload!='function')
{
window.onload=func;
}
else
{
window.onload=function()
{
old();
func();
}
}
}
addLoadEvent(displayAbbreviations);
function displayAbbreviations()
{
var abbreviations=document.getElementsByTagName("abbr");
if (abbreviations.length<1) return false;
var defs=new Array();
for(var i=0;i<abbreviations.length;i++)
{
var definition=abbreviations[i].getAttribute("title");//取出title属性
//var key=abbreviations[i].lastChild.nodeValue;//取出文本节点
var key=abbreviations[i].innerHTML;//取出文本节点
defs[key]=definition;//存入数组
}
var dlist=document.createElement("dl");
for(key in defs)
{
var dtitle=document.createElement("dt");
var ddesc=document.createElement("dd");
var txt1=document.createTextNode(key);
var txt2=document.createTextNode(defs[key]);
dtitle.appendChild(txt1);
ddesc.appendChild(txt2);
dlist.appendChild(dtitle);
dlist.appendChild(ddesc);
}
var header=document.createElement("h2");;
var txt=document.createTextNode("Abbreviations");
header.appendChild(txt);
document.body.appendChild(header);
document.body.appendChild(dlist);
}
(1)应该给函数设置检验,检验浏览器是否兼容:
if(!document.getElementsByTagName) return false;
if(!document.createElement) return false;
if(!document.createTextNode) return false;
(2)使用defs数组存储关键值是为了练习key in的历遍方法,完全可以不用数组。另外,取出节点中的文本节点值有两种常用的方法:
一种是使用HTML的方法仅对HTML标记有效,另外一种则是用lastChild.nodeValue:
var key=abbreviations[i].innerHTML;//取出文本节点
var key=abbreviations[i].lastChild.nodeValue;//取出文本节点
(3)在过去的IE浏览器中,拒绝承认abbr的元素地位,abbr标签不收到支持。为了保证平稳退化,我们要在displayAbbreviations添加新的语句,当abbr不被承认是一个元素时,IE返回错误的子节点数目:0
for(var i=0;i<abbreviations.length;i++)
{
if(abbreviations[i].childNodes.length<1) continue;//没有子节点
var definition=abbreviations[i].getAttribute("title");//取出title属性
//var key=abbreviations[i].lastChild.nodeValue;//取出文本节点
var key=abbreviations[i].innerHTML;//取出文本节点
defs[key]=definition;//存入数组
}
最后是Abbreviations列表:
2. 创建文献来源链接表
对于以下的引用块,我们将cite的来源显示的展示出来,设定一个displayCitations函数,创建文献来源链接表,并将这个链接追加成blockquote元的最后后一个子节点
<blockquote cite="http://www.w3.org/DOM/">
<p>
A platfrom- and language-neutral interface that will allow programs
and scripts to dynamically access and update the content, structure and style of documents.
</p>
</blockquote>
(1)这个函数将完成如下步骤:
- 历遍blockquote元素
- 取出blockquote[i]的cite的属性值
- 创建一个超链接,标识文本为source
- 把这个链接赋值为cite
- 把这个链接插入到文献节选的末尾
function displayCitation()
{
if(!document.getElementsByTagName||!document.createElement||!document.createTextNode) return false;
var quotes=document.getElementsByTagName("blockquote");
for(var i=0;i<quotes.length;i++)
{
if(!quotes[i].getAttribute("cite")) continue;
var url=quotes[i].getAttribute("cite");//取出属性值
var quoteChildren=quotes[i].getElementsByTagName("*");//通配符返回所有子元素节点
if(quoteChildren.length<1) continue;
var elem=quoteChildren[quoteChildren.length-1];//取得最后一个元素节点
var link=document.createElement("a");
var txt=document.createTextNode("source");
link.appendChild(txt);
link.setAttribute("href",url);
var superscript=document.createElement("sup");//用高度的一般来显示
superscript.appendChild(link);
//quotes[i].appendChild(superscript);
elem.appendChild(superscript);
}
}
如何获取elem的子节点中的最后一个元素节点?
现在我们来讨论一个问题,如何获取elem的子节点中的最后一个元素节点?由于childNodes返回的是elem所有的子节点(元素节点,属性节点,文本节点(最后一个)),所以我们想通过childNodes是无法直接获取最后一个元素节点的,这个时候我们可以遍历整个子节点数组,用nodeType=1判断元素节点:
方法一遍历:
for(var j=quotes[i].childNodes.length-1;j>=0;j--)
{
if(quotes[i].childNodes[j].nodeType==1)
{
quotes[i].childNodes[j].appendChild(superscript);
break;
}
}
方法二通配符*:
对elem查找elem.getElementsByTagName("*"),方法会不管元素名,返回所有的子元素。只要气门取出这个元素数组的最后一个元素节点,就能获取elem的子节点中的最后一个元素节点:
var quoteChildren=quotes[i].getElementsByTagName("*");//通配符返回所有子元素节点
var elem=quoteChildren[quoteChildren.length-1];//取得最后一个元素节点
elem.appendChild(superscript);
注意点:
- 用quotes[i].appendChild(superscript);这样会直接在quotes[i]末尾加入一个元素节点,会导致换行显示:
- 用quotes[i].lastChild.parentNode.appendChild(superscript);这样仍然会导致换行显示,因为最后一个子节点并非< p >标签内部的文本,而是< blockquote >标签 的末尾。
- 这里添加在p标签下,当然可以查找p标签:
quotes[i].getElementsByTagName("p")[0].appendChild(superscript);
最后创文献来源链接表就创建好了:
3. 创建快捷键清单
一般来说,在Windows系统里,快捷键是Alt+X ,而在Mac系统里是Ctr+X,网页中的快捷键设置有着约定俗成的设置方法,详情可以参见快捷键设置方法
Access key | Target |
---|---|
S | Skip navigation 跳过导航 |
1 | Home page 返回主页 |
2 | What’s new 返回前一个页面 |
3 | Site map 网站导航 |
4 | Search 打开本网页的搜索界面 |
5 | FAQ 常见问题解答s |
6 | Help 帮助 |
7 | Complaints procedure 投诉程序 |
8 | Terms and conditions 条件和协议 |
9 | Feedback form 本网站联系办法链接 |
0 | Access key details 查看本网站的快捷清单 |
在HTML标记中写入一个连接列表
<ul>
<li><a href="index.html" accesskey="1">Home</a></li>
<li><a href="search.html" accesskey="4">Search</a></li>
<li><a href="contact.html" accesskey="0">Contact</a></li>
</ul>
根据这个html标记创建快捷键清单:
function displayAccessKeys()
{
if(!document.getElementsByTagName||!document.createElement||!document.createTextNode) return false;
var links=document.getElementsByTagName("a");//获取a集合
var akeys=new Array();
for(var i=0;i<links.length;i++)
{
if(!links[i].getAttribute("accesskey")) continue;
akeys[links[i].getAttribute("accesskey")]=links[i].lastChild.nodeValue;//存入数组
}
var ulist=document.createElement("ul");
for(key in akeys)
{
var txt=key+":"+akeys[key];
var list=document.createElement("li");
var ltxt=document.createTextNode(txt);
list.appendChild(ltxt);
ulist.appendChild(list);//追加到ulist上
}
var header=document.createElement("h2");
var txt=document.createTextNode("Accesskeys");
header.appendChild(txt);
header.appendChild(ulist);
document.body.appendChild(header);
}
最后文档充实就完成了: