七、动态创建标记

在文档中不写占位图片和文字代码,在能调用js的情况下动态创建,文档支持性更好。

在原来的addLoadEvent prepareGallery showPic的基础上增加函数preparePlaceHolder

最后调用preparePlaceHolder和prepareGallery两个函数

function preparePlaceHolder(){

//对象检测

if(!document.createElement) return false;

if(!document.creatTextNode) return false;

if(!document.getElementById) return false;

if(!document.getElementById("imagegallery")) return false;

//创建占位图片元素

var placeholder=document.createElement("img");

placeholder.setAttribute("id" ,"placeholder");

placeholder.setAttribute("src" ,"images/placeholder.gif");

placeholder.setAttribute("alt" ,"my image gallery");

//创建文本段元素节点

var description=document.createElement("p");

description.setAttribute("id","description");

//创建文本节点

var destext=document.createTextNode("choose an image");

description.appendChild(destext);

var gallery=document.getElementById("imagegallery");

//将placeholder插入gallery后

insertAfter(placeholder,gallery);

//将description插入placeholder后

insertAfter(description,placeholder);

}

function insertAfter(newElement, targetElement){

//取出目标元素的父元素

var parent=targetElement.parentNode;

//如果目标元素是父元素最后一个子节点,则追加到父元素最后

if(parent.lastChild==targetElement){

parent.appendChild(newElement);

}

//如果不是,则插入到目标元素的下一个兄弟元素之前

else{

parent.insertBefore(newElement, targetElement.nextSibling);

}

}

注:

innerHTML:需要插入一大段内容时用,比如testdiv.innerHTML="<p>I insert <em>this</em> content</p>";可以放在外部js中与文档分离。属于html专用属性,其他标记语言不支持。

document.creatElement(nodeName):添加元素节点。

document.creatTextNode(text):添加文本节点。

parent.appendChild(child):使child元素成为parent元素最后一个子节点。

targetElement.parentNode.insertBefore(newElement, targetElement):将newElement插入targetElement之前。

targetElement.nextSibling:targetElment元素的下一个兄弟元素。

Ajiax和Hijax后面讲。

八、充实文档内容

把文档中的现有信息用另一种结构呈现,比如缩略语列表,文献来源链接,快捷键清单。基本步骤都是,先创建一个特定元素(如缩略语)构成的节点集合,然后循环遍历这个集合,在每次循环里创建一些标记,最后把新创建的标记插入到文档里。

缩略语列表:

在文档中是<p>The <abbr title="world wide web consortium">w3c</abbr></p>用abbr来标记,里面的title内容不显示,只显示文本w3c

function displayAbbreviations(){

if(!doucument.getElementsByTagName||!document.createElement||!document.createTextNode) return false;

//取得所有缩略语元素

var abbreviations=document.getElementsByTagName("abbr");

if(abbreviations.length<1) returen false;

//创建存储数组

var defs=new Array();

//遍历缩略语元素

for(i=0; i<abbreviations.length; i++){

var current_abbr=abbreviations[i];

//如果是空的继续下一个循环

if(current_abbr.childNodes.length<1) continue;

//存储对应的key和defination

var key=current_abbr.lastChild.nodeValue;

var defination=current_abbr.getAttribute("title");

defs[key]=definition;

}

//创建定义列表

var dlist=document.createElement("dl");

//遍历缩略语数组defs

for(key in defs){

//为每一个创建定义标题dt对应key

var dtitle=document.createElement("dt");

var dtitle_text=document.createTextNode(key);

dtitle.appendChild(dtitle_text);

//创建定义描述dd对应defination

var ddesc=document.createElement("dd");

var ddesc_text=docuement.createTextNode(defination);

ddesc.appendChild(ddesc_text);

//将每组dt dd添加到列表dl

dlist.appendChild(dtitle);

dlist.appendChild(ddesc);

}

if(dlist.childNodes.length<1) return false;

//将定义列表添加到页面

document.body.appendChild(dlist);

}

文献来源连接表:

在页面中是blockquote的cite属性:<blockquote cite="http://www.w3.org/DOM"><p></p></blockquote>,想把cite内内容添加到p的最后。在页面中用sup元素包装,显示为上标。

