js高级程序设计笔记11--HTML5脚本编程

本文档介绍了HTML5中的脚本编程特性,包括跨文档消息传递的安全机制,详细讲解了postMessage()方法及其相关事件处理。此外,还深入探讨了原生拖放功能,包括拖放事件流程、自定义放置目标以及dataTransfer对象的使用。同时,提到了媒体元素的控制和历史状态管理,展示了如何创建自定义媒体播放器和检测编码器支持情况。
摘要由CSDN通过智能技术生成

跨文档消息传递

指的是来自不同域的页面间传递消息。
postMessage():2个参数,一条消息和一个表示消息接收方来自哪个域的字符串。第二个参数是保障通信安全。

var iframeWindow = document.getElementById('myframe').contentWindow;
iframeWindow.postMessage("a secret","http://www.wrox.com");//向内嵌框架发送一条消息

如果框架中的文档不是来源于指定的域则postMessage()什么也不做。接收到XDM消息时,会触发window对象的message事件。传递给onmessage处理程序的事件对象有3个属性:
1. data:postMessage()的第一个参数,即发送的消息。
2. origin:发送消息的文档所在的域。
3. source:发送消息的文档的window对象的代理。不能通过此对象访问window对象的其他任何信息。

EventUitl.addHandler(window,"message",function(event)){
    if(event.origin == "http://www.wrox.com"){
        processMessage(event.data);
        event.source.postMessage("received","http://p2p.wrox.com");
    }
}

原生拖放

拖放事件

拖动某元素时,将依次触发下列事件:
1. dragstart
2. drag
3. dragend
当某个元素被拖动到一个有效的放置目标上时,下列事件会依次发生:
1. dragenter
2. dragover
3. dragleave或drop

自定义放置目标

可以把任何元素变成有效的放置目标。方法是重写dragenter和dragover事件的默认行为。

EventUitl.addHandler(droptarget,"dragover",function(event)){
    EventUtil.preventDefault(event);
}
EventUitl.addHandler(droptarget,"dragenter",function(event)){
    EventUtil.preventDefault(event);
}

在Firefox3.5+中,放置事件的默认行为是打开被放到放置目标上的URL。因此如果是把文本拖放到放置目标上,则会导致无效URL错误。因此要取消drop事件的默认行为。阻止它打开URL。

EventUitl.addHandler(droptarget,"drop",function(event)){
    EventUtil.preventDefault(event);
}

dataTransfer对象

它是事件对象的一个属性,用于从被拖动元素向放置目标传递字符串格式的数据。
有两个主要方法:
getData():传入一个参数,表示要保存的数据类型。IE只定义了“text”和”URL“两种有效的数据类型。HTML5则允许各种MIME类型。
setData():2个参数,第一个参数为

event.dataTransfer.setData("text","some text");
var text = event.dataTransfer.getData("text");
event.dataTransfer.setData("URL","http://www.wrox.com");
var url = event.dataTransfer.getData("URL");

在拖动元素时浏览器会自动调用setData()方法把对应的数据保存在dataTransfer对象中,这些元素被放置在目标上时就可以通过getData()方法读到这些数据。
注:Firefox在其第5个版本之前不能正确的将“url”和”text”映射为”text/uri-list”和“text/plain”,但能把”Text”映射为”text/plain”。

var url = dataTransfer.getData("url") || dataTransfer.getData("text/uri-list");
var text = dataTransfer.getData("Text");

dropEffect与effectAllowed

dataTransfer对象还有两个属性:dropEffect与effectAllowed。
dropEffect可以知道被拖动的元素能够执行哪种放置行为。有以下取值:

“none”:不能把拖动的元素放在这里。这是除文本框之外所有元素的默认值。
“move”:应该把拖动的元素移动到放置目标。
“copy”:应该把拖动的元素复制到放置目标。
“link”:表示放置目标会打开拖动的元素。

