window.onload=function (){ var para=document.createElement("p"); var txt1=document.createTextNode("This is "); var emphasis=document.createElement("em"); var txt2=document.createTextNode("my "); var txt3=document.createTextNode("content."); para.appendChild(txt1); emphasis.appendChild(txt2); para.appendChild(emphasis); para.appendChild(txt3); var testdiv=document.getElementById("testdiv"); testdiv.appendChild(para); }
<!DOCTYPE html> <html> <head> <title>Test</title> </head> <body> <h1>What is the Document Object Model></h1>
<p>The <abbrtitle="World Wide Web Consortium">W3C</abbr> defines the <abbrtitle="Document Object Model">DOM</abbr> as :</p>
<blockquotecite="http://www.w3.org/DOM/">
<p>A platform- 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 <abbrtitle="Application Programming Interface">API</abbr> that can be used to navigate <abbrtitle="Hypertext Markup Language">HTML</abbr> and <abbrtitle="eXtensible Markup Language">XML</abbr> documents.</p>
var abbreviations=document.getElementsByTagName("abbr"); if(abbreviations.length<1){ returnfalse; }
不一定所有文档都有缩略语,当没有缩略语时立刻停止这个函数
2.3.保存每个abbr元素的title和包含的文本
var defs=newArray(); for(var i=0;i<abbreviations.length;i++){ var definition=abbreviations[i].getAttribute("title"); var key=abbreviations[i].lastChild.nodeValue; defs[key]=definition; }
for(key in defs){ var definition=defs[key]; var dtitle=document.createElement("dt"); var dtitle_text=document.createTextNode(key); dtitle.appendChild(dtitle_text); var ddesc=document.createElement("dd"); var ddesc_text=document.createTextNode(definition); ddesc.appendChild(ddesc_text); dlist.appendChild(dtitle); dlist.appendChild(ddesc); }
for/in循环:
遍历关联数组/对象的每个属性。
12.插入这个列表元素
直接插入有些突兀,我们可以在他之前先加一个h2标题:
var header=document.createElement("h2"); var header_text=document.createTextNode("Abbreviations"); header.appendChild(header_text); document.body.appendChild(header); document.body.appendChild(dlist);
至此,按照步骤这个函数已经初步完成:
functiondisplayAbbreviations(){ var abbreviations=document.getElementsByTagName("abbr"); if(abbreviations.length<1){ returnfalse; } var defs=newArray(); for(var i=0;i<abbreviations.length;i++){ var definition=abbreviations[i].getAttribute("title"); var key=abbreviations[i].lastChild.nodeValue; defs[key]=definition; } var dlist=document.createElement("dl"); for(key in defs){ var definition=defs[key]; var dtitle=document.createElement("dt"); var dtitle_text=document.createTextNode(key); dtitle.appendChild(dtitle_text); var ddesc=document.createElement("dd"); var ddesc_text=document.createTextNode(definition); ddesc.appendChild(ddesc_text); dlist.appendChild(dtitle); dlist.appendChild(ddesc); } var header=document.createElement("h2"); var header_text=document.createTextNode("Abbreviations"); header.appendChild(header_text); document.body.appendChild(header); document.body.appendChild(dlist); }
但这个函数还有需要改进的部分
检查兼容性
1.DOM方法存在性的检测
2.添加注释
3.添加addEvent.js文件
4.将两个js文件关联到文档中
完成以上步骤后最终函数为(addLoadEvent文件省略):
functiondisplayAbbreviations(){ //对象检测 if(!document.getElementsByTagName || !document.createElement || !document.createTextNode){ returnfalse; } //遍历abbr及存在性 var abbreviations=document.getElementsByTagName("abbr"); if(abbreviations.length<1){ returnfalse; } //存储title和文本内容 var defs=newArray(); for(var i=0;i<abbreviations.length;i++){ var definition=abbreviations[i].getAttribute("title"); var key=abbreviations[i].lastChild.nodeValue; defs[key]=definition; } //创建列表,插入文本内容 var dlist=document.createElement("dl"); for(key in defs){ var definition=defs[key]; var dtitle=document.createElement("dt"); var dtitle_text=document.createTextNode(key); dtitle.appendChild(dtitle_text); var ddesc=document.createElement("dd"); var ddesc_text=document.createTextNode(definition); ddesc.appendChild(ddesc_text); dlist.appendChild(dtitle); dlist.appendChild(ddesc); } //向文档插入标题和列表 var header=document.createElement("h2"); var header_text=document.createTextNode("Abbreviations"); header.appendChild(header_text); document.body.appendChild(header); document.body.appendChild(dlist); }
以下是没有用书本的关联数组的我自己的写法:
window.onload=functiondisplayAbbreviations(){ var abbr=document.getElementsByTagName("abbr"); var defs=newArray(); var key=newArray(); for(var i=0;i<abbr.length;i++){ defs[i]=abbr[i].getAttribute("title"); key[i]=abbr[i].firstChild.nodeValue; } var dl=document.createElement("dl"); for(var i=0;i<abbr.length;i++){ var dt=document.createElement("dt"); var dt_title=document.createTextNode(key[i]); dt.appendChild(dt_title); var dd=document.createElement("dd"); var dd_title=document.createTextNode(defs[i]); dd.appendChild(dd_title); dl.appendChild(dt); dl.appendChild(dd); } document.body.appendChild(dl); }
8.4.3 一个浏览器的地雷
在IE7之前是不支持abbr文法的,因此js无法获取abbr元素节点。
我们应该实现函数的平稳退化。
由于IE浏览器在统计abbr元素的子节点个数时总会返回一个错误值—-0。因此我们添加:
for(var i=0;i<abbreviations.length;i++){ if(abbreviations[i].childNodes.length<1){ returncontinue; } var definition=abbreviations[i].getAttribute("title"); var key=abbreviations[i].lastChild.nodeValue; defs[key]=definition; }
functiondisplayAbbreviations(){ //对象检测 if(!document.getElementsByTagName || !document.createElement || !document.createTextNode){ returnfalse; } //遍历abbr及存在性 var abbreviations=document.getElementsByTagName("abbr"); if(abbreviations.length<1){ returnfalse; } //存储title和文本内容 var defs=newArray(); for(var i=0;i<abbreviations.length;i++){ if(abbreviations[i].childNodes.length<1){ returncontinue; } var definition=abbreviations[i].getAttribute("title"); var key=abbreviations[i].lastChild.nodeValue; defs[key]=definition; } //创建列表,插入文本内容 var dlist=document.createElement("dl"); for(key in defs){ var definition=defs[key]; var dtitle=document.createElement("dt"); var dtitle_text=document.createTextNode(key); dtitle.appendChild(dtitle_text); var ddesc=document.createElement("dd"); var ddesc_text=document.createTextNode(definition); ddesc.appendChild(ddesc_text); dlist.appendChild(dtitle); dlist.appendChild(ddesc); } if(dlist.childNodes.length<1){ returnfalse; } //向文档插入标题和列表 var header=document.createElement("h2"); var header_text=document.createTextNode("Abbreviations"); header.appendChild(header_text); document.body.appendChild(header); document.body.appendChild(dlist); }
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 quotesElements=quotes[i].getElementsByTagName("*"); var elem=quotesElements[quotesElements.length-1];
2.创建链接
var links=document.createElement("a"); var links_text=document.createTextNode("source"); links.appendChild(links_text); links.setAttribute("href",url);
3.插入链接
我们可以再插入一个<sup>上标元素,让链接看起来更舒服;
var superscript=document.createElement("sup"); superscript.appendChild(links); elem.appendChild(superscript);
最后的完整函数:
functiondisplayCitations(){ var quotes=document.getElementsByTagName("blockquote"); for(var i=0;i<quotes.length;i++){ //DOM对象检测 if(!document.getElementsByTagName || !document.createElement || !document.createTextNode){ returnfalse; } //cite属性存在性检测 if(!quotes[i].getAttribute("cite")){ continue; } //调用cite属性 var url=quotes[i].getAttribute("cite"); //调用p元素 var quotesElements=quotes[i].getElementsByTagName("*"); var elem=quotesElements[quotesElements.length-1]; //创建链接 var links=document.createElement("a"); var links_text=document.createTextNode("source"); links.appendChild(links_text); links.setAttribute("href",url); //插入链接 var superscript=document.createElement("sup"); superscript.appendChild(links); elem.appendChild(superscript); } }