zoukankan      html  css  js  c++  java
  • 读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; 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; 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; 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>
  • 相关阅读:
    微信“为盲胞读书”项目上线“团体领读”新功能
    神秘代码让iPhone微信闪退的解决方法
    [腾讯首季业绩数据]微信支付用户数持续上升
    [民间调查]小学生微信使用情况的调查 90%小学高年级学生用微信
    O2O模式成功案例分享 汲取精华化为己用
    太原警方通过微博提醒您手机丢失如何保微信安全
    百度富媒体展示允许自定义站点Logo/简介等
    网页出现scanstyles does nothing in Webkit / Mozilla的解决方法
    安卓微信新版内测 可分享小视频/可设微信字体大小
    微信电脑版微信1.1 for Windows更新 可@人/转发撤回消息/可播小视频
  • 原文地址:https://www.cnblogs.com/janes/p/3924499.html
Copyright © 2011-2022 走看看