JavaScript事件处理

了解了JavaScript的基础知识后,开始处理HTML5与用户的交互。如果页面能响应用户的输入,它们就不再知识文档,而是有生命的、有反应的应用了。

接下来我们开始学习JavaScript事件处理,这里通过一个添加音乐播放列表示例来描述JavaScript与用户的交互过程。效果图如下:

效果.png

添加一首音乐到列表的步骤主要有四步:

创建HTML页面

playlist.html

<!DOCTYPE HTML>
<html>
<head>
    <title>iTunes</title>
    <meta charset="utf-8">
    <script src="playlist.js"></script>
    <!--播放列表的样式表-->
    <link rel="stylesheet" href="playlist.css">
</head>
<body>
    <form>
        <!--
            type:控件类型
            id:
            placeholder:显示一个例子,指示这个输入域中要输入什么
    -->
        <input type="text" id = "songTextInput" size = "40" placeholder="Song name">
        <input type="button" id="addButton" value="Add song">
    </form>
    <!--ul是一个列表-->
    <ul id="playlist">
</body>
</html>

样式playlist.css代码为

/* playlist.css */

body {
    font-family: arial, sans-serif;
}

ul#playlist {
    border: 1px solid #a9a9a9;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    margin-top: 10px;
    padding: 0px;
    list-style-type: none;
}

ul#playlist li {
    border-bottom: 1px solid #a9a9a9;
    padding: 10px;
    background-image: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), to(#e3e3e3));
    background-image: -moz-linear-gradient(#f9f9f9, #e3e3e3);
    background-image: -ms-linear-gradient(#f9f9f9, #e3e3e3);
    background-image: -o-linear-gradient(#f9f9f9, #e3e3e3);
    background-image: -webkit-linear-gradient(#f9f9f9, #e3e3e3);
    background-image: linear-gradient(#f9f9f9, #e3e3e3);
}

ul#playlist li:last-child {
    -webkit-border-bottom-right-radius: 5px;
    -webkit-border-bottom-left-radius: 5px;
    -moz-border-radius-bottomright: 5px;
    -moz-border-radius-bottomleft: 5px;
    border-bottom: none;
    border-bottom-right-radius: 5px;
    border-bottom-left-radius: 5px;
}
ul#playlist li:first-child {
    -webkit-border-top-right-radius: 5px;
    -webkit-border-top-left-radius: 5px;
    -moz-border-radius-topright: 5px;
    -moz-border-radius-topleft: 5px;
    border-top-right-radius: 5px;
    border-top-left-radius: 5px;
}

如上述代码,head头里面加载了一个JavaScript文件playlist.js和一个播放列表样式playlist.css,body体里面包含一个form表单和一个ul列表,其中form表单包含一个文本类型和按钮类型的控件。

处理点击事件

处理点击事件的步骤:

  • 1.获取id为addButton控件的元素
  • 2.为该元素关联点击事件
  • 3.实现点击事件
window.onload = init;

function init() {

    //1
    var button = document.getElementById('addButton');
    <!--设置点击事件-->
    //2
    button.onclick = handleButtonClick;
}

//3
function handleButtonClick() {

    alert("Button was clicked!");
}

获得歌曲名

步骤:

  • 1.获得id为songTextInput的元素
  • 2.获得该元素的值
window.onload = init;

function init() {

    var button = document.getElementById('addButton');
    <!--设置点击事件-->
    button.onclick = handleButtonClick;
//    loadPlaylist();
}

function handleButtonClick() {
    //1.
    var textInput = document.getElementById('songTextInput');
    //2.
    var songname = textInput.value;
}

添加歌曲到列表

步骤:

  • 1.创建一个新的<li>元素
  • 2.将新元素的内容设置为歌曲名
  • 3.将新元素添加到id为playlist的列表

playlist.js

window.onload = init;

function init() {

    var button = document.getElementById('addButton');
    <!--设置点击事件-->
    button.onclick = handleButtonClick;
}

function handleButtonClick() {

    var textInput = document.getElementById('songTextInput');
    var songname = textInput.value;
    //1
    var li = document.createElement("li");
    //2.
    li.innerHTML = songname;
    //3.
    var ul = document.getElementById("playlist");
    ul.appendChild(li);

}

持久保存歌曲列表

持久保存就是讲歌曲列表保存在本地,当浏览器再次打开HTML5的页面时,就会加载本地的列表显示到页面。

首先,建立一个新文件,list_store.js,代码如下:


//保存数据到本地
function save(item) {
    var playlistArray = getStoreArray("playlist");
    playlistArray.push(item);
    localStorage.setItem("playlist",JSON.stringify(playlistArray));
}

//加载本地数据
function loadPlaylist() {
    var playlistArray = getSavedSongs();
    var ul = document.getElementById('playlist');
    if (playlistArray != null) {
        for(var i = 0; i < playlistArray.length;i++) {
            var li = document.createElement("li");
            li.innerHTML = playlistArray[i];
            ul.appendChild(li);
        }
    }
}

function getSavedSongs() {
    return getStoreArray("playlist");
}

function getStoreArray(key) {
    var playlistArray = localStorage.getItem(key);
    if (playlistArray == null || playlistArray == "") {
        playlistArray = new Array();
    } else {
        playlistArray = JSON.parse(playlistArray);
    }

    return playlistArray;
}

然后在playlist.js中加入两行代码

window.onload = init;

function init() {

    var button = document.getElementById('addButton');
    <!--设置点击事件-->
    button.onclick = handleButtonClick;
    loadPlaylist(); //加载数据
}

function handleButtonClick() {

    var textInput = document.getElementById('songTextInput');
    var songname = textInput.value;

    var li = document.createElement("li");
    li.innerHTML = songname;

    var ul = document.getElementById("playlist");
    ul.appendChild(li);
    save(songname); //保存数据
}

最后,在HTML的head元素中增加一个指向list_store.js的引用,增加到playlist.js的上面

<script src="list_store.js"></script>
<script src="playlist.js"></script>

重新加载页面,输入一些歌曲。退出浏览器,再次打开浏览器,并加载这个页面,你会看到存储的所有歌曲都安全地出现在播放列表中。

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

推荐阅读更多精彩内容

  • 一、事件流 1.1 事件流 事件流:从页面中接受事件的顺序 事件冒泡:即事件开始时由最具体的元素(文档中嵌套层次最...
    范小饭_阅读 1,063评论 1 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,884评论 25 707
  • 事件冒泡:事件在文档树上向上传播,如有以下结构 当用户点击按钮时,首先在按钮上触发点击事件,接着在包着按钮的div...
    柴柴总阅读 378评论 0 3
  • 《瓦尔登湖》,这是一本有点熟悉又陌生的书籍,记得在高中的时候有读过其中一篇,那时候就对梭罗的生活产生了无限的羡慕之...
    戎鱼阅读 540评论 2 4
  • 原文发在《人人都是产品经理》专栏 互联网理财产品的演化之道 本文作者简单地概述了近几年互联网金融投资领域的几个主要...
    谜洛阅读 460评论 0 0