javascript进阶——分离式DOM脚本编程

时间:2023-02-19 16:36:11

编写分离式(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

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

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

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

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

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

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

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

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

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

  7. Javascript进阶篇——&lpar;DOM—节点---获取浏览器窗口可视区域大小&plus;获取网页尺寸&rpar;—笔记整理

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

  8. Javascript进阶篇——&lpar;DOM—节点---插入、删除和替换元素、创建元素、创建文本节点&rpar;—笔记整理

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

  9. Javascript进阶篇——&lpar;DOM—节点---属性、访问节点&rpar;—笔记整理

    节点属性在文档对象模型 (DOM) 中,每个节点都是一个对象.DOM 节点有三个重要的属性 : 1. nodeName : 节点的名称 2. nodeValue :节点的值 3. nodeType : ...

随机推荐

  1. php判断str是否是xml格式

    function xml_parser($str){ $xml_parser = xml_parser_create(); if(!xml_parse($xml_parser,$str,true)){ ...

  2. JDBC中连接MySQL数据库

    package qddx.JDBC; import java.sql.*; public class JDBC_Connection { static String driverName = &quo ...

  3. 组合方法&lpar;ensemble method&rpar; 与adaboost提升方法

    组合方法: 我们分类中用到非常多经典分类算法如:SVM.logistic 等,我们非常自然的想到一个方法.我们是否可以整合多个算法优势到解决某一个特定分类问题中去,答案是肯定的! 通过聚合多个分类器的 ...

  4. windows 下的命令行工具。。

    1.powershell window自带..右下角搜索..powershell 2.conemu https://code.google.com/p/conemu-maximus5/wiki/Dow ...

  5. SQL Server 日期 时间类型

    --1毫秒=0.001秒 --1微秒=0.000 001秒 --1纳秒=0.000 000 001秒 --datetime精度不大好,末尾值只能是这3种: .000, .003, or .007 -- ...

  6. java 中的set方法和get方法的理解

    get的意思是获取,set的意思是设置. get方法和set方法是实现类的封装访问的很好的工具. 当类中的变量设为private 时,他的意思就是说,只能通过自身和子类的访问,但是对于别的其他的类来说 ...

  7. Chapter 2 Open Book——21

    I kept my head down and glanced up under my lashes. 我一直保持低着头并且在睫毛之下瞟了一眼. None of them were looking t ...

  8. 第一次使用eclipse出现的问题

    最近开始学习java,在一系列操作下安装好了eclipse后,按照书上的问题写了一个小程序 问题: 用户从键盘只能输入整数,程序输出这些整数的乘积. 看到这个问题后就感觉和c语言蛮像的,首先去ecli ...

  9. 关于CentOS7下docker-ce无法删除镜像的问题

    未完待续.... 从旧版的docker删除后安装了新版的docker-ce 发现之前镜像无法删除,并且重新pull不能覆盖,会出现两个一模一样的镜像. [root@localhost ~]# dock ...

  10. ASP&period;NET MVC5高级编程 之 路由

    每个ASP.NET MVC应用程序都需要路由来定义自己处理请求的方式.路由是MVC应用程序的入口点.路由的核心工作是将一个请求映射到一个操作 路由主要有两种用途: 匹配传入的请求(该请求不匹配服务器文 ...