zoukankan      html  css  js  c++  java
  • JavaScript DOM操作 提高篇

      做为一个web前端,处理和了解浏览器差异一个重要问题.下面将介绍本人在工作中的一些笔记总结,先介绍没有使用js库的情况。

    1.setAttribute方法设置元素类名 : 在jQuery中,直接使用attr()方法即可,可在原生的JS中

    element.setAttribute('class','newClassName') //这个是W3C的标准,在兼容W3C标准的浏览器中有效,可是,IE才是国内用户的主旋律
    element.setAttribute('className','newClassName') //这样的设置在IE中才能有效
    element.className = 'newClassName' //所有浏览器有效(只要支持javascript)

      好了,开篇说完了,这篇文章的目的也就是介绍浏览器差异的同时使前端的朋友们了解如果用最有效的方法去解决问题,下面继续。

    2.FireFox没有window.event对象,只有event对象,IE里只支持window.event,而其他主流浏览器两者都支持,所以一般写成:

    function handle(e){
      e = e || event;
      ...
    }
     

    3.DOMContentLoaded事件原理

      对window.onload事件是当页面解析/DOM树建立完成,并完成了如图片、脚本、样式表等所有资源的下载后才触发的。

      这对于很多实际的应用而言有点太“迟”了,比较影响用户体验。

      为了解决这个问题,FF中便增加了一个DOMContentLoaded方法,与onload相比,该方法触发的时间更早,它是在页面的DOM内容加载完成后即触发,而无需等待其他资源的加载(这个也就是jquery.ready()事件的实现原理)。

    1 function load(text){
    2     alert(text)
    3 }
    4 
    5 // 后执行
    6 window.addEventListener("load", function(){ load("a") }, false);
    7 
    8 // 先执行
    9 window.addEventListener("DOMContentLoaded", function(){ load("b") }, false);

    //以下是jQuery 1.4.2版本的原版分析


    bindReady: function() {
      if ( readyBound ) {
        return;
      }
      readyBound = true;
      // Catch cases where $(document).ready() is called after the
      // browser event has already occurred.
      if ( document.readyState === "complete" ) {
        return jQuery.ready();
      }
      // Mozilla, Opera and webkit nightlies currently support this event
      if ( document.addEventListener ) {
      // Use the handy event callback
        document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
        // A fallback to window.onload, that will always work
        window.addEventListener( "load", jQuery.ready, false );
        // If IE event model is used
      } else if ( document.attachEvent ) {
        // ensure firing before onload,
        // maybe late but safe also for iframes
        document.attachEvent("onreadystatechange", DOMContentLoaded);
        // A fallback to window.onload, that will always work
        window.attachEvent( "onload", jQuery.ready );
        // If IE and not a frame
        // continually check to see if the document is ready
        var toplevel = false;
        try {
          toplevel = window.frameElement == null;
        } catch(e) {}
        if ( document.documentElement.doScroll && toplevel ) {
          doScrollCheck();
        }
      }
    }

      设计思路 - 将Webkit与Firefox同等对待,都是直接注册DOMContentLoaded事件,但是由于Webkit是在525以上版本才引入的,因此存在兼容性的隐患。

      对于IE,首先注册document的onreadystatechange事件,经测试,该方式与window.onload相当,依然会等到所有资源下载完毕后才触发。

      之后,判断如果是IE并且页面不在iframe当中,则通过setTiemout来不断的调用documentElement的doScroll方法,直到调用成功则出触发DOMContentLoaded。

      1 jQuery对于IE的解决方案的原理是,在IE下,DOM的某些方法只有在DOM解析完成后才可以调用,doScroll就是这样一个方法,反过来当能调用doScroll的时候即是DOM解析完成之时,与prototype中的document.write相比,该方案可以解决页面有iframe时失效的问题。

      此外,jQuery似乎担心当页面处于iframe中时,该方法会失效,因此实现代码中做了判断,如果是在iframe中则通过document的onreadystatechange来实现,否则通过doScroll来实现。不过经测试,即使是在iframe中,doScroll依然有效。

    4.学会使用IE的条件注释。许多前端总是在抱怨万恶的IE,确实,处理兼容性的问题确实会越来越恶心,可是没有办法,既然没有办法改变,那么请享受...

    <!--[if IE]>
    <h1>您正在使用IE浏览器</h1>
    <![endif]-->
    <!--[if IE 5]>
    <h1>版本 5</h1>
    <![endif]-->
    <!--[if IE 5.0]>
    <h1>版本 5.0</h1>
    <![endif]-->
    <!--[if IE 5.5]>
    <h1>版本 5.5</h1>
    <![endif]-->
    <!--[if IE 6]>
    <h1>版本 6</h1>
    <![endif]-->
    <!--[if IE 7]>
    <h1>版本 7</h1>
    <![endif]-->
  • 相关阅读:
    网络流
    随机化
    sw抄来的主席树
    牛客SQL题解-统计各个部门的工资记录数
    牛客SQL题解-查找所有员工自入职以来的薪水涨幅情况
    牛客SQL题解-查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成
    牛客SQL题解-查找所有员工的last_name和first_name以及对应的dept_name,也包括暂时没有分配部门的员工
    牛客SQL题解-获取薪水第二多的员工的emp_no以及其对应的薪水salary
    牛客SQL题解-统计出各个title类型对应的员工薪水对应的平均工资avg
    牛客SQL题解-查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
  • 原文地址:https://www.cnblogs.com/couxiaozi1983/p/2390147.html
Copyright © 2011-2022 走看看