【干货】JavaScript DOM编程艺术学习笔记7-9
七、动态创建标记
在文档中不写占位图片和文字代码,在能调用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的更多相关文章
- JavaScript DOM编程艺术学习笔记(一)
嗯,经过了一周的时间,今天终于将<JavaScript DOM编程艺术(第2版)>这本书看完了,感觉受益匪浅,我和作者及出版社等等都不认识,无意为他们做广告,不过本书确实值得一看,也值得推 ...
- JavaScript DOM编程艺术-学习笔记
发现基础不是很好,补习一下.37买了2本书(dom编程和高级程序设计). 以前读书总是自己勾勾画画,有点没意思.现在写下来,说不定会成为传世经典.哈哈...........随便扯扯淡. 第一天(201 ...
- 【干货】JavaScript DOM编程艺术学习笔记1-3
从7月29号到8月8号,断断续续地看完了这本书,做了部分实践联系.总体感觉本书真的只能算是个入门,学完之后看到库的那一章才感觉是个大坑,实践中大部分应该都是用的现成的库吧,所以还要重新学习一个库,但是 ...
- 【干货】JavaScript DOM编程艺术学习笔记10-12【完】
十.用JavaScript实现动画效果 鼠标放到链接上,每次只显示图片的一小部分,加快加载速度. js: function prepareSlideshow(){ //对象检测 if(!documen ...
- 【干货】JavaScript DOM编程艺术学习笔记4-6
四.案例研究:JavaScript图片库 js: function showPic(whichpic){ //取得链接 var source=whichpic.getAttribute("h ...
- JavaScript DOM编程艺术学习笔记-第二章JavaScript语法
一.JavaScript示例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- JavaScript DOM编程艺术学习笔记-第一章JavaScript简史
一,JavaScript的起源 JavaScript是Netscape与Sun公司合作开发,它是一种脚本语言,通常只能通过Web浏览器去完成一些操作.JavaScript为程序员提供了一些操控Web浏 ...
- JavaScript DOM编程艺术-学习笔记(第八章、第九章)
第八章 1.小知识点: ①某些浏览器要根据DOCTYPE 来决定页面的呈现模式(标准模式 / 怪异模式--也称兼容模式): 兼容模式意味着浏览器要模仿老一辈的浏览器的怪异行为,来让老站点得到运行,并让 ...
- JavaScript DOM编程艺术-学习笔记(第七章)
第七章: 1.dom方法创建并且插入标签:(这种方法并没有改变文档的物理内容,而是在改变dom树) ①创建元素节点:createElement(); ②内部前插入:appendChild() ③创建文 ...
随机推荐
- 第六篇 elasticsearch express 删除索引数据
express 框架删除elasticsearch索引数据 1.在elasticsearch.js文件下添加 function deleteDocument(id) { return elasticC ...
- SSM集成shiro 致使Controller无法自动注册service
由于shiro在web.xml中配置属于过滤器,其中在web.xml中的加载顺序为: <context-param>(上下文) > listener > filter > ...
- unreal3启动地图设置
在defaultengine.ini中[URL]节: Map=MOBATinyMap.udkLocalMap=MOBATinyMap.udk 这里有Map和LocalMap两个属性,让人有点混淆,只好 ...
- Webservice 或者HttpRequest请求的时候提示 “指定的注册表项不存在”错误 解决方案
今天又遇到神奇的事情,在使用WebService的时候居然提示“指定的注册表不存在.” The specified registry key does not exist. Google后发现,原来是 ...
- 18.phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)
phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613) phpMyAdmin是一套开源的.基于Web的MySQL数据库管理工具.其index.php中存在一处文件包含逻辑, ...
- 17. CTF综合靶机渗透(十)
靶机描述:欢迎来到超级马里奥主机!这个虚拟机是对真实世界场景场景的模拟.目标是在VM中找到2个标志.根是不够的(对不起!)VM可以以多种方式开发,但请记住枚举是关键.挑战的程度是中等的.感谢VDBAN ...
- datagrid 绑定选中数据,列头全选
成品图: xaml代码 <Grid> <DataGrid x:Name="datagrid" Height="Auto" Width=&quo ...
- OpenStack基础知识-tox的详解介绍
1.tox简介 tox是通用的虚拟环境管理和测试命令行工具.tox能够让我们在同一个Host上自定义出多套相互独立且隔离的python环境,每套虚拟环境中可能使用了不同的 Python 拦截器/环境变 ...
- Java面向对象的三大特性 多态
多态 对象的多种形态 继承是实现多态的基础 1,引用多态 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 2,方法多态 创建本类对象时,调用的方法为本类方法 创建子 ...
- Elasticsearch+Logstash+Kibana搭建分布式日志平台
一.前言 编译安装 1.ELK简介 下载相关安装包地址:https://www.elastic.co/cn/downloads ELK是Elasticsearch+Logstash+Kibana的简称 ...