function displayCitations(){

if(!document.getElementsByTagName||!document.createElement||!document.createTextNode) return false;

//取得所有引用

var quotes=document.getElementsByTagName("blockquote");

//遍历引用

for(i=0; i<quotes.length; i++){

//如果没有cite属性进入下一个循环

if(!quotes[i].getAttribute("cite")) continue;

//取出cite属性

var url=quotes[i].getAttribute("cite");

//取得引用中所有元素节点

var quoteChildren=quotes[i].getElementsByTagName("*");

//如果引用中没有元素节点,继续循环

if(quotoChildren.length<1) continue;

//取得引用中最后一个元素节点

var elem=quoteChildren[quoteChildren.length-1];

//创建标记a

var link=document.createElement("a");

var link_text=document.createTextNode("source");

link.appendChild(link_text):

link.setAttribute("href",url);

//封装到sup元素里

var superscript=document.createElement("sup");

superscript.appendChild(link);

//添加到引用的最后一个元素里

elem.appendChild(superscript);

}

}

显示快捷键清单:

a元素的accesskey属性,如<a href="index.html" accesskey="1">Home</a>,方法与上同。

九、CSS-DOM

1、style属性

通过DOM style属性获取样式:elem.style.fontFamily,可以识别速记属性,另外有连接线的属性名在dom中采用驼峰法表示。

但是,这种方式只能获取内嵌在html代码里的属性声明,外部链接的样式表和文档head里声明的style属性,用这种方法都提取不到。

用这种方式设置样式:para.style.font="2em 'Times', serif";

2、什么时候使用DOM设置属性

一般情况下样式应该用CSS去设置,只有当CSS无法找到想要处理的目标元素,或者是用CSS找目标元素的方法还未得到广泛的支持时,采用DOM的方法,另外用DOM的方法尽量不直接设置style属性,而是更新className属性。

(1)根据元素节点的位置设置样式styleHeaderSiblings

(2)遍历一个节点集合设置有关元素的样式stripeTables

(3)在事件发生时设置有关元素的样式highLightRows

(1):根据元素在节点树的位置来设置样式

function styleHeaderSiblings(){

//对象检测

if(!document.getElementsByTagName) return false;

//选出h1元素

var headers=document.getElementsByTagName("h1");

var elem;

for(var i=0; i<headers.length; i++){

//找到header后面一个元素节点

elem=getNextElement(headers[i].nextSibling);

//为该元素增加一个属性,而不是改变属性

addClass(elem,"intro");

}

}

function getNextElement(node){

//获取下一个元素节点,而不是下一个节点

if(node.nodeType==1) return node;

if(node.nextSibling){

return getNextElement(node.nextSibling);

}

}

function addClass(element,value){

if(!element.className) element.className=value;

else{

element.className+=" intro";

}

}

最后在CSS中设置intro类的属性:.intro{font-weight:bold; font-size:1.4em};

(2):根据某种条件反复设置某种样式

function stripeTables(){

if(!document.getElementsByTagName) return false;

//取出所有列表

var tables=document.getElementsByTagName("table");

var odd,rows;

//遍历列表

for(var i=0; i<tables.length; i++){

odd=false;

//取出列表所有行

rows=tables[i].getElementsByTagName("tr");

for(var j=0; j<rows.length; j++){

//根据行的奇偶性设置属性

if(odd==true){

addClass(rows[j],"odd");

odd=false;

}

else{

odd=true;

}

}

}

}

