《JavaScript高级程序设计》Chapter 15 canvas + Chapter 16 HTML5

  • Chapter 15 Canvas
  • Chapter 16 HTML5

Chapter 15 Canvas

  • <canvas>元素:设定区域。JS动态在这个区域中绘制图形。
  • 苹果公司引导的。由几组API构成。
  • 2D上下文普及了。WebGL(3D上下文)还未足够普及。

基本用法

  • 首先:width、height属性确定绘图区域大小。后备信息放在开始和结束标签之间。
  • getContext():DOM获得这个canvas元素对象。再在这个对象上调用getContext()获取上下文,传入参数表示获取的是2d上下文还是WebGL上下文。
  • toDataURL()方法,获取绘图区域中的图形对应的URL。注意,若canvas画布“不干净”,即来自不同的域,这个方法会报错。

2D上下文

  • 绘制简单的2D图形。
  • 坐标原点在canvas元素的左上角,原点坐标(0,0)
  • 填充和描边:fillStyle和strokeStyle属性。
    • 描边宽度由lineWidth属性控制。
    • lineCap属性控制线条末端的形状
    • lineJoin属性控制线条相交的方式。
  • 绘制矩形:fillRect(),strokeRect()方法,clearRect()方法。4个参数:矩形的x,y坐标,矩形的宽度和高度。
  • 绘制路径:
    • 开始:beginPath()
    • 一系列绘制方法
    • 结束:closePath()/fill()/stroke()/clip()
    • 是否在路径上:isPointInPath()
  • 绘制文本:
    • fillText()/strokeText():4个属性:字符串、x、y坐标、可选的最大像素宽度
    • 3个属性:font、textAlign、textBaseline
    • 辅助确定文本大小:measureText()方法,返回TextMetrics对象,只有width属性。
  • 变换:
    • 例如rotate(angle)/scale()/translate()/transform()/setTransform
    • 记录状态:save()
    • 返回上一个状态:restore()
    • 记录和返回都是以栈结构的方式,可以一级级进入或者返回。
    • 记录和返回只作用于状态或者设置。
  • 绘制图像(对<img>或者<canvas>图像进行处理)
    • drawImage():多种控制方式
  • 阴影
  • 渐变:
    • createLinerGradient()/createRadiaGradient() ,addColorStop()
    • 注意坐标匹配。
  • 模式(重复的图像)createPattern()
  • 使用图像数据(获取rgba)
    • getImageData()获取原始图像数据,返回ImageData对象的实例。
    • 上述对象拥有width、height、data属性。
    • data属性是数组,每四位表示一个像素的数据,对应rgba
    • 可以依次设置灰阶过滤器或者其他过滤器。
    • putImageData()将图像数据绘制到画布上。
  • 合成:
    • globalAlpha属性:通用透明度
    • globalCompositionOperation属性:合成方式。存在浏览器差异。

WebGL

  • 类型化数组:视图--类型化视图。是WebGL项目的基础。
  • 上下文:pdf P488-497

Chapter 16 HTML5 脚本编程

  • HTML5增加了新标签,同时也花一定篇幅规定了一些JS的API,以简化复杂的操作。本章介绍了跨文档信息传递,拖放API,音频及视频,历史状态管理等一些操作。

跨文档消息传递(cross-document messaging:XDM)

  • 利用postMessage()进行消息传递,postMessage()方法不仅可以在这里使用,功能就是“向另一个地方传送数据”。而XDM中,“另一个地方”指另一个域,一般将消息传给当前页面的<iframe>元素或者由当前页面弹出的窗口。
  • 以当前页面的<iframe>元素包含另一个域为例:
  • 当前页面需要做的:
    • postMessage()传入两个参数:待传入的消息和消息的来源域---这就意味着实际上需要获得“另一个域”的window对象(代理)以在其上使用这个方法。见下个步骤。
    • 可以通过document.getElementById("myframe").contentWindow;即contentWindow属性获取目标域的window对象或者代理。调用该方法即可传入数据。
    • data不一定需要是字符串,但非字符串的情况在不同浏览器之间存在差异。可以利用JSON.stringify()/JSON.parse()处理字符串。
    • 这种方法可以确保安全性,毕竟第二个参数是已知地址。
  • <iframe>中的域需要做的:
    • 会激发message事件。onmessage处理程序的事件对象event有三个重要属性。
    • event的三个属性:data、origin、source
    • 可以在确保origin(来源所在域)符合条件的情况下,处理data,再通过source(指向来源的window对象的代理)向来源发送消息,即调用:event.source.postMessage().
    • 由于source只是可代理,所以能访问的属性和方法有限。建议只是用postMessage()方法。
  • 注意到postMessage()方法是在待向其传送消息的域的代理对象上调用的

