javascript学习 真正理解DOM脚本编程技术背后的思路和原则
本文学习来源于《javascriptDOM编程艺术》仅作笔记
学会怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善你们的网页。
循序渐进:从最核心的内容开始,逐步添加额外的功能。
预留退路:为内容添加的样式和行为要留有足够的退路,以保证用户能访问到核心内容。
以用户为中心的设计:
DHTML(动态HTML):是dynamic HTML 的简称。它不是一项单一的新技术,而是HTML、CSS、javascript这三种技术相结合的产物。现在的DHTML已经成为了一种简单、易用的标准化技术。含义:
1、利用HTML把网页 标记为各种元素;
2、利用CSS设计 各有关元素的排版样式 并确定它们在窗口中的显示位置;
3、利用javascript 实时操控和改变各有关样式。
但把这些东西真正凝聚在一起的是DOM。
什么是DOM:DOM是“document object model(文档对象模型)”的缩写。简单的说,DOM就是一套对文档的内容进行抽象和概念化的方法。DOM是一种API(应用编程接口),简单地说,API就是一组已经得到有关各方共同认可的基本约定。在现实世界中,例如:
1、摩尔斯码
2、国际时区
3、化学元素周期表
在编程领域中,虽然语言有多种不同,但很多任务确实相同或相似的,这正是需要API的原因,一旦掌握了某个标准,就可以应用在不同环境中,虽然有关语法会有所变化,但这些约定总是保持不变的。
W3C推出的标准化DOM可以让任何一种程序设计语言对 使用任何一种标记语言编写出来的任何一份文档 进行操控。定义是:“一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地对文档的内容、结构和样式进行访问和修改”。
对象(object)是一种非常重要的数据类型,对象是自我包含的数据集合,对象里的数据可以通过两种形式 属性(property)和方法(method)访问。
1、属性是隶属于某个特定对象的遍历;
2、方法是只有某个特定对象才能调用的函数。
对象就是由一些彼此相关的属性和方法集合在一起而构成的一个数据实体。
在javascript脚本里,属性和方法都需要使用 . “点”语法来访问,而为给定对象创建一个新实例需要使用new关键字。
对象、属性、方法和实例等概念都比较抽象,所以我们可以利用javascript语言来创建自己的对象——术语称之为用户定义对象。
节点(Node),文档也是有节点构成的集合。
getElementById()方法将返回一个与有着给定id属性值的元素节点相对应的 对象,返回的是一个对象。
getElementsByTagName()方法将返回一个 对象数组
getAttribute()方法是一个函数,只有一个参数——要查询的属性的名字。但它不能通过document对象调用,只能通过一个元素节点对象调用,例:查询每个p元素的title属性
var par = document.getElementsByTagName('p');
for(var i=0;i<par.length;i++){
alert(par[i].getAttribute('title'));
}
setAttribute()方法也是只能通过元素节点对象调用的函数,但需要向它传递两个参数:
object.setAttribute(attribute,value);
DOM还提供了许多其他的属性和方法,如nodeName、nodeValue、chileNodes、nextSibling和parentNode等。
对javascript函数进行功能扩展
childNodes属性让我们可以从给定文档的节点树里把任何一个元素的所有子元素检索出来。返回一个数组,包含给定元素节点的全体子元素。
nodeValue属性,用途是检索(和设置)节点的值。
firstChild属性,访问childNodes[]数组的第一个元素。
lastChild属性,访问childNodes[]数组的最后一个元素。
javascript编程原则和良好习惯
预留退路:确保网页在没有javascript的情况下也能正常工作。
javascript使用window对象的open()方法来创建新的浏览器窗口,该方法有三个参数
window.open(url,name,features);
三个参数都是可选的,第一个是URL地址,第二个是新窗口名字,第三个是新窗口的各种属性(原则上要求浏览功能要少而精)。
"javascript:"伪协议,例:
<a href="javascript:popUP('jsstudy.html')">window open</a>
但在不支持或禁用了Javascript功能的浏览器里将无法使用。
当不确定浏览器是否支持DOM时,需要进行对象检测。
分离javascript:把网页的结构和内容与javascript脚本的动作行为分开。
结构与行为的相互分离程度越大越好。
向后兼容性:确保老版本的浏览器不会因为你的javascript脚本而死机。
动态创建HTML内容:document.write()方法和innerHTML属性。
深入剖析DOM方法:createElement()、createTextNode()、appendChild()、insertBefore()。
学习通过创建新元素和修改现有元素而改变网页结构的DOM方法。
创建节点createElement()语法:
document.createElement(nodeName)
插入节点appendChild()语法:
parent.appendChild(child)
创建文本节点createTextNode()语法:
document.createTextNode(text)
将一个新元素插入到一个现有元素的前面insertBefore()语法:
parentElement.insertBefore(newElement,targetElement)
为了方便,因此编写一个window.onload处理函数 addLoadEvent()
function addLoadEvent(func) {
var oldonload = window.onload;
if(typeof window.onload != 'function'){
window.onload = func;
}else{
window.onload = function () {
oldonload();
func();
}
}
}
将一个新元素插入到一个现有元素的后面需要编写insertAfter()函数:
function insertAfter(newElement,targetElement) {
var parent = targetElement.parentNode;
if(parent.lastChild == targetElement){
parent.appendChild(newElement);
}else{
parent.insertBefore(newElement,targetElement.nextSibling);
}
}
<abbr>标签的含义是"缩略语",是对单词或短语的简写形式的统称,<acronym>标签的含义是"字头缩写词",特指单词形式的缩略语。
显示"缩略词语表",需要编写函数,我命名为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 current_abbr = abbreviations[i];
//由于IE旧版本不支持abbr元素,因此判断元素是否有abbr子节点,因为IE在统计abbr元素时会返回零
if(current_abbr.childNodes.length<1){
continue;
}
var definition = current_abbr.getAttribute('title');
var key = current_abbr.lastChild.nodeValue;
defs[key] = definition;
console.log(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);
}
//判断dl元素是否有子节点
if(dlist.childNodes.length<1){
return false;
}
var header = document.createElement('h2');
var header_text = document.createTextNode('Abbreviations');
header.appendChild(header_text);
document.body.appendChild(header);
document.body.appendChild(dlist);
}
学习利用DOM技术去读写CSS信息
首先,网页其实是由三层信息构成的一个共同体:即结构层(HTML标签),表示层(CSS样式),行为层(javascript)。
如何决定是使用纯粹的CSS还是利用DOM来设置样式,需要考虑以下因素:
1、这个问题最简单的解决方案是什么;
2、哪种方案会得到更多浏览器的支持。
一般原则:如果想改变某个元素的呈现效果就选用CSS;如果想改变某个元素的行为就选用DOM;如果想根据某个元素的行为去改变它的呈现效果,请运用你的理智。
用javascript实现动画效果
时间函数setTimeout()函数能够让某个函数在结果一段预定的时间之后开始执行。它有两个参数,第一个参数为一个字符串,第二个参数是一个数值(以毫秒为单位)。在绝大多数时候,把这个函数调用赋值给一个变量将是个好主意:
variable = setTimeou('function',interval)
时间递增量,需要使用parseInt()函数,它可以把字符串里的数值信息提取出来,它将返回一个数值且为整数。如果要返回带小数点的数值需要使用parseFloat()函数。
CSS内容溢出问题 overflow属性可取值为:
visible:不裁剪溢出的内容,全部内容在浏览器中可见;
hidden:裁剪溢出的内容,只有部分内容可见;
scroll:会裁剪溢出的内容,但会显示滚动条显示其余内容;
auto:类似scroll,但如果内容没有溢出,不会显示滚动条。
javascript为我们准备了很多用来进行字符串比较的方法,indexOf()方法可以在一个字符串里寻找一个字串的位置:
string.indexOf(substring)
它返回的是子串substring在字符串string里第一次出现的位置。
关于javascript for...in语句
for...in 语句用于对数组或者对象的属性进行循环操作。
for ... in 循环中的代码每执行一次,就会对数组的元素或者对象的属性进行一次操作。
Tip:for-in循环应该用在非数组对象的遍历上,使用for-in进行循环也被称为“枚举”。
使用split()方法可以将一个字符串拆分为两个或多个部分的常用方法:
array = string.split(character)
Form对象
每个Form对象都有一个elements.length属性,这个属性的值是包含在某给定form元素里的表单元素的总个数:
form.elements.length
elements.value 即表单元素的value属性包含该元素的当前值。
表单元素的defaultValue属性,它包含该表单元素的初始值。
DOM方法和属性
创建新节点createElement(),该方法返回的是一个指向新元素节点的引用指针
var reference = document.createElement(element);
创建一个包含着给定文本的新文本节点createTextNode(),返回值是一个指向新建文本节点的引用指针
var reference = document.createTextNode()(element);
复制节点cloneNode(),返回值是一个指向新建克隆节点的引用指针
var reference = node.cloneNode(deep)
插入节点appendChild(),将给元素节点追加一个子节点
var reference = element.appendChild(newChild)
insertBefore(),将一个给定节点插入到一个给定元素节点的给定子节点前面,返回一个指向新增子节点的引用指针
var referebce = element.insertBefore(newNode,targetNode)
删除节点removeChild(),从一个给定元素里删除一个子节点
var reference = element.removeChild(node)
替换节点replaceChild(),将把一个给定父元素里的一个子节点替换为另外一个节点
var reference = element.replaceChild(newChild,oldChild)
设置属性节点setAttribute(),将为给定元素节点添加一个新的属性值或是改变它的现有属性的值
element.setAttribute(attributeName,attributeValue)
查找节点getAttribute(),将返回一个给定元素的一个给定属性节点的值
attributeValue = element.getAttribute(attributeName)
获取给定ID属性值的元素getElementById()
element = document.getElementById(ID)
获取有着给定标签名的所有元素getElmentsByTagName()
element = document.getElmentsByTagName(tagName)
hasChildNodes()方法可用来检查一个给定元素是否有子节点
booleanValue = element.hasChildNodes
DOM属性
节点属性
nodeName,返回一个字符串,内容是给定节点的名字
name = node.nodeName
nodeType,返回一个整数,代表给定节点的类型(元素节点、属性节点、文本节点)
integer = node.nodeType
nodeValue,返回给定节点的当前值,结果为字符串
value = node.nodeValue
遍历节点数
childNodes属性将返回一个数组,该数组由给定元素节点的子节点构成
nodeList = node.childNodes
firstChild属性将返回一个给定元素节点的第一个子节点
reference = node.firstChild
lastChild属性将返回一个给定元素节点的最后一个子节点
reference = node.laseChild
nextSibling属性将返回一个给定节点的下一个子节点
reference = node.nextSibling
parentNode属性将返回一个给定节点的父节点
reference = node.parentNode
previousSibling属性将返回一个给定节点的下一个子节点
reference = node.previousSibling
over
javascript学习 真正理解DOM脚本编程技术背后的思路和原则的更多相关文章
- javascript进阶——分离式DOM脚本编程
编写分离式(unobstrusive)代码意味着对HTML内容的完全分离:数据来自服务器端,javascript代码用来动态化和交互.这种分离的好处是在不同浏览器之间使用是可以完全降级或升级运行,对于 ...
- linux脚本编程技术
linux脚本编程技术 一.什么是脚本 脚本是一个包含一系列命令序列的可执行(777)文本文件.当运行这个脚本文件时,文件中包含的命令序列将得到自动执行. 二.脚本编程 #!/bin/sh 首行固定格 ...
- linux脚本编程技术---8
一.什么是脚本 脚本是一个包含一系列命令序列的可执行(777)文本文件.当运行这个脚本文件时,文件中包含的命令序列将得到自动执行. 二.脚本编程 #!/bin/sh 首行固定格式 #!表明该脚本的的解 ...
- JavaScript大杂烩10 - 理解DOM
操作DOM 终于到了JavaScript最为核心的部分了,通常来说,操作DOM,为页面提供更为友好的行为是JavaScript根本目标. DOM树 - HTML结构的抽象 既然DOM是操纵HTML ...
- 【JavaScript脚本编程技术详解-----(一)】
首先说明,本系列教程是写给有一定的JavaScript编程基础的同学看的,最好还有其它的编程语言经验,因为里面可能涉及一些其它的程序设计语言写的源代码,这都是我自己总结的经验,我喜欢在学习一门新的编程 ...
- 关于dom脚本编程的一些优秀理念总结
1.平稳退化(优雅降级) 目的:当浏览器不支持js或者js被用户禁用时,做到即使不运行js,网页的可读性亦不会受到太大的影响. 理念:使用最新的技术面向高级浏览器构建最强的功能及用户体验,然后针对低级 ...
- javascript学习笔记之DOM与表单
DOM(文档对象模型),猫叔了一个层次化的节点树 一.DOM NODE相关公共属性与方法 DOM中所有节点都实现了NODE接口,该接口的公共属性和方法如下: 1.节点基本属性 1)NodeType 节 ...
- 【学习】Linux Shell脚本编程
1.脚本的组成和执行 Linux shell脚本的结构并不复杂,其主要由变量.内部命令以及shell的语法结构和一些函数.其他命令行的程序等组成,以下是一个简单的shell脚本. #!/bin/bas ...
- JavaScript 学习笔记-HTML&&DOM
HTML DOM (文档对象模型) 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model). HTML DOM 模型被构造为对象的树. JavaScript 能够 ...
随机推荐
- 点击弹出li所在的序列号
最近在研究一个图片替换功能,及点击左侧商品在右侧弹出层修改图片后,同时左侧的图片也得跟着修改. 我原来考虑的添加ID作为唯一值.但当ID重复了,替换就出BUG了. 最后问公司同事,然后给提供了 根据点 ...
- 软件工程(FZU2015)赛季得分榜,第三回合
目录 第一回合 第二回合 第三回合 第四回合 第五回合 第6回合 第7回合 第8回合 第9回合 第10回合 第11回合 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分 ...
- 基于Emgu CV的人脸检测代码
这个提供的代码例子是Emgu CV提供的源码里面自带的例子,很好用,基本不需要改,代码做的是人脸检测不是人脸识别,这个要分清楚.再就是新版本的Emgu CV可能会遇到系统32位和64位处理方式有区别的 ...
- 教你一招:Win10系统如何正确卸载edge浏览器?
Edge浏览器作为Win10系统默认浏览器,尽管我们将其他浏览器设置为默认程序,但是有时候还是会自动弹出,非常的不爽,但是在控制面板中却又找不到卸载“Edge”浏览器的选项.下面小编就教大家卸载“Ed ...
- Codeforces Round #374 (Div. 2)
A题和B题是一如既往的签到题. C题是一道拓扑序dp题,题意是给定一个DAG,问你从1号点走到n号点,在长度不超过T的情况下,要求经过的点数最多,换个思维,设dp[i][j]表示到i号点时经过j个点的 ...
- <<< php程序在运行后报“internal server error”错误
上传的php程序在运行后报“internal server error”错误,检查以下两方面: 1.请您检查php程序的属性是否设置为755,如果php程序的属性不是755,那么运行的时候会报“int ...
- Win7---------专区
待完善中-------------------------------------- 1.0Win7来历: 不算上最早的Windows版本从 95 98 2000 ME XP 2003 Vis ...
- ecshop 导出exl表格
// 导出订单 if(isset($_POST['export'])){ // 统计金额 $sl = "SELECT SUM(goods_amount) as total from" ...
- php多进程总结
本文部分来自网络参考,部分自己总结,由于一直保存在笔记中,并没有记录参考文章地址,如有侵权请通知删除.最近快被业务整疯了,这个等抽时间还需要好好的整理一番. 多进程--fork 场景:日常任务中, ...
- 获取页面内iframe里面的元素
结构直接看图比较直接 这里window.frames获取的是iframe的数组 要记得给iframe加个ID才行 后面的记录会详细讲解 在父窗口获取页面内的iframe 里面的元素window.fra ...