再在CSS中设置odd类样式: .odd{background-color:#ffc};

(3):根据相应事件设置样式

function highLightRows(){

if(!document.getElementsByTagName) return false;

var rows=document.getElementsByTagName("tr");

for(var i=0; i<rows.length; i++){

rows[i].onmousover=function(){this.style.fontWeight="bold";}

rows[i].onmouseout=function(){this.style.fontWeight="normal";}

}

}

【干货】JavaScript DOM编程艺术学习笔记7-9的更多相关文章

  1. JavaScript DOM编程艺术学习笔记(一)

    嗯,经过了一周的时间,今天终于将<JavaScript DOM编程艺术(第2版)>这本书看完了,感觉受益匪浅,我和作者及出版社等等都不认识,无意为他们做广告,不过本书确实值得一看,也值得推 ...

  2. JavaScript DOM编程艺术-学习笔记

    发现基础不是很好,补习一下.37买了2本书(dom编程和高级程序设计). 以前读书总是自己勾勾画画,有点没意思.现在写下来,说不定会成为传世经典.哈哈...........随便扯扯淡. 第一天(201 ...

  3. 【干货】JavaScript DOM编程艺术学习笔记1-3

    从7月29号到8月8号,断断续续地看完了这本书,做了部分实践联系.总体感觉本书真的只能算是个入门,学完之后看到库的那一章才感觉是个大坑,实践中大部分应该都是用的现成的库吧,所以还要重新学习一个库,但是 ...

  4. 【干货】JavaScript DOM编程艺术学习笔记10-12【完】

    十.用JavaScript实现动画效果 鼠标放到链接上,每次只显示图片的一小部分,加快加载速度. js: function prepareSlideshow(){ //对象检测 if(!documen ...

  5. 【干货】JavaScript DOM编程艺术学习笔记4-6

    四.案例研究:JavaScript图片库 js: function showPic(whichpic){ //取得链接 var source=whichpic.getAttribute("h ...

  6. JavaScript DOM编程艺术学习笔记-第二章JavaScript语法

    一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  7. JavaScript DOM编程艺术学习笔记-第一章JavaScript简史

    一,JavaScript的起源 JavaScript是Netscape与Sun公司合作开发,它是一种脚本语言,通常只能通过Web浏览器去完成一些操作.JavaScript为程序员提供了一些操控Web浏 ...

  8. JavaScript DOM编程艺术-学习笔记(第八章、第九章)

    第八章 1.小知识点: ①某些浏览器要根据DOCTYPE 来决定页面的呈现模式(标准模式 / 怪异模式--也称兼容模式): 兼容模式意味着浏览器要模仿老一辈的浏览器的怪异行为,来让老站点得到运行,并让 ...

  9. JavaScript DOM编程艺术-学习笔记(第七章)

    第七章: 1.dom方法创建并且插入标签:(这种方法并没有改变文档的物理内容,而是在改变dom树) ①创建元素节点:createElement(); ②内部前插入:appendChild() ③创建文 ...

随机推荐

  1. c# DateTime.ToString()转换为统一的格式

    DateTime.ToString()的转换结果时根据当前电脑的显示格式来转换的,不能同意,而且有些格式我们想将他们重新转换为时间时,会报错,如: 2017/11/21/周二 10:23:57,如果转 ...

  2. 【BZOJ2839】集合计数 组合数+容斥

    [BZOJ2839]集合计数 Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为K,求取法的方案数 ...

  3. p1197&bzoj1015 星球大战

    传送门(洛谷) 传送门(bzoj) 题目 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的 ...

  4. SPOJ - REPEATS Repeats (后缀数组+RMQ)

    题意:求一个串中出现重复子串次数最多的数目. 析:枚举每个长度的子串,至少要重复两次,必然会经过s[l*i]中相邻的两个,然后再分别向前和向后匹配即可. 代码如下: #pragma comment(l ...

  5. hdu1055

    #include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #inc ...

  6. 网页设计与开发——HTML、CSS、JavaScript (王津涛) pdf扫描版

    网页设计与开发——html.css.javascript从网页制作实际出发,除了详细地介绍html页面制作.css样式控制和javascript动态程序之外,还介绍了html 5.全书共分15章,各章 ...

  7. SqlParameter用法

    if (id != null) { sql = @"update [User] set Username = @Username, Password = @Password, Type = ...

  8. [CentOS7] 通过vncviewer屏幕扩展

    方法一:通过vncserver来调整分辨率 这是博主最近才发现的,原来还可以直接通过在服务端通过设置vncserver来调整分辨率,方法如下: 接下来,我们要进行vncviewer屏幕扩展的设置: 点 ...

  9. spring boot jpa 使用<S extends T> List<S> findAll(Example<S> example)查询数据

    直接上代码 //查询条件对象 TinventivePrinciple time = new TinventivePrinciple(); //设置需要查询的条件(赋值) time.setIsTime( ...

  10. angularJs解决模态框下echarts不显示问题

    例如:摸态框myModal.html,给它命名一个id,id='myModal'; myModal.html页面想画一个echarts图表 这里是angularJs已经封装好的echarts在html ...