美文网首页
《javascript DOM编程艺术》笔记

《javascript DOM编程艺术》笔记

作者: 小飞牛牛 | 来源:发表于2021-06-11 23:34 被阅读0次

原本以为这本书会讲很多没接触过的底层东西,然而它只能算是一本前端的入门书籍,花了两天时间就浏览完了。书中阐述脱离框架去用javascript操作DOM的步骤。虽然简单,但是当你遇到问题时,也许正是因为了解这些基本的东西才有助于解决问题。

以下为各章提要或体会:

1 javascript历史

我们看一门技术形成的历史,好像与技术应用无关,却又极为重要。了解历史,会更懂得一门技术的最初形态,以及变化的阶段。比如dom技术,了解了之后,你就会明白为什么浏览器会有这么多兼容性问题。为什么IE浏览器这么与众不同。

2 javascript语法

javascript是一种解释型语言,解释型语言与编译型语言最大的差别是,解释型的语言代码中的错误只有在解释器执行时才能被发现。

本章提到的javascript较为简单。但仍可以找到一些有趣的少用的知识点,例如关联数组

var arr=[]
arr['a'] = 'aa'
arr['b'] = 'bb'
arr[0] = 'ccc'

arr.a和arr.b事实上是给数组对象增加了属性。arr.a和arr.b 并不算在数组长度里,它的长度是1

3 DOM

DOM

D ,document 文档
O, Object 对象,对象包括,用户自定义对象,内建对象,宿主对象
M,Model 模型

值得注意的是属性节点。属性写在标签上,但在DOM树中,它被当做一个节点。

4javascript图片库

本章提到几个节点的属性:nodeType, 它是一个数字
元素节点是 1
属性节点是 2
文本节点是 3

几个常用属性:
childNodes
firstChild
lastChild

5 最佳实践

本章提到了如何提高javascript性能的问题。用了flash的发展史进行了类比。由于早期我也从事过flash的开发,深有体会。flash 网站通常首页加载很慢,这是个硬伤,现在大部分的使用场景也逐渐被其它技术取代了。

作者认为,产生的问题是由于使用者滥用javascript的缘故,作者更强调浏览器的用户体验。另外,对于禁用javascript的浏览器,要考虑平稳退化的问题。现在的网站,把javascript关掉的情况虽然很少,但是如果真遇到这样的情况,书中还是给了一些解决方案的。

window.open(winURL, "popup", "width=320, height=400")

文中通过打开一个新窗口演示了javascript和html分离的过程
onclick和 javascript: 伪协议都没有做到分离

通过javascript 读取节点,把事件加到节点上才是实现分离的方法

6 图片库的改进

onclick同时会触发onkeypress ,也就是键盘事件

7 动态创建标记

改变文档的几个方法:

document.write

innerHTML

document.createElement

createTextNode

常用的添加子元素的方法:

appendChild

insertBefore

nextSibling 下一个兄弟元素

Ajax

Ajax核心依赖对象XMLHttpRequest. 早期IE浏览器的ajax对象并不是它,而是用ActiveXObject对象实现的。

XMLHttpRequest对象的方法主要有open和onreadystatechange, send, 在onreadystatechange函数内容部, request.readyState 为 4 时,就从request.responseText中取值

执行open,定义完onreadystatechange 之后,要调用send方法发送消息

readyState 的状态码

0未初始化
1 正在加载
2加载完毕
3正在交互
4完成

示例

<body>
    <div>
        <div id="desc">lllllll</div>
        <button  onclick="btn()">button</button>
    </div>

    <script>
        function btn() {
            var desc = document.getElementById('desc')
            var request = new XMLHttpRequest()
            request.open('GET', '/m.txt', true)
            request.onreadystatechange = function() {
                if(request.readyState == 4) {
                    desc.childNodes[0].nodeValue = request.responseText
                }
            }
            request.send(null)
        }
    </script>
</body>

8 充实文档的内容

accesskey属性可用来定义节点相关的快捷键,如下,按alt+2相当于点击了button

 <button  onclick="btn()" accesskey="2">button</button>

9css-DOM

网页的信息可以分为三层:
1 结构层,即标签
2 表示层,样式
3 行为层,javascript交互

本章提到element.style 其实是一个对象(CSSStyleDeclaration),你可以这样赋值