原生拖放

  • 注意到,HTML5提供了一些JS的API,向程序员暴露可以使用的属性或者方法,它本身更多的是规定浏览器在这些方法或者属性(或者事件)响应的时候提供一些怎样的显示效果。
  • 拖放一般考虑3个阶段:被拖放的对象、拖放过程、放置的目标对象。
  • 对应一些拖放事件:对于被拖放的对象,有dragstart/drag/dragend;对于放置的目标对象,有dragenter/dragover/dragleave或drop。很好理解。
  • 自定义放置目标:针对有些元素默认是不允许作为放置目标的情况,由于默认是不允许,所以可以在dragenter和dragover中重写默认行为,即阻止默认行为的发生。以此来自定义放置目标。
  • dataTransfer对象,为了在拖放操作时实现数据交换,是event的属性,用于从被拖放的元素向放置目标元素传递字符串格式的数据。
    • setData()/getData()方法:设置和获取数据。getData()在drop事件中处理。注意在跨浏览器处理setData()的时候注意对短数据类型和MIME类型的处理。
    • dropEffect/effectAllowed:两者配合,可以确定被拖放的元素能够执行哪种放置行为(而浏览器会对应给出显示的效果)。dropEffect在ondragenter事件处理程序中针对放置目标进行设置。而effectAllowed属性在ondragstart中针对被拖放的目标进行设置。
    • 其他成员:addElement()/clearData()/setDragImage()/types等
  • draggable属性:HTML5中的全局属性,规定元素是否可以被拖动。

媒体元素

  • 针对HTML5中的<audio>和<video>元素。这两个元素的产生可以让我们减少使用FLASH插件等,更方便实现跨浏览器操作。
  • 元素本身就拥有一些属性,且可以进行多个MIME类型和编解码器的选择。
  • JS又规定了他俩的一些更加具体和详细的属性和事件,以减轻实现一些操作的繁琐的程序编写过程。
  • 可以依赖play()或pause()实现自定义的媒体播放器,这只是代码编写的逻辑问题,比较简单。
  • JS提供canPlayType()来检测编解码器的支持情况
    • 注意到可能性probably>maybe>空值
    • 所以传入MIME类型和编解码器的可能性大于只传入MIME类型的。很好理解。
  • JS有原生的Audio构造函数,可以穿件audio实例并进行一些操作。

