编写分离式(unobstrusive)代码意味着对HTML内容的完全分离:数据来自服务器端,javascript代码用来动态化和交互。这种分离的好处是在不同浏览器之间使用是可以完全降级或升级运行,对于高级特性浏览器提供更丰富的交互,不支持高级特性的浏览器可以降级运行其所支持的部分。

一、DOM

DOM是表达XML文档的应用最广泛的方式,虽然可能未必是最快或者最轻量级和最易使用的,但是大部分web开发语言都提供了其实现。javascript最终的操作都是和网页里的HTML元素进行交互,而HTML是XML的一个子集,因此DOM是简化操作的出色工具,是开发分离式javascript代码的第一步,无非就是提供了以下几个简化的操作:获取或修改特定HTML元素、对元素的属性进行修改、绑定事件及编写处理函数。

1、概念

DOM(文档对象模型)是W3C制定的一个表达XML文档的标准,可以把XML的DOM表达方式看做一棵导航树,一切术语都与家谱术语类似(parent、child、sibling)。节点包含了nodeType、nodeValue、nodeName,每个节点有都包含指向父节点、子节点、相邻兄弟节点的指针。

2、处理空格

使用while循环查找是否为空的节点,并测试节点类型nodeType是否为1、2、3等,否则就删除继续查找下一个节点。

3.、获取和查找元素

getElementById("id"):从所有元素中查找属性ID为id的元素,速度很快,定位准确,但是不能出现ID同名的元素。
getElementByTagName("tag"):运行于任何元素下,找出标签名称为tag的节点列表Nodelist,类似于数组,但是不支持push、pop、shift等javascript数组操作方法。
innerHTML:用来设置或获取元素类的html,短小的代码使用这个特性很快捷,但是会有一些浏览器不同的bug,IE中返回的都是大写的元素字符,基于Mozilla的浏览器不会返回<style>元素等。
innerText:方便获取元素下的所有文本类容,但是在由于在一些流行的浏览器不兼容,因此有如下的替代方法
function text(e){
var t = "";
e = e.childNodes || e;
for (var j = 0; j < e.length; j++){
t += e[j].nodeType != 1 ?
e[j].nodeValue : text(e[j].childNodes);
return t;
}
}

className:使用类名查找元素,这是jquery提供的强大的选择器,同时也有css选择器,公开库有cssQuery。

XPath:这是一种强大的纯粹的XML定位方式,W3C的标准,DOM的实现也是肯定基于XPath,与CSS选择器相比表达式相对冗长,当时功能更加强大。

4、等待HTML DOM加载

浏览器渲染和操作的顺序如下:
html解析完毕 ——>  外部脚本和样式表加载  ——>  脚本在文档内解析并执行  ——>   HTML DOM完全构造起来 ——>  图片和外部内容加载  ——> 网页加载完成
网页头部的外部文件加载后会在HTML真正构造起来之前执行,这对于某些重要的情形是不能满足要求的。补救如下:
  • 等待整个页面加载:window.onload事件绑定一个函数在页面完全加载后触发。
  • 等待大部分DOM加载:行内的脚步在DOM构造后就可以立即执行,执行到该位置上的脚步才真正执行,也就是在页面中途嵌入的行内脚步只能访问该位置之前的DOM。因此可以在body结尾标签之前才执行脚本。
  • 判断DOM合适加载完毕:监听DOM加载状态,是最有效的但是也是实现起来最复杂的。可以绑定windows事件那样简单又能获得行内脚步执行那样的速度。检查DOM元素和方法是否存在:检查要点document、document.getElementById等函数、document.body等或其他特定元素。

二、事件

事件是把所有东西粘在一起的胶水,DOM和javascript事件的结合是现代web应用程序的根基。主要有以下几种类型事件:

  • 鼠标事件:追踪鼠标定位、点击事件
  • 键盘事件:追踪键盘敲击和上下文
  • UI事件:页面的某一方面是否覆盖了另一方面
  • 表单事件:表单输入元素上
  • 加载和错误事件:监听自身加载状态
javascript目前不存在线程,完全是异步。代码的运行由其他动作触发,绑定好一个回调函数到特定事件即可。最近的就是模拟线程的就是使用setInterval加递归模拟。事件处理的阶段包括从body元素向下到发生事件的元素的捕获阶段和从发生事件的元素到最外层元素的冒泡阶段,组织冒泡可以为负责的程序提供益处,同时取消浏览器的默认行为会在需要处理的95%的情况中有效,不同的浏览器处理不同,因此是分离式DOM脚本编程的重要部分。
  • 传统绑定:对象.事件 = function (){....}  有点事简单和稳定,不同浏览器运作一致,this关键字引用当前元素。缺点是旨在事件冒泡中允许,而非捕获和冒泡,同时一个元素一次只能绑定一个事件处理函数
  • DOM绑定:W3C提供的标准是addEventListener函数,提供三个参数:事件名称、处理函数、启用禁用事件捕获的布尔标记。优点是支持设置捕获和冒泡阶段,this指向当前元素,事件对象总是可以通过处理函数的第一个参数获取,同时可以为一个元素绑定多个事件而不会覆盖先前绑定的事件。
  • IE绑定:可以绑定多个事件,但是仅支持冒泡阶段,this指向了window对象,不是当前元素,事件对象仅存在window.event参数中。同时必须以on+事件名的方式,仅IE可用。

三、javascript与CSS

在DOM和事件的交互基础上产生了DHTML,实质是javascript与DOM元素上的CSS属性之间的交互。

