读javascript高级编程12-HTML5脚本编程

一、跨文档消息传递(XDM)

1.发送消息

postMessage(msg,domain)用于发送跨文档消息。第一个参数是要传递的消息内容,第二个参数表示接收方来自哪个域。第二个参数有助于提高安全性,如果发现域不匹配则不会进行操作。

2.接收消息

接收到消息时,会触发window对象的message事件。传递给onmessage事件处理程序的对象主要包含三个信息:

  • data:对应postMessage()第一个参数传入的内容;
  • origin:发送消息的文档所在域。接收到消息后,检测消息来源是非常重要的步骤。
  • source:发送消息的文档的window对象代理。

实例:

outer.html:

<body>
          <span id="msg"></span>
          <input type="text" id="input">
          <input type="button" id="submit" value="提交">
       <iframe width="300" height="150" src="inner.html" id="frame"></iframe>
       <script type="text/javascript" src="EventUtil.js"></script>
       <script type="text/javascript">
               var btn = document.getElementById(‘submit‘);
               //向iframe发送消息
               EventUtil.addHandler(btn, ‘click‘, function (event) {
                 var input = document.getElementById(‘input‘) .value;
                 var iframe = document.getElementById(‘frame‘) .contentWindow;
                 if (iframe.postMessage) {
                   iframe.postMessage(input, ‘*‘);
                 } else {
                   alert(‘do not support postMessage‘);
                 }
               });
               //接收iframe发送的消息
               EventUtil.addHandler(window,‘message‘,function(event){
                    var msg = document.getElementById(‘msg‘);
                    msg.innerHTML=event.data;
                    });
       </script>
     </body>

inner.html:

<body>
          <span id="msg"></span>
          <input type="text" id="input">
          <input type="button" id="submit" value="提交">
          <script type="text/javascript" src="EventUtil.js"></script>
          <script type="text/javascript">
          var msg = document.getElementById(‘msg‘);
          //接收外层主窗体发送的消息
          EventUtil.addHandler(window, ‘message‘, function (event) {
            msg.innerHTML = event.data;
          });
          var submit=document.getElementById("submit");
          //向外层主窗体发送消息
          EventUtil.addHandler(submit,‘click‘,function(event){
               if (parent.postMessage) {
              var input = document.getElementById(‘input‘).value;
              parent.postMessage(input, ‘*‘);
            } else {
              alert(‘do not support postMessage‘);
            }
               });
       </script>
     </body>

二、拖放

1. 拖放事件

被拖动元素会依次触发以下事件:

  • dragstart:按下鼠标键并开始移动时触发;
  • drag:在元素被拖动期间会持续触发该事件;
  • dragend:拖动停止时触发。

当元素拖动到一个目标元素时,会依次触发以下事件:

  • dragenter:元素被拖动到目标元素上时触发。
  • dragover:被拖动的元素在目标元素范围内移动时会持续触发。
  • dragleave或drop:当被拖动元素离开目标元素时触发dragleave。如果元素放到了目标元素中,则触发drop而不在触发dragleave。

虽然大多数元素支持拖放的目标元素事件,但是这些元素默认是不允许放置的。所以要使用preventDefault()取消这些元素的默认事件。

<img src="http://static.cnblogs.com/images/logo_small.gif" id="img" >
<div id="target" style="margin-right:10px;border:1px solid black; width:100px; height:100px;"></div>
<script type=‘text/javascript‘ src="EventUtil.js"></script>
<script type=‘text/javascript‘>
           var image = document.getElementById("img");
           var handlerImg=function(event){
                event=EventUtil.getEvent(event);
                console.log(event.type);
                }
        EventUtil.addHandler(image, "dragstart", handlerImg);
        EventUtil.addHandler(image, "drag", handlerImg);
        EventUtil.addHandler(image, "dragend", handlerImg);
           var handler=function(event){
                event=EventUtil.getEvent(event);
                event.preventDefault();
                console.log(event.type);
                }
        var target=document.getElementById("target");
        EventUtil.addHandler(target,"dragenter",handler);
        EventUtil.addHandler(target,"dragover",handler);
        EventUtil.addHandler(target,"dragleave",handler);
        EventUtil.addHandler(target,"drop",handler);