历史状态管理

  • 针对“后退”和“前进”按钮失去作用,使得用户难以在不同的状态(页面状态)间进行切换。可以使用之前(13章)提到过的haschange事件监测状态的变化,以执行某些处理;或者使用HTML5中的历史状态管理API进行操作。
  • haschange事件:URL参数列表(包括#后的所有字符串)发生变动的时候触发,主要用在Ajax中,用URL参数数列来保存状态或者导航信息。属性oldURL、newURL可以实现location.hash的功能。一般使用后者,因为支持oldURL和newURL的浏览器不多
  • 状态管理API同样可以在不加载新页面的情况下改变浏览器的状态:history.pushState(),传入3个参数:状态对象,新状态标题和可选的URL,注意第二个参数至今不支持,所以可以写入空字符串,而第一个信息最好详尽的记录状态对象各方面的信息,以便随后只用。
  • 在执行完这个方法后,新的状态信息会被加入历史状态栈。并且不会真正的向服务器发送请求。
  • popstate事件:由于上述方法改变了历史栈,“后退”按钮可用了。在点击后退按钮的时候,触发popstate事件,其事件对象event包含pushState()第一个参数所指的状态对象(这就是为什么上面要求信息详尽的原因了)。注意到,浏览器加载第一个状态(页面)的时候,这个对象为null。
  • replaceState():传入参数与pushState()的一样,然而不会在历史状态栈中创建新状态,指挥重写当前状态。
  • 注意pushState()的第三个参数务必是实际的URL,不然刷新的时候会导致404错误。
时间: 2024-10-07 06:08:40

《JavaScript高级程序设计》Chapter 15 canvas + Chapter 16 HTML5的相关文章

JavaScript高级程序设计16.pdf

第8章 BOM BOM的核心对象就是window,它表示浏览器的一个实例,在浏览器中window对象有双重角色,它既是JavaScript访问浏览器的一个接口,又是规定的Global对象,因此所有在全局作用域中声明变量.函数都会是window对象的属性和方法 定义全局变量与在window对象上直接定义属性的差别是全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以尝试访问未声明的变量会抛出错误,但通过查询window对象,可以知道某个可能未声明的变量是否存在 如果页面

JavaScript高级程序设计15.pdf

组合继承的问题是会调用2次超类型构造函数 寄生组合式继承 即通过借用构造函数来继承属性,通过原型链的形式来继承方法,思路:不必为了指定子类型的原型而调用超类型的原型,我们所需要的无非是超类型原型的一个副本而已 function inheritPrototype(subType,superType){ var prototype=object(subType.prototype); //创建对象 prototype.constructor=subType; //增强对象 subType.proto

JavaScript高级程序设计58.pdf

15章 使用Canvas绘图 略 16章 HTML5脚本编程 HTML5规范了新的HTML标记和JavaScript API,以便简化创建动态Web界面的工作 跨文档消息传递 简称XDM,指来自不同域的页面间传递消息(比如www.wrox.com域中页面与p2p.wrox.com) XDM的核心是postMessage()方法,目的是向另一个地方传递信息,“另一个地方”指的是包含在当前页面中的<iframe>元素或者当前页面弹出的窗口 postMessage()方法接收2个参数:一条消息和一个

《JavaScript 高级程序设计》

因为曾经在高中买来<C Primer Plus>和大学买来的<Clean Code>(挑战自己买的英文版的结果就啃了一点)给我一种经典的书都特别厚的一本就够读大半年的感觉.加上刚上大学图便宜买的有关做网站的旧书(应该是 Table 布局和 Dreamweaver 比较火的时代的书,这些书倒是很薄)让我一度认为做网页不就是 table 然后 tr.td 什么的套呗,高大上点不就是 div+CSS 嘛有什么大不了,给我设计好什么网页不都 ok 能做出来么?这种感觉.然后看网络课程,在网

JavaScript高级程序设计(第3版) 中文pdf扫描版 89M 高清下载

<JavaScript高级程序设计(第3版)>是JavaScript超级畅销书的最新版.ECMAScript5和HTML5在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为JavaScript增添了很多适应未来发展的新特性. <JavaScript高级程序设计>这一版除增加5章全新内容外,其他章节也有较大幅度的增补和修订,新内容篇幅约占三分之一. 全书从JavaScript语言实现的各个组成部分——语言核心.DOM.BOM.事件模型讲起,深入浅出地探讨了面向对象

JavaScript高级程序设计学习笔记--基本概念

1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; //有效的语句--推荐 虽然语句结尾的分号不是必需的,但我们建议任何时候都不要省略它.两个原因:1.加上分号可以避免很多错误 2.加上分号也会在某些情况下增进代码的性能,因为这样解析器就不必再花时间 推测应该在哪里插入分号了. 2.变量 var message="hi"; 像这样初始化变量

《JavaScript高级程序设计》学习笔记(4)——引用类型

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法.对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象.构造函数

JavaScript高级程序设计(读书笔记)(五)

本笔记汇总了作者认为"JavaScript高级程序设计"这本书的前七章知识重点,仅供参考. 第五章 引用类型 小结: 对象在JavaScript中被称为引用类型的值,而且有一些内置的引用类型可以用来创建特定的对象,现简要总结如下: 引用类型与传统面向对象程序设计中的类相似,但实现不同: Object是一个基础类型,其他所有类型都从Object继承了基本的行为: Array类型是一组值得有序列表,同时还提供了操作和转换这些值的功能: Date类型提供了有关日期和时间的信息,包括当前日期和

赠书《JavaScript高级程序设计(第三版)》5本

本站微博上正在送书<JavaScript高级程序设计>走过路过的不要错过,参与方式,关注本站及简寻网+转发微博:http://weibo.com/1748018491/DoCtp6B8r 本站联合简寻网#寻找千里码# 正在送书<javascript高级程序设计>第三版 5本,对这本书期待的朋友可以去参与哦. 关于简寻网: 我们是一群年轻的创业者,我们关注互联网发展,追逐技术的进步.互联网时代的到来,我们希望能通过技术的手段解决生活中的问题.招聘行业是一个传统而又新兴的行业,传统的流