上述所有问题的讨论都是为了实现分离式脚本编程以适应不同浏览器而做到预留退路。首先应用程序的所有功能都要检查(if(document && document.getElementById)),其次是使用DOM遍历查找的通用方法来快速访问文档中的元素,最后是使用DOM和attachEvent/addEvenetListener函数为元素添加事件处理函数,<a href="#" onclick="dosth()...">...</a>这样的代码是非常不好的。

  • javascript禁用:如果禁用了javascript,所有的页面都要能工作,最明显的就是a链接的href属性和onclick事件。
  • 链接不依赖javascript:所有的链接都不应该有破坏性,通过链接可以删除、编辑或者修改任何用户数据的话都应该用表单实现。
  • 监听css合适禁用
  • 事件的亲和力:确保事件在不适用鼠标的情况下依然具备亲和力,可以对每个人都有好处。

javascript进阶——分离式DOM脚本编程的更多相关文章

  1. javascript学习 真正理解DOM脚本编程技术背后的思路和原则

    本文学习来源于<javascriptDOM编程艺术>仅作笔记 学会怎样才能利用DOM脚本编程技术以一种既方便自己更体贴用户的方式去充实和完善你们的网页. 循序渐进:从最核心的内容开始,逐步 ...

  2. JavaScript进阶内容——DOM详解

    JavaScript进阶内容--DOM详解 当我们已经熟练掌握JavaScript的语法之后,我们就该进入更深层次的学习了 首先我们思考一下:JavaScript是用来做什么的? JavaScript ...

  3. JavaScript进阶之DOM

    文档对象模型DOM 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最 ...

  4. 关于dom脚本编程的一些优秀理念总结

    1.平稳退化(优雅降级) 目的:当浏览器不支持js或者js被用户禁用时,做到即使不运行js,网页的可读性亦不会受到太大的影响. 理念:使用最新的技术面向高级浏览器构建最强的功能及用户体验,然后针对低级 ...

  5. 慕课网javascript 进阶篇 第九章 编程练习

    把平常撸的码来博客上再撸一遍既可以加深理解,又可以理清思维.还是很纯很纯的小白,各位看官老爷们,不要嫌弃.最近都是晚睡,昨晚也不例外,两点多睡的.故,八点起来的人不是很舒服,脑袋有点晕呼呼,鉴于昨晚看 ...

  6. JavaScript进阶 - 第10章 编程挑战

    10-1 编程挑战 现在利用之前我们学过的JavaScript知识,实现选项卡切换的效果. 效果图:

  7. 二、JavaScript语言--JS基础--JavaScript进阶篇--DOM对象 控制HTML元素

    1.认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面 ...

  8. Javascript进阶篇——(DOM—节点---获取浏览器窗口可视区域大小+获取网页尺寸)—笔记整理

    浏览器窗口可视区域大小获得浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条)的方法:一.对于IE9+.Chrome.Firefox.Opera 以及 Safari: • window.innerH ...

  9. Javascript进阶篇——(DOM—节点---插入、删除和替换元素、创建元素、创建文本节点)—笔记整理

    插入节点appendChild()在指定节点的最后一个子节点列表之后添加一个新的子节点.语法: appendChild(newnode) //参数: //newnode:指定追加的节点. 为ul添加一 ...

随机推荐

  1. Java对数组的操作(二)——集合与数组的切换

    在Java开发中经常遇见集合与数组的互相切换,怎样实现呢,呵呵呵,非常easy: import java.util.ArrayList; import java.util.Arrays;       ...

  2. android学习日记22--Animation动画简介

    Animation动画主要有两种:帧动画(Frame Animation)和补间动画(Tween Animation).补间动画主要包括对位置.角度.尺寸等属性的变化,而帧动画则是通过若干帧图片轮流切 ...

  3. Java ServletContext 详解

    ServletContext, 是一个全局的储存信息的 空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而 servletContex ...

  4. php面试常用算法

    这些都是真实的IT公司招聘PHP程序员的面试题,这些都是简单的基本算法.包括:冒泡算法.快速排序算法.二分查找算法.顺序算法. 冒泡排序,对象可以是一个数组 01 function bubble_so ...

  5. sqlite数据下载链接地址

    链接: http://pan.baidu.com/s/1pJN1abT 密码: yjg5

  6. SurfaceView的使用

    1.概念 SurfaceView是View类的子类,可以直接从内存或者DMA等硬件接口取得图像数据,是个非常重要的绘图视图.它的特性是:可以在主线程之外的 线程中向屏幕绘图上.这样可以避免画图任务繁重 ...

  7. AppUse学习笔记

    AppUse学习笔记http://www.docin.com/p-786350740.html

  8. WebSocket实时异步通信

    WebSocket实时异步通信 [一]WebSocket简介 WebSocket是HTML5推出一个协议规范,用来B/S模式中服务器端和客户端之间进行实时异步通信. 众所周知,传统的HTTP协议中,服 ...

  9. linux 软件安装各种方法

    一   简单介绍 1.软件安装卸载,分几种情况: A:RPM包 这种软件包就像windows的EXE安装文件一样,各种文件已经编译好,并打了包,哪个文件该放到哪个文件夹,都指定好了,安装非常方便,在图 ...

  10. JFace中的表格型树TableTreeViewer

    表格型树是用TableTreeViewer来实现,自从SWT下的TableTree被废弃之后,其扩展TableTreeViewer也成了鸡肋,不再被建议使用,既然Tree可以实现表格型树,那么其扩展T ...