要使用dropEffect属性,必须在ondragenter事件中针对放置目标来设置他。并且它只有搭配effectAllowed属性才有用。
effectAllowed属性表示允许拖动元素的哪种dropEffect。取值:

uninitialized:没有给拖动元素设置任何放置行为。
none:被拖动的元素不能有任何的行为。
copy:只允许值为copy的dropEffect.
link:只允许值为link的dropEffect.
move:只允许值为move的dropEffect.
copyLink:
copyMove:
linkMove:
all:允许任何dropEffect.

必须在ondragstart事件中设置effectAllowed属性。

可拖动

默认情况下,图像,链接和文本都是可以拖动的。文本只有在选中的情况下才可以被拖动。HTML5为所有元素规定了一个draggable属性。设置这个属性可以改变元素的可拖动属性。

//让图像不能被拖动
<img src="smile.gif" draggable="false">
//让这个元素可以拖动
<div draggable="true">...</div>

另外为了让Firefox支持可拖动属性,必须添加一个ondragstart事件处理程序。并在dataTransfer对象总保存一些信息。

dataTransfer还有一个setDragImage(element,x,y)方法:指定一幅图像,当拖动发生时,显示在光标下方。参数分别为:Hmtl元素和光标在图像中的x,y坐标。

媒体元素

HTML5新增了两个标签和

<video src="conference.mpg" id="muvideo">video palyer not available</video>
<audio src="song.mp3" id="myAudio">audio player not available</audio>

还可以指定widht和height属性指定视频播放器大小。poster属性指定图像的URI可以在加载视频内容期间显示一幅图像。controls属性浏览器会显示UI控件。
并非所有浏览器都支持所有媒体格式。所以可以指定多个不通的媒体来源。

<video id="myvideo">
  <source src="conference.webm" type="video/webm;codecs='vp8,vorbis>
  <source src="conference.ogv" type="video/ogg;codecs='theora,vorbis>
  <source src="conference.mpg">
video palyer not available
</video>

属性(自行查阅)

事件 (自行查阅)

自定义媒体播放器

使用和元素的play()和pause()方法,可以手工控制媒体文件的播放。组合使用属性,事件就可以创建自定义的媒体播放器。

<div class="mediaplayer">
    <div class="video">
        <video id="palyer" src="movie.mov" poster="mymovie.jpg" width="200" height="200">
        video player not available
        </video>
    </div>
    <div class="controls">
        <input type="button" value="play" id="video-btn">
        <span id="curtime">0</span><span id="duration">0</span>
    </div>
</div>
//js代码
var player = document.getElementById("player"),
    btn = document.getElementById("btn"),
    curtime = document.getElementById("curtime"),
    duration = document.getElementById("duration");
//更新播放时间
duration.innerHTML = palyer.duration;
EventUtil.addHandler(btn,"click",function(event)){
    if(player.paused){
        player.play();
        btn.value = "pause";
    }else{
        player.pause();
        player.value = "play";
    }
}
//定时更新当前时间
setInverval(function(){
    curtime.innerHTML = player.currentTime;
},250);

检测编码器的支持情况

canPlayType():接收一个参数,一种格式/编解码器字符创

if(audio.canPlayType("audio/mpeg"))

历史状态管理

HTML5通过更新history对象为管理历史状态提供了方便。
通过haschange事件,可以知道URL的参数什么时候发生了变化。而通过状态管理API可以在不加载页面的情况下改变浏览器的URL。需要使用history.pushState()方法,该方法可以接受三个参数:状态对象,新状态的标题和可选的相对URL。

history.pushState({name:"Nicholas"},"nichosla page","haha.html");

执行此方法,新的状态信息就会被加入历史状态栈,浏览器地址栏也会变成新的相对URL。但是浏览器并不会真的向服务器发送请求。第二个参数目前还没有浏览器实现。传入空字符串即可。按下后退按钮后就可以触发window对象的popState事件。该对象的一个state属性就是pushState()的第一个参数。
要更新当前状态,可以是使用replaceState(),传入的参数与pushState的前两个参数相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值