</script>

2.dataTransfer对象

dataTransfer对象是事件对象的一个属性,用于从被拖动的元素向目标元素传递字符串类型的数据。保存在dataTransfer对象中的数据只能在ondrop事件中读取。几个常用方法:

  • setData(type,value):设置用来设置数据。第一个参数是“Text”或者“url”,第二个参数是字符串类型的数据。text和url类型还是略有区别的,如果将数据保存为url,那么浏览器会把它当作网页中的链接。如果将其拖放到浏览器窗口中,浏览器就会打开该链接。
  • getData(type):参数type是"Text"或“url”,与set中的设置保持一致。
  • setDragImage(target,x,y):指定一幅图像,当拖动发生时,显示在光标下方。
<img src="http://static.cnblogs.com/images/logo_small.gif" id="img" >
<div id="target" style="float:left;margin-left:300px;border:1px solid black; width:200px; height:100px;"></div>
<script type=‘text/javascript‘ src="EventUtil.js"></script>
<script type=‘text/javascript‘>
var image = document.getElementById(‘img‘);
var handlerImg = function (event) {
  event = EventUtil.getEvent(event);
  var target = EventUtil.getTarget(event);
  event.dataTransfer.setData(‘Text‘, target.id);
  event.dataTransfer.setData(‘url‘,target.getAttribute(‘src‘));
  event.dataTransfer.setDragImage(target,10,10);
}
EventUtil.addHandler(image, ‘dragstart‘, handlerImg);
var handler = function (event) {
  event = EventUtil.getEvent(event);
  var target = EventUtil.getTarget(event);
  switch (event.type) {
  case ‘drop‘:
    event.preventDefault();
    var id = event.dataTransfer.getData(‘Text‘);
    var url=event.dataTransfer.getData(‘url‘);
    target.appendChild(document.getElementById(id));
    target.innerHTML+=url;
    break;
  case ‘dragover‘:
    event.preventDefault();
    break;
  }
}
var target = document.getElementById(‘target‘);
EventUtil.addHandler(target, ‘dragover‘, handler);
EventUtil.addHandler(target, ‘drop‘, handler);
</script>

3.可拖放

默认情况下,图像、文本等是可以拖动的,大多数其他元素不能拖动。如果想让某个元素可拖动,只需设置draggable=true即可。

<div id="target" style="border:1px solid black; width:200px; height:100px;" draggable="false"></div>

三、媒体元素

1.音频和视频控件

<audio id="player" src="billyBrowsers.ogg" poster="smile.gif" controls>不支持音频</audio>
<video id="player" src="billyBrowsers.ogg" poster="mymovie.jpg" width="300" height="200">不支持视频</video>

2.常用属性

autoplay:布尔型,设置是否自动播放。

controls:布尔型,用来设置浏览器中的自带控件是否显示。

currentSrc:当前播放的媒体文件url。

duration:媒体的总播放时间。

currentTime:当前已经播放的秒数。

loop:布尔型,媒体是否自动循环播放。

plaused:媒体播放器是否暂停。

src:媒体文件的来源。

<div class="mediaplayer">
        <div class="video">
            <audio id="player" src="billyBrowsers.ogg" poster="smile.gif" controls autoplay=‘true‘>不支持音频</audio>
        </div>
        <div class="controls">
            <input type="button" value="Play" id="audio-btn" />
            <span id="curtime">0</span>/<span id="duration">0</span>
        </div>
    </div>
    <script>
        window.onload = function(){
            var player = document.getElementById("player");
            var btn = document.getElementById("audio-btn");
            var curtime = document.getElementById("curtime");
            var duration = document.getElementById("duration");
            duration.innerHTML = player.duration;
            EventUtil.addHandler(btn, "click", function(event){
                if (player.paused){
                   console.log(player.currentSrc);
                    player.play();
                    btn.value = "Pause";
                } else {
                    player.pause();
                    btn.value = "Play";
                }
            });
            setInterval(function(){
                curtime.innerHTML = player.currentTime;
            }, 250);
        };
    </script>

3.Audio类型

