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()事件的实现原理)。

//以下是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]-->

  今天就先总结到这里吧,下周收假回来有时间发高级AJAX篇,希望能对新手或者有需要的人有所帮助.由于文笔有限,写的不好也请见谅,这个刚刚开始写博客,成长阶段嘛。哈哈...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《算法竞赛进阶指南》0.5排序

103. 电影 莫斯科正在举办一个大型国际会议&#xff0c;有n个来自不同国家的科学家参会。 每个科学家都只懂得一种语言。 为了方便起见&#xff0c;我们把世界上的所有语言用1到109之间的整数编号。 在会议结束后&#xff0c;所有的科学家决定一起去看场电影放松一下。 他们去的…

Spring Cloud Gateway(五):路由定位器 RouteLocator

本文基于 spring cloud gateway 2.0.1 1、简介 直接 获取 路 由 的 方法 是 通过 RouteLocator 接口 获取。 同样&#xff0c; 该 顶 级 接口 有多 个 实现 类&#xff0c; RouteLocator 路由定位器&#xff0c;顾名思义就是用来获取路由的方法。该路由定位器为顶级接口有多个实…

CommonJS,AMD,CMD区别 - 郑星阳 - ITeye博客

CommonJS&#xff0c;AMD&#xff0c;CMD区别 博客分类&#xff1a; seajs和requirejs JavaScript zccst转载 学得比较晕&#xff0c;再次看commonjs&#xff0c;amd, cmd时好像还是没完全弄清楚&#xff0c;今天再整理一下&#xff1a; commonjs是用在服务器端的&#xff…

739. Daily Temperatures

根据每日 气温 列表&#xff0c;请重新生成一个列表&#xff0c;对应位置的输入是你需要再等待多久温度才会升高的天数。如果之后都不会升高&#xff0c;请输入 0 来代替。 例如&#xff0c;给定一个列表 temperatures [73, 74, 75, 71, 69, 72, 76, 73]&#xff0c;你的输出应…

【NOIP2018】DAY2T2——填数游戏(轮廓线状压的dp?搜索打表)

描述 小 D 特别喜欢玩游戏。这一天&#xff0c;他在玩一款填数游戏。 这个填数游戏的棋盘是一个n m的矩形表格。玩家需要在表格的每个格子中填入一个数字&#xff08;数字 0 或者数字 1&#xff09;&#xff0c;填数时需要满足一些限制。 下面我们来具体描述这些限制。 为了方…

Mysql中遇到的错误

Caused by: java.sql.SQLException: Unknown system variable ‘tx_isolation’ 这种错误是因为数据库版本新的但是mysql的jar包是旧的&#xff0c;所以导入最新的mysqljar包 注意实体类和数据库字段的映射关系&#xff0c;实体类中使用驼峰式的命名规则&#xff0c;大写的字母…

Express 入门之Router - worldtree_keeper的专栏 - CSDN博客

要了解Router我们需要先知道到Application&#xff0c;首先&#xff0c;每一个express实例本身内部就内建了router&#xff0c;所以我们先从简单的下手&#xff0c;先使用application&#xff1b;另外这里我们只选择get方法&#xff0c;作为我们Router.Method, 之所以使用get是…

rest测试定义

1.为什么要做接口测试&#xff1a; 1.因为很多系统关联都是基于接口实现的&#xff0c;接口测试可以将系统复杂的系统关联进行简化 2.接口工程比较单一&#xff0c;能够比较好的进行测试覆盖&#xff0c;也相对容易实现自动化持续集成 3.接口相对于界面功能 &#xff0c;会更底…

团队开发进度报告9

&#xff08;1&#xff09;站立会议 &#xff08;2&#xff09;任务面板 &#xff08;3&#xff09;具体内容 昨天&#xff1a;完成了界面控件按钮的设置问题&#xff1a;PHP数据处理&#xff0c;如何实现在线数据交互问题今天&#xff1a;hbuilder后台环境搭建 转载于:https:/…

nodejs+express整合kindEditor实现图片上传 - 木子丰咪咕晶 - 开源中国

