[笔记9]JavaScript DOM编程艺术_充当文档的内容

重要原则

  • 渐进增强

从核心部分,内容开始。根据内容使用标记实现良好的结构,然后通过CSS改进呈现效果,或者通过DOM添加各种行为。

  • 平稳退化

渐进增强的实现必然支持平稳退化。缺少CSS和DOM支持的访问者仍可以访问到你的核心内容。

控制某些属性的滥用

alt属性原本的作用:在图片不可用(无法显示)时用一段描述文字来解释这个位置的图片。

在显示属性这个问题上,你只能听任浏览器摆布。其实不是这样的,你只需要一点点的DOM编程,我们就能够把这种控制权重新掌握在自己手里。

  • 得到隐藏在属性里的信息
  • 创建标记封装这些信息
  • 把这些标记插入到文档中

内容

<abbr> abbreviation,它是对单词或短语的简写形式的统称。
<acronym> acronym,首字母缩写词。

浏览器都有自己默认的样式,我们可以使用自己定义的CSS样式来取代它们。

显示“缩略语列表”

功能:把<abbr>标签中的title属性集中起来显示在一个页面。用定义列表元素来显示<abbr>标签包含的文本和title属性。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Explaining the Document Object Model</title>
    <script type="text/javascript" src="scripts/addLoadEvent.js"></script>
    <script type="text/javascript" src="scripts/displayAbbreviations.js"></script>
</head>
<body>
<h1>What is the Document Object Model?</h1>
<p>
The
 <abbr title="World Wide Web Consortium">W3C</abbr>
 defines the 
 <abbr title="Document Object Model">DOM</abbr>
</p>
<blockquote cite="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 
    <abbr title="Application Programming Interface">API</abbr>
    that can be used to navigate
    <abbr title="HyperText Markup Language">HTML</abbr> and
    <abbr title="eXtendsible Markup Language">XML</abbr> documents.
</p>
</body>
</html>
function displayAbbreviations(){
    //检查兼容性
    if(!document.getElementsByTagName||
       !document.createElement||
       !document.createTextNode)return false;
    //遍历找出所有的abbr元素
    var abbreviations=document.getElementsByTagName("abbr");
    if(abbreviations.length<1)return false;
    //存储abbr标签文本及title属性的值
    var defs=new Array();
    for (var i = 0; i < abbreviations.length; i++) {
        var current_abbr=abbreviations[i];
        var definition=current_abbr.getAttribute("title");
        var key=current_abbr.lastChild.nodeValue;
        //将key作为数组的下标,definition作为它对应的值。
        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.getElementsByTagName("body")[0].appendChild(header);
    document.getElementsByTagName("body")[0].appendChild(dlist);
}

function addLoadEvent(func){
    var oldonload=window.onload;
    if(typeof window.onload!='function'){
        window.onload=func;
    }else{
        window.onload=function(){
            oldonload();
            func();
        }
    }
}

addLoadEvent(displayAbbreviations);

然后将JS添加到文档中即可。图片运行如下:

屏幕快照 2017-02-12 下午12.57.58.png

需要注意一点的是:微软IE浏览器直到IE7才支持abbr元素,而这之间的该元素的对应元素是acronym

可以增加这样一句话来解决问题。

for (var i = 0; i < abbreviations.length; i++) {
        var current_abbr=abbreviations[i];
                if(current_abbr.childNodes.length<1)continue;
        var definition=current_abbr.getAttribute("title");
        var key=current_abbr.lastChild.nodeValue;
        //将key作为数组的下标,definition作为它对应的值。
        defs[key]=definition;
    }

因为IE浏览器在统计abbr元素的子节点个数时总是返回一个错误的值——零,所以这条新语句会让IE浏览器不再继续执行这个循环中的后续代码。

显示“文献来源链接表”

blockquote元素包含一个属性cite。这是一个可选属性,你可以给它一个URL地址,告诉人们blockquote元素的内容引自哪里。编写以下函数需要注意的地方有:有些浏览器会把换行符解释为一个文本节点,这样以来,如果在p节点和blockquote节点中存在一个换行符的话,那么blockquote元素节点的lastChild属性就将是一个文本节点而不是p元素节点。所以我们需要判断。

function displayCitations(){
  if(!document.getElementsByTagName||!document.createElement||!document.createTextNode)return false;
  var quotes=document.getElementsByTagName("blockquote");
  for (var i = 0; i < quotes.length; i++) {
    if(!blockquote.getAttribute("cite"))continue;
    var blockquote=quotes[i];
    var cite=blockquote.getAttribute("cite");   
    var quoteChildren=blockquote.getElementsByTagName('*');
    if(quoteChildren.length<1)continue;
    var elem=quoteChildren[quoteChildren.length-1];
    var link=document.createElement("a");
    var source=document.createTextNode("source");
    link.appendChild(source);
    link.setAttribute("href",cite);
    var superscript=document.createElement('sup');
    superscript.appendChild(link);
    elem.appendChild(superscript);
  }
}

显示“快捷键清单”

access属性可以把一个元素(如链接)与键盘上的某个特定按键关联在一起。一般来说,在适用于Windows系统的浏览器里,快捷键的用法是在键盘上同时按下Alt键和特定按键;在适用于Mac系统的浏览器里,快捷键的用法是同时按下Ctrl键和特定键。

function displayAccessKeys(){
  if(!document.getElementsByTagName||
    !document.createElement||
    !document.createTextNode)return false;
  var linkElements=document.getElementsByTagName("a");
  var defs=new Array();
  for (var i = 0; i < linkElements.length; i++) {
    if(!linkElements[i].getAttribute("accesskey"))continue;
    var accesskey=linkElements[i].getAttribute("accesskey");
    var linkText=linkElements[i].lastChild.nodeValue;
    defs[accesskey]=linkText;
  }

  var list=document.createElement("ul");
    for(key in defs){
        var text=defs[key];
        var str=key+":"+text;
        var item=document.createElement("li");
        var itemText=document.createTextNode(str);
        item.appendChild(itemText);
        list.appendChild(item);
    }
  var header=document.createElement("h3");
  var headerText=document.createTextNode("AccessKeys");
  header.appendChild(headerText);
  document.body.appendChild(header);
  document.body.appendChild(list);
}
addLoadEvent(displayAccessKeys);

检索和添加信息

在需要对文档里的现有信息进行检索时,以下DOM方法最有用;

  • getElementById
  • getElementByTagName
  • getAttribute

在需要把信息添加到文档里去时,以下DOM方法最有用:

  • createElement
  • createTextNode
  • appendChild
  • insertBefore
  • setAttribute

JS脚本只应该用来充实文档的内容,要避免使用DOM技术创建核心内容。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容