desc.style.height = '300px'

然而你这样赋值也是可以的

desc.style = 'height:300px;color:red;'

它内部在获取值时应该是进行了转换。用字符串赋值给style会覆盖掉标签上定义的style

事实上,当你这样赋值时,它会在对象内部用下标记录你设置了哪些值

 <div id="desc" style="width:100px;">lllllll</div>
 <script>
  desc.style.color = 'red'
 desc.style.height = '300px'
 </script>

CSSStyleDeclaration 打印结果

{
    0: "width"
    1: "color"
    2: "height"
    ...
    width: "100px"
    height: "300px"
    color: "red"
    ...
}

"无论你何时发现你可以对某个函数进行抽象,你都应该马上去做。"

使用javascript处理样式的情况大概有两种:

1.用css无法找到要处理的元素
2.css寻找元素的办法还未得到广泛支持
3.需要定时重复执行以下改变样式的操作

10 javascript实现动画

可以给节点element增加自定义的属性,用来记录setTimeout返回的id, 这是较少用的方法,但会使逻辑更清晰。

11 HTML5

其实html5就是把原本javascript的一些行为内置到了标签里,并且给某些标签增加了javascript的API

html5增加了 <section>, <article>,<header>,<footer>等标签,还有多媒体元素,例如<canvas>,<audio>,<video>

值得注意的是很多新元素带有自己的javascript 和DOM API。

javascript也包含了更多的模块, Ceolocation, Storage, Drag-and-Drop,Socket,多线程等。

Modernizr 是一个javascript库,可用于低版本的浏览器做html5的兼容

canvas

举了一个图片处理的例子

var ctx = canvas.getContent('2d');
ctx.drawImage(img,0,0);
var c = ctx.getImageData(0,0,img.width,img.height);
// c.data中有每个像素的红绿蓝彩色值。改变后将对象设置回image中
for(i=0;i<c.height;i++) {
    for(j=0;j<c.width;j++) {
        var x=(i*4)*c.width + (j*4);
        var r=c.data[x];
        var g=c.data[x+1];
        var b=c.data[x+2];
        c.data[x]=c.data[x+1]=c.data[x+2]=(r+g+b)/3;
    }
}
ctx.putImageData(c,0,0,0,0,c.width,c.height)
return canvas.toDataURL();
video

为什么video 需要写多个source?

<video>
 <source src="movie.mp4"/>
 <source src="movie.webm"/>
 <source src="movie.ogv"/>
</video>

由于不同的浏览器支持不同的编解码器。没有一款浏览器支持所有的。

与video相关的DOM属性

currentTime,返回当前播放的位置,以秒表示;
duration,返回媒体的总时长,以秒表示,对于流媒体,返回无穷大;
paused,表示媒体是否处于暂停状态.
loadeddata,在媒体可以从当前播放位置开始播放时发生。
ended,在媒体已播放完成而停止时发生。

文中给出了示例如何重写video的样式,做法就是删除自带的控件controls ,然后增加一个自己写的div或button,通过给button 添加事件来控制video的播放。

表单

input的类型增加了
email,url,date,number,range,search,tel,color

有些类型在PC浏览器中看不出变化,但是放到手机端就能看到,比如设成tel,点击会自动弹出数字键盘。

其它属性

autocomplete,用于为文本输入框添加一组建议的输入项
autofocus,用于让表单元素自动获得焦点
form,用于对<form>标签外部的表单元素分组
min、max和step,用在范围(range)和数值(number)输入框中
pattern,用于定义一个正则表达式,以便验证输入的值
placeholder,用于在文本输入框中显示临时性的提示信息
required, 表示必填

12综合示例

将前面的内容综合起来给出了一个示例。
示例内容。里面阐述了如何用ajax取代form表单提交改善用户体验。

javascript库

jquery

prototype

YUI

Dojo

MooTools

添加到头部,如果没有引入jQuery,添加一个script标签

    <script>
        !window.jQuery && document.write(unescape('%3Cscript src="scripts/jquery-1.4.3.min.js"%3E%3C/script%3E'))
    </script>

相关文章

网友评论

      本文标题:《javascript DOM编程艺术》笔记

      本文链接:https://www.haomeiwen.com/subject/fkvveltx.html