记录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>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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