HTML5脚本编程

HTML5定义了一些新的标记规则,也定义了一些新的JavaScript API,能够让开发人员创建出更好的用户界面。

  • 跨文档消息API 能够在不降低同源策略安全性的前提下,在不同域间的文档间传递消息
  • 原生拖放功能可以指定某个元素可拖动,并在操作系统要放置时做出响应,可以创建可拖动元素及放置目标
  • 媒体元素 <audio><video>拥有自己与音频和视频交互的API,使用canPlayType()检查浏览器是否支持特定格式
  • 历史状态管理可以在不必卸载当前页面时修改浏览器的历史状态栈,在这种机制下,用户可以通过后退和前进按钮在页面状态间切换,这些状态完全由JavaScript控制
1. 跨文档消息传送

window.postMessage() 方法可以安全地实现跨源通信,通常对于两个不同页面的脚本,只有当执行他们的页面位于相同的协议 (通常为https),端口号 (443 为https),以及主机名,两个脚本之间能够相互通信。window.postMessage()方法提供了一种受控机制来规避此限制,只要正确使用,这种方法就很安全。

otherWindow.postMessage(message, targetOrigin, [transfer])
  • otherWindow其它窗口的一个引用,比如iframecontentWidow属性,执行 window.open 返回的窗口对象,或是命名过或数值索引的 window.frames

  • message 将要发送到其它 window 的数据,将会被结构化克隆算法序列化,可以不受限制地将数据对象安全地传送给窗口而无需自己序列化

  • targetOrigin 通过窗口的 origin 属性来指定哪些窗口能接收到消息事件,设置为*时,能够把消息发送给来自任何域的文档

  • 一串和message同时传递的Transferable对象,这些对象的所有权将被转移给消息的接收方

window.postMessage() 方法被调用时,会在所有页面脚本执行完毕后,向目标窗口派发一个messageEvent消息,data属性为window.postMessage的第一个参数,origin为调用postMessage时消息发送方窗口的originsource为对发送消息的窗口的引用

跨文档消息传送,简称为 XDM,指的是在不同域的页面间传递消息,使用postMessage() 方法,实现一个页面向包含在当前页面中的<iframe>元素或者由当前页面弹出的窗口发送消息,方法的参数为一条消息和一个消息接收方的域名。

2. 原生拖放

拖动元素时,依次触发

  • dragstart
  • drag
  • dragend

当元素被拖动到一个有效的放置目标上时

  • dragenter
  • dragover
  • dragleavedrop

dataTransfer对象是事件对象的属性,用于从被拖动元素向放置目标传递字符串格式的数据,有getData()setData()两个方法。IE中只定义了textURL,HTML5中这两种类型被映射为text/plaintext/uri-list。保存在dataTransfer对象中的数据只能在drop事件处理程序中读取。dataTransfer对象的dropEffect属性可以知道被拖动的元素能够执行哪种放置行为

  • none
  • move
  • copy
  • link

dropEffect属性只与effectAllowed 属性搭配才有用,必须在ondragstart事件处理程序中设置effectAllowed属性

  • uninitialized
  • none
  • copy
  • link
  • move
  • copyLink
  • copyMove
  • linkMove
  • all

对元素设置draggable属性可以设置元素是否可拖动。dataTransfer的其他方法和属性:

  • addElement(ele) 为拖动添加一个元素
  • clearData() 清除以特定格式保存的数据
  • setDragImage(ele, x, y) 指定一副图像,当拖动发生时,显示在光标下方
  • types当前保存的数据类型

腾讯面试 页面内有一个正方形元素 A 和 一个待放置区域 B,对其实现拖拽和放下到 B 区域,并改变 B 区域背景颜色,不可用html5原生事件。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div#a {
            width: 80px;
            height: 80px;
            background-color: green;
            font-size: 20px;
            color: white;
            position: absolute;
            z-index: 2;
        }
        
        div#b {
            width: 200px;
            height: 200px;
            background-color: blueviolet;
            font-size: 20px;
            color: white;
            position: absolute;
            margin-top: 300px;
            z-index: 1;
        }
    </style>
</head>

<body>
    <div id='a'>A</div>
    <div id='b'>B</div>




    <script defer>
        var aModel = document.getElementById('a')
        var bModel = document.getElementById('b')

        var positionAInitial = {
            left: aModel.offsetLeft,
            top: aModel.offsetTop
        }

        var positionB = {
            xL: bModel.offsetLeft,
            xR: bModel.offsetleft + bModel.clientWidth,
            yL: bModel.offsetTop,
            yR: bModel.offsetTop + bModel.clientHeight

        }

        var flag = false
        var inB = false

        aModel.addEventListener('mousedown', function() {
            flag = true
        })

        aModel.addEventListener('mousemove', function(event) {
            if (flag) {
                var position = {
                    x: event.pageX,
                    y: event.pageY
                }
                aModel.style.left = position.x - positionAInitial.left + 'px'
                aModel.style.top = position.y - positionAInitial.top + 'px'
                aModel.opacity = '0.5'
                inB = false

                var positionA = {
                    left: aModel.offsetLeft,
                    right: aModel.offsetLeft + aModel.clientWidth,
                    top: aModel.offsetTop,
                    bottom: aModel.offsetTop + aModel.clientHeight,
                }



                if ((positionA.top <= positionB.yL && positionA.bottom >= positionB.yL) ||
                    (positionA.top <= positionB.yR && positionA.bottom >= positionB.yR) ||
                    (positionA.top >= positionB.yL && positionA.bottom <= positionB.yR)
                ) {
                    inB = true
                }
            }
        })

        aModel.addEventListener('mouseup', function(event) {
            if (inB) {
                aModel.style.opacity = '1'
                bModel.style.backgroundColor = 'yellow'
            } else {
                aModel.style.left = positionAInitial.left + 'px'
                aModel.style.top = positionAInitial.top + 'px'
                aModel.style.opacity = '1'
            }
            flag = false
            inB = false
        })
    </script>
</body>

3. 媒体元素

<audio><video>能够在网页中嵌入跨浏览器的音频和视频内容,允许为媒体创建自定义的控件,并且提供了完善的属性和事件。canPlayType检测浏览器是否支持某种编码解码器。

历史状态管理

通过 history对象进行历史状态管理,可以在不卸载当前页面就能够修改浏览器的历史状态栈,用户能够通过前进和后退按钮在页面状态间切换,这些状态完全由 JavaScript 控制。属性和方法包括:

  • length
  • state
  • back()
  • forward()
  • go()
  • pushState() 将新的状态信息加入历史状态栈
  • replace() 更新当前状态
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容