kindEditor官网上中提供了ASP,ASP.NET,JSP相关的整合应用,http://kindeditor.net/docs/upload.html可以参照实现nodejs的整合,发现实用nodejs更简单 环境: unbuntu 14.10 nodejs 0.10.35 express 4.11.2 formidable 1.0.16 kindEditor 4.1.10 webStorm 8 1.通过IDE或终端创建…

基于springboot多模块项目使用maven命令打成war包放到服务器上运行的问题

首先&#xff0c;大家看到这个问题&#xff0c;可能并不陌生&#xff0c;而且脑子里第一映像就是使用mava中的clear package 或者 clear install进行打包&#xff0c;然后在项目中的target文件夹下面找到xxx.war&#xff0c;将这个war包放到外置的tomcat服务器下的webapps下面&…

Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见。 如果更新数据后&#xff0c;并发访问的情况下可立即感知该更新&#xff0c;称为强一致性 如果允许之后部分或全部感知不到该更新&#xff0c;称为弱一致性。 若在之后的一段时间&…

H5页面随机数字键盘支付页面

H5页面随机数字键盘支付页面 有个H5支付的业务需要随机数字的键盘 参考了下文&#xff1a;https://blog.csdn.net/Mr_Smile2014/article/details/52473351 做了一些小修改&#xff1a; 在原有的基础上&#xff0c;增加了一些按键反馈的效果。 每个按键加上边框。 最终效果&…

expressjs路由和Nodejs服务器端发送REST请求 - - ITeye博客

Nodejs创建自己的server后&#xff0c;我们如果需要从客户端利用ajax调用别的服务器端的数据API的接口&#xff0c;这时候出现了ajax跨域问题。 一种是利用在客户端解决跨域问题 这种方案大家可以去网上查查 另一种方案是在服务器端去请求别的服务器&#xff0c;然后将数据再…

Jmeter操作mysql数据库测试

1. 选中线程组鼠标点击右键添加-->配置元件-->JDBC Connection Configuration&#xff1b; 2. DataBase Connection Configuration配置 Variable Name&#xff1a;配置元件的的所有配置所保存的变量&#xff0c;自定义变量名称(不能使用mysql作为变量名&#xff0c;多个…

axios发送自定义请求头的跨域解决

前端发送来的axios请求信息 this.$axios.request({ url:http://127.0.0.1:8001/pay/shoppingcar/, method:post, headers:{ authenticate:a073b3dabbb140e8b9d28debb6a356a1 # 自定义的请求头部信息键值对, }, # 接上,这种key也算是一种请求头,需要加入django中间件内…

前端“智能”静态资源管理 - Onebox - 博客园

前端“智能”静态资源管理 模块化/组件化开发&#xff0c;仅仅描述了一种开发理念&#xff0c;也可以认为是一种开发规范&#xff0c;倘若你认可这规范&#xff0c;对它的分治策略产生了共鸣&#xff0c;那我们就可以继续聊聊它的具体实现了。 很明显&#xff0c;模块化/组件化…

【转】几张图看懂列式存储

几张图看懂列式存储 转载于:https://www.cnblogs.com/apeway/p/10870211.html

hive -e和hive -f的区别(转)

大家都知道&#xff0c;hive -f 后面指定的是一个文件&#xff0c;然后文件里面直接写sql&#xff0c;就可以运行hive的sql&#xff0c;hive -e 后面是直接用双引号拼接hivesql&#xff0c;然后就可以执行命令。 但是&#xff0c;有这么一个东西&#xff0c;我的sql当中有一个s…

我们是如何做好前端工程化和静态资源管理 - 無雄 - 博客园

我们是如何做好前端工程化和静态资源管理 随着互联网的发展&#xff0c;我们的业务也日益变得更加复杂且多样化起来&#xff0c;前端工程师也不再只是做简单的页面开发这么简单&#xff0c;我们需要面对的十分复杂的系统性问题&#xff0c;例如&#xff0c;业务愈来愈复杂&…