记录9 交互式编程

到 目 前 为 止, 只 要 页 面 一 加 载, 就 会 运 行 页 面 中 的JavaScript 代码,只有包含了对 alert 或 confirm 这样的函数调用的时候,程序才会暂停。但是,我们并不是总希望页面一加载就运行所有的代码,如果想要让一些代码延迟运行或者用户做了某些响应动作之后才运行,该怎么办呢?

用setTimeout函数延时代码

这个函数接受两个参数:分别是一段时间之后要调用的函数以及所要等待的时间(毫秒)。
如下就是一个最简单的例子,页面加载完成后3秒才弹出一个提示框

<body>
    <script type="text/javascript">
        var timeUp=function(){
            alert("Time's up!");
        };
        setTimeout(timeUp,3000);
    </script>
</body>

注意:
上面的例子仍然是页面一加载就运行所有的代码。
调 用 setTimeout 的 返 回 值表示该方法当前被调用的次数,第一次调用返回值是1,第二次调用返回值是2,以此类推。
下面的效果是一加载页面就执行全部js代码,先弹出提示框(显示值为1),点击“OK”后再弹出提示框(值为3),第二个提示框点击“OK”之后再过3秒之后弹出“Time's up!”,前面一个“Time's up!”点击“OK”之后再过3秒弹出“Time's up!”。

首先,页面所有代码都是一加载完代码就得到执行,setTimeout方法也是里面得到执行。(如果理解为3秒后才执行该方法,那么就是3秒后执行该方法然后接着等待3秒,总共得等6秒了);其次,我们只有点击每个弹出框之后,后面的弹窗代码才会开始执行(所以我们在第一个弹窗不点击“OK”,等待3秒后也不会出现"Time's up!"弹窗)

<body>
    <script type="text/javascript">
        var timeUp=function(){
            alert("Time's up!");
        };
        var result=setTimeout(timeUp,3000);
        var result2=setTimeout(timeUp,3000);
        var result3=setTimeout(timeUp,3000);
        alert(result);
        alert(result3)
    </script>
</body>

取消一个timeout

例如我们使用 setTimeout 函数创建了一个延迟函数调用之后,可能会发现实际上并不想要调用该函数。例如我们设置一个闹钟来提醒做作业,但是作业已经提前完成了,那就想要取消这个闹钟。要取消 timeout,在 setTimeout 返回的timeoutID 上调用 clearTimeout 函数。

如下效果就是在4秒后弹窗“Finish homework before alarm,eat dinner..."

<body>
    <script type="text/javascript">
        var homeworkAlarm = function(){
            alert("Begin to do homework now..");
        };
        var eatDinner = function(){
            alert("Finish homework before alarm,eat dinner...");
        };
        var timeoutId1 = setTimeout(homeworkAlarm,3000);
        var timeoutId2 = setTimeout(eatDinner,4000);
        clearTimeout(timeoutId1);
    </script>
</body>

使用setInterval多次调用代码

setInterval 函数就像 setTimeout 函数一样,只不过它是重复调用指定的函数。接受两个参数:分别是想要调用的函数和间隔的时间长度。
像 setTimeout 返回 timeout ID 一样,setInterval 会返回 interval ID,可以使用clearInterval 函数和这个 interval ID 来告诉 JavaScript 停止执行重复调用。

如下例子,标题元素每 30 毫秒就会在屏幕上缓慢地移动 1 个像素直到移动了 200 个像素,然后回到起始点,再次开始移动,不断重复该过程。
使用 offset 方法设置标题距离屏幕左边缘的距离。

<body>
    <h1 id="heading">Rails is going...</h1>
    <script type="text/javascript">
        var leftOffset = 0;
        var moveHeading = function(){
            $("#heading").offset({left: leftOffset});
            leftOffset++;
            if(leftOffset > 200){
                leftOffset = 0;
            }
        };
        setInterval(moveHeading,30);
    </script>
</body>

如果我们想要恢复原来位置之后就停止重复调用,可以使用如下代码:

<body>
    <h1 id="heading">Rails is going...</h1>
    <script type="text/javascript">
        var leftOffset = 0;
        var moveHeading = function(){
            $("#heading").offset({left: leftOffset});
            leftOffset++;
            if(leftOffset > 200){
                leftOffset = 0;
                $("#heading").offset({left: leftOffset});
                clearInterval(id);
            }
        };
        var id=setInterval(moveHeading,30);
    </script>
</body>

对单击做出响应

当调用这个函数时,
click(clickHandler)的含义是“当单击 h1 元素时,调用 clickHandler 函数,并且将 event 对象传递给该函数”。在这个示例中,单击处理程序从这个event 对象中获取信息,并且在控制台输出单击位置的 x 坐标和 y 坐标。

event 参数是包含单击事件相关信息的一个对象,例如单击的位置pageX,pageY和其他很多事件本身的信息。

<body>
    <h1>Learn</h1>
    <script type="text/javascript">
        var clickHandler=function(event){
            alert("Click!"+event.pageX+"---"+event.pageY)
        }
        var s=document.getElementsByTagName("h1");
        s[0].onclick=clickHandler;  //注意点击事件关键字是onclick
    </script>
</body>
Paste_Image.png

上面的例子使用jQuery来写则是(注意点击事件关键字是click):

<body>
    <h1>Learn</h1>
    <script type="text/javascript" src="jquery-3.1.1.js"></script>
    <script type="text/javascript">
        var clickHandler=function(event){
            alert("Click!"+event.pageX+"---"+event.pageY)
        }
        $("h1").click(clickHandler);
    </script>
</body>

鼠标移动事件

每次鼠标移动都会触发 mousemove 事件。
使用 $("html")选中这个 html 元素,以便当鼠标在页面上任何位置移动时都会触发这个处理程序。每次用户移动鼠标,都会调用传递到 mousemove 后面的括号中的函数。效果就是每次移动鼠标,标题将会移动到该位置。

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

推荐阅读更多精彩内容

  • 第1章 认识JS JavaScript能做什么?1.增强页面动态效果(如:下拉菜单、图片轮播、信息滚动等)2.实现...
    mo默22阅读 1,277评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,081评论 25 707
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,770评论 0 8
  • 有形的物质消费和无形的消费,其实是两种价值观的不同,后着更看重长期的发展,前着只是更多满足目前的消费,过个20-3...
    007活在未来阅读 629评论 0 0
  • “醉过才知酒浓 爱过才知情重:—— 你不能做我的诗, 正如我不能做你的梦” 这是胡适《尝试集》里的一篇,《梦与诗》...
    倪拗拗阅读 12,712评论 1 8