• 【DOM编程艺术】positionMessage函数和moveMessage函数


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>position</title>
    </head>
    
    <body>
    <p id='message'>Whee!</p>
    <script>
    addLoadEvent(positionMessage);
    addLoadEvent(moveMessage);
    function positionMessage(){
        var elem = document.getElementById('message');
        elem.style.position = 'absolute';
        elem.style.left = '50px';
        elem.style.top = '100px';
    }
    function moveMessage(){
        var elem = document.getElementById('message');
        elem.style.left = '200px';
    }
    </script>
    </body>
    </html>

    如果让moveMessage()函数在页面加载时运行,这个元素的位置将立刻发生变化----由positionMessage函数给出的原始位置会被立刻覆盖

    导致元素的显示位置立刻发生变化的根源是Javascript太有效率了:函数一个接一个地执行,其间根本没有我们所能察觉的间隔。

    二、创造时间间隔

    setTimeout("function",interval);   

    setTimeout有两个参数,第一个参数通常是一个字符串,其内容是将要执行的那个函数的名字; 第二个参数是一个表示时间间隔的数值

    在绝大多数时候,把这个函数调用赋值给一个变量将是一个好主意:variable=setTimeout('function',interval);

    如果想取消某个正在排队等待执行的函数,就必须事先像上面这样把setTimeout函数的返回值赋给一个变量。

    取消队列   clearTimeout(variable);  ....需要一个参数---保存着某个setTimeout函数调用返回值的变量。

    修改positionMessage函数,让它在5秒之后才去调用moveMessage函数:

    <script>
    addLoadEvent(positionMessage);
    function positionMessage(){
        var elem = document.getElementById('message');
        elem.style.position = 'absolute';
        elem.style.left = '50px';
        elem.style.top = '100px';
        moveMent = setTimeout('moveMessage()',5000);//相隔5秒执行moveMessage函数.....在5秒钟的时间里,随时可以clearTimeout(movement)取消这一跳跃行为......
    }
    function moveMessage(){
        var elem = document.getElementById('message');
        elem.style.left = '200px';
    }
    
    </script>

    解析:movement变量对应着在positionMessage函数里定义的setTimeout调用。它是一个全局变量,这意味着那个“跳跃”行为可以在positionMessage函数以外的地方被取消。

    三、真正的动画效果是一个渐变的过程

    <script>
    addLoadEvent(positionMessage);
    function positionMessage(){
      if(!document.getElementById)return false;
      if(!document.getElementById('message')) return false;
    var elem = document.getElementById('message'); elem.style.position = 'absolute'; elem.style.left = '50px'; elem.style.top = '100px'; movement = setTimeout('moveMessage()',10); } function moveMessage(){ var elem = document.getElementById('message'); var xpos = parseInt(elem.style.left); var ypos = parseInt(elem.style.top); if(xpos == 200 && ypos ==100){ return true; } if(xpos < 200){ xpos++; } if(xpos > 200){ xpos--; } if(ypos > 100){ ypos++; } if(ypos < 100){ ypos--; } elem.style.left = xpos +'px'; elem.style.top = ypos +'px'; movement=setTimeout('moveMessage()',10); } function addLoadEvent(func){ var oldEvent = window.onload; if(typeof window.onload != 'function'){ window.onload = func; }else{ window.onload = function(){ oldEvent(); func(); } } } </script>

    moveMess()函数使得message元素以每次1像素的方式在浏览器窗口里移动。一旦这个元素的top和left属性同时等于100px和200px,这个函数就停止执行。
    四、抽象

    <script>
    addLoadEvent(positionMessage);
    function positionMessage(){
        var elem = document.getElementById('message');
        elem.style.position = 'absolute';
        elem.style.left = '50px';
        elem.style.top = '100px';
        moveMessage('message',125,25,20);
    }
    function moveElement(elementId,final_x,final_y,interval){
        if( !document.getElementById) return false;
        if( !document.getElementById(elementId)) return false;
        var elem = document.getElementById(elementId);
        var xpos = parseInt(elem.style.left);
        var ypos = parseInt(elem.style.top);
        if(xpos == final_x && ypos == final_y){
            return true;
        }
        if(xpos < final_x){
            xpos++;
        }
        if(xpos > final_x){
            xpos--;
        }
        if(ypos > final_y){
            ypos++;
        }
        if(ypos < final_y){
            ypos--;
        }
        elem.style.left = xpos +'px';
        elem.style.top = ypos +'px';
       var repeat="moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")";
        movement=setTimeout(repeat,10);
    }
    
    </script>
    "moveElement('"+elementId+"',"+final_x+","+final_y+","+interval+")"
  • 相关阅读:
    小知识,大应用--正交向量在CDMA中的运用
    翻译:做好iPhone程序的10点建议
    解决了对多层结构一些疑惑,整理一下!
    原来是这样的——生活中的随笔
    3.14..............
    基础 - 结构
    推荐一本书《我编程,我快乐》
    基础 - 异常处理
    今天发现一个以前写的管理代码片段的程序,把源码发出来!
    VNC快速教程
  • 原文地址:https://www.cnblogs.com/positive/p/3680204.html
Copyright © 2020-2023  润新知