• JavaScript DOM编程基础精华03(动态设置,层的操作,性能问题)


    代码是否需要放置到onload中
     //如果js代码需要操作页面上的元素,则将该代码放到onload里面。
            //因为当页面加载完毕之后页面上才会有相关的元素


            //如果js代码中没有操作页面元素的语句,则可以将该代码直接写在<script>标签中,
            //例如:声明变量,相加求和等操作。 
            //建议将操作页面元素的代码都放到onload里面。 



    控制层的显示

    修改style.display,例子:切换层的显示
            function togglediv() {
                var div1 = document.getElementById('div1');
                if (div1.style.display == '') {
                    div1.style.display = 'none';//不显示
                }
                else {
                    div1.style.display = '';//显示
                }
            }//与元素对象.enabled=true或readonly=true等不一样,这里是样式,不是元素的直接属性,不能用true或false。



    动态设置元素的位置、大小

    通过dom读取元素的top、left、width、height等取到的值不是数字,而是“10px”这样的字符串;为这些属性设值的时候IE可以是80、90这样的数字,FF、Chrome必须是“80px”、“90%”等这样的字符串形式,为了兼容统一用字符串形式。left/top需要设置position
    易错:不要写成div1.style.width=80px,而是div1.style.width=‘80px’;

    修改元素的大小(parseInt可以将“20px”这样数字开头的包含其他内容的字符串解析为20,parseInt(‘22px’,10),也就是解析尽可能多的部分);然后加上一个值,再加上px赋值回去。


    层的操作
    元素的position 样式值:static(无定位,显示在默认位置)、absolute(绝对定位)、fixed(相对于窗口的固定定位,位置不会随着浏览器的滚动而变化,IE6不支持)、relative(相对元素默认位置的定位)。如果要通过代码修改元素的坐标则一般使用absolute,然后修改元素的top(上边缘距离)、左边缘距离)两个样式值。left、top都是指的层的左上角的坐标left
    ===============图片跟着鼠标走=======================
    <img id="img1" src="1.gif" />
    function picMove(){
    var x=window.event.clientX;
    var y=window.event.clientY;

    document.getElementById('img1').style.position='absolute';
    document.getElementById('img1').style.left=x;
    document.getElementById('img1').style.top=y;
    document.title=x+','+y;
    }



    form对象
    常用:click(),focus(),blur();//相当于通过程序来触发元素的单击、获得焦点以及失去焦点的事件。
    form对象是表单的Dom对象。
    方法:submit()提交表单,但是不会触发onsubmit事件。
    实现autopost,也就是焦点离开控件以后页面立即提交,而不是只有提交submit按钮以后才提交,当光标离开的时候触发onblur事件,在onblur中调用form的submit方法。


    =========================不点提交按钮如何提交===========
    autopost
     <form name="form1" action="a.aspx" method="get">
            <input type="text" onblur="form1.submit()" />
            <input type="text" />        
        </form>



    在点击submit后form的onsubmit事件被触发,在onsubmit中可以进行数据校验,如果数据有问题,返回false即可取消提交
        <form name="form1" action="a.aspx" method="get" onsubmit="if(document.getElementById('txtname').value.length<=0){alert('姓名必填');return false;}">


    案例练习
    练习1:点击【登录】按钮,弹出一个显示用户名、密码等的层。将用户名、密码等写到一个层中,层默认是隐藏的。
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
        <meta charset="utf-8"/>
        <script type="text/javascript">
            var keyWords = { "苹果播客": ["播客java视频", "播客.net视频", "播客php视频"], "中科": ["中科的视频", "中科的微博","中科的邮箱"],"杨":["杨利伟","杨振宁","杨过"],"火影忍者":["卡卡西","佐助","鼬","鸣人"] };


            onload = function () {
                setInterval(function() {
                    document.getElementById('txt').onchange();
                },
                1000);
                document.getElementById('txt').onchange = function () {            
                    if (keyWords[this.value].length>0) {
                        //开始创建层
                        if (document.getElementById('dv')) {
                            document.body.removeChild(document.getElementById('dv'));
                        }
                        //开始创建层
                        var dvObj = document.createElement('div');
                        dvObj.id = 'dv';
                        dvObj.style.width = '300px';
                        //dvObj.style.height = '200px';//将来可以不要
                        dvObj.style.border = '1px solid red';


                        document.body.appendChild(dvObj);
                        //脱离文档流
                        dvObj.style.position = 'absolute';
                        dvObj.style.left = this.offsetLeft + 'px';
                        dvObj.style.top = this.offsetHeight + this.offsetTop + 'px';
                        //循环创建
                        for (var i = 0; i < keyWords[this.value].length; i++) {
                            //创建一个可以存文本的标签
                            var pObj = document.createElement('p');
                            pObj.innerText = keyWords[this.value][i];


                            //小手 高亮显示
                            pObj.style.cursor = 'pointer';
                            pObj.style.margin = '5px';
                            pObj.onmouseover = function() {
                                this.style.backgroundColor = 'red';
                            };
                            pObj.onmouseleave = function() {
                                this.style.backgroundColor = '';
                            };
                            dvObj.appendChild(pObj); //把p标签加到层中
                        };
                        //创建可以显示文件的标签


                    };
                };
            };
        </script>
    </head>
    <body>
    请输入搜索的内容:<input type="text" name="name" value="" id="txt" style=" 300px; height: 25px; font-size: 20px;border: 1px solid red"/>
        <input type="button" name="name" value="百度一下" id="btn"/>
    </body>
    </html>


    Js中的一些习惯与性能问题1
    1.声明变量要赋初值var n=10。
    2.尽量避免直接声明全局变量,比如要声明全局变量name,但是它有可能与window.name冲突,所以全局变量一般都会声明在一个全局对象中:var itcast={name:’zxh’,num:10};使用这些全局变量的时候通过itcast.name或者itcast.num,就可以减少与系统的重名了。
    3.当编写大量Js代码的时候难免会遇到命名冲突的问题,这时可以通过模拟命名空间的方式来避免命名冲突。例如:
    var itcast={};
     itcast.net={};
     itcast.net.net0405={name:‘xy’,sayHi:function(){}};
    4.尽量避免使用全局变量。(搜索全局变量时,会一层一层的搜索每个作用域范围,耗时,低效)
    5.使用减值循环或者优化循环条件,不要在循环条件中写i<xxx.length而要用一个变量来代替,i<len。因为循环条件每次都会执行,这样的话每次都会计算xxx.length。
    6.避免使用eval(“alert(10);”);或setInterval(“myFunc();”,1000);这种双重解析的代码。低效!
    7.使用原生的方法,比如内置的join()、reverse(),使用这些本来浏览器就有的方法不要自己写myJoin()之类的,性能低。原生方法都是用c或者c++写的,性能高。
    8.尽可能使用switch来代替多个if-else
    9.尽量减少语句数量:
    用var n1=10,m=‘hello’,n2=true;而不是var n1=10;var m=‘hello’;var n2=true;一句话一个分号
    var arr=[1,2,’a’,true];
    var p1={name:’zxh’,age:18};//创建对象
    10.使用文档碎片,避免多次更新页面。
    var fragment=document.createDocumentFragment();

  • 相关阅读:
    最常用的vim操作指令练习记录
    数据库中间件——Mycat配置
    分布式事务解决方案seata之AT模式原理剖析
    分布式服务限流降级熔断解决方案Nacos之Dashboard界面配置含义记录
    本地Centos7虚拟机安装rabbitmq,主宿机无法访问监控界面解决
    dubbo学习笔记
    SpringBoot整合mybatis-plus代码生成器(备用)
    Zookeeper大概配置及与java集成使用
    Adb免root卸载Android预装应用
    腾讯X5内核调试(安卓)
  • 原文地址:https://www.cnblogs.com/CSharpLover/p/5193661.html
Copyright © 2020-2023  润新知