<audio>元素有对应的构造函数Audio。其实不必将Audio插入到文档中,在创建Audio实例后就开始下载指定文件,下载完成后,调用play()方法就可以开始播放。

<script>
        window.onload = function(){
            var player=new Audio("billyBrowsers.ogg");
            EventUtil.addHandler(player,"canplay",function(){
                 player.play();
                 })
        };
    </script>

读javascript高级编程12-HTML5脚本编程

时间: 2024-10-10 14:54:22

读javascript高级编程12-HTML5脚本编程的相关文章

读javascript高级编程07-引用类型、Object、Array

一.引用类型 ECMAScript是支持面向对象的,可以通过引用类型描述一类对象所具有的属性和方法. 创建对象实例的方法时是用new 操作符加构造函数:var p=new Person(). 二.Object类型 1.创建Object实例两种方式: 使用new操作符跟Object构造函数. var o = new Object(); o.name = 'dami'; o.age = 25; 使用对象字面量表示法,推荐这种方式,代码量小而且看上去有封装的感觉. var o = { name: 'd

读javascript高级编程10-DOM

一.节点关系 元素的childNodes属性来表示其所有子节点,它是一个NodeList对象,会随着DOM结构的变化动态变化. hasChildNodes():是否有子节点. var headlines=document.getElementById("headline_block"); var childs=headlines.childNodes; childs.length;//1 childs[0];//取第一个子节点 childs.item(0);//取第一个子节点 pare

读javascript高级编程11-事件

一.事件流 事件流指从页面中接收事件的顺序. 1.事件冒泡(常用) IE中采用的事件流是事件冒泡,先从具体的接收元素,然后逐步向上传播到不具体的元素. 2.事件捕获(少用) Netscapte采用事件捕获,先由不具体的元素接收事件,最具体的节点最后才接收到事件. 3.DOM事件流 DOM2级事件包括三个阶段:事件捕获阶段.处于目标阶段和事件冒泡阶段. 二.事件处理程序 事件处理程序就是响应某些事件的函数,如onclick等. 1. DOM0级事件处理程序 每个元素都有自己的事件处理程序属性,如o

读javascript高级编程02-变量作用域

一. 延长作用域链 有些语句可以在作用域前端临时增加一个变量对象,该变量对象在代码执行完成后会被移除. ①with语句延长作用域. function buildUrl(){ var qs="?debug=true"; with(location){ var url=href+qs; } return url; } buildUrl(); //result:http://www.fanxbao.com/?debug=true ②try...catch...中的catch语句块延长作用域链

读javascript高级编程08-引用类型之Global、Math、String

一.Global 所有在全局作用域定义的属性和方法,都属于Global对象. 1.URI编码: encodeURI():主要用于对整个URI编码.它不会对本身属于URI的特殊字符进行编码. encodeComponentURI():主要用于对URI中的某一部分进行编码,很常用的是对查询字符串参数进行编码.它会对所有非标准字符进行编码. 对应的解码方法是decodeURI()和decodeURIComponent. var uri='http://www.cnblogs.com?a=1 2&b=陈

读javascript高级编程03-函数表达式、闭包、私有变量

一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); function test(){ alert(1); } 2.函数表达式不会进行函数提升,函数调用在函数声明之前的话会报错: test(); // test is not a function var test=function(){ alert(1); } 二.递归函数 递归函数是通过在函数内部调用自身实现的

读javascript高级编程09-BOM

一.window 1.在全局作用域中定义的变量和函数会被归在window对象. var a=1,b=2; function add(a,b){ return a+b; } console.log(window.a);//1 console.log(window.add(a,b));//3 有点区别在于,全局变量不能用delete删除,而直接在window对象定义的属性可以用delete删除. 2.计算窗口位置: var leftpos=typeof window.screenLeft=="num

读javascript高级编程05-面向对象之创建对象

1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.name=name; p.age=age; p.speak=function(){ console.log("my name is "+p.name); } return p; } var p1=CreatePerson('Wang',15); p1.speak(); var p2=Crea

javascript权威指南第16章 HTML5脚本编程

<!DOCTYPE html> <html> <head> <script type="text/javascript" src="HTML5Script.js"></script> <script type="text/javascript" src="EventUtilExt.js"></script> </head> <