位置: 编程技术 - 正文

详解Javascript 装载和执行(javascript.)

编辑:rootadmin

推荐整理分享详解Javascript 装载和执行(javascript.),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascriptz,javascriptz,javascript 安装,javascript文件怎么安装,javascript软件的安装过程,javascript安装包,javascript 安装,javascript软件的安装过程,内容如对您有帮助,希望把文章链接给更多的朋友!

首先,我想说一下Javascript的装载和执行。通常来说,浏览器对于Javascript的运行有两大特性:1)载入后马上执行,2)执行时会阻塞页面后续的内容(包括页面的渲染、其它资源的下载)。于是,如果有多个js文件被引入,那么对于浏览器来说,这些js文件被被串行地载入,并依次执行。

因为javascript可能会来操作HTML文档的DOM树,所以,浏览器一般都不会像并行下载css文件并行下载js文件,因为这是js文件的特殊性造成的。所以,如果你的javascript想操作后面的DOM元素,基本上来说,浏览器都会报错说对象找不到。因为Javascript执行时,后面的HTML被阻塞住了,DOM树时还没有后面的DOM结点。所以程序也就报错了。

传统的方式

所以,当你写在代码中写下如下的代码:

基本上来说,head里的 <script>标签会阻塞后续资源的载入以及整个页面的生成。我专门做了一个示例你可以看看:示例一。 注意:我的alert.js中只有一句话:alert(“hello world”) ,这更容易让你看到javascript是怎么阻塞后面的东西的。

所以,你知道为什么有很多网站把javascript放在网页的最后面了,要么就是动用了window.onload或是docmuemt ready之类的事件。

另外,因为绝大多数的Javascript代码并不需要等页面,所以,我们异步载入的功能。那么我们怎么异步载入呢?

document.write方式

于是,你可能以为document.write()这种方式能够解决不阻塞的方式。你当然会觉得,document.write了的<script>标签后就可以执行后面的东西去了,这没错。对于在同一个script标签里的Javascript的代码来说,是这样的,但是对于整个页面来说,这个还是会阻塞。 下面是一段测试代码:

你觉得alert的顺序是什么?你可以在不同的浏览器里试一试。这里的想关的测试页面:示例二。

script的defer和async属性

IE自从IE6就支持defer标签,如:

对于IE来说,这个标签会让IE并行下载js文件,并且把其执行hold到了整个DOM装载完毕(DOMContentLoaded),多个defer的<script>在执行时也会按照其出现的顺序来运行。最重要的是<script>被加上defer后,其不会阻塞后续DOM的的渲染。但是因为这个defer只是IE专用,所以一般用得比较少。

而我们标准的的HTML5也加入了一个异步载入javascript的属性:async,无论你对它赋什么样的值,只要它出现,它就开始异步加载js文件。但是, async的异步加载会有一个比较严重的问题,那就是它忠实地践行着“载入后马上执行”这条军规,所以,虽然它并不阻塞页面的渲染,但是你也无法控制他执行的次序和时机。你可以看看这个示例去感受一下。

支持 async标签的浏览器是:Firefox3.6+,Chrome 8.0+,Safari 5.0+,IE +,Opera还不支持(来自这里)所以这个方法也不是太好。因为并不是所有的浏览器你都能行。

动态创建DOM方式

这种方式可能是用得最多的了。

这个方式几乎成了标准的异步载入js文件的方式,这个方式的演示请参看:示例三。这方式还被玩出了JSONP的东东,也就是我可以为script的src指定某个后台的脚本(如PHP),而这个PHP返回一个javascript函数,其参数是一个json的字符串,返回来调用我们的预先定义好的javascript的函数。你可以看一下这个示例:t.js (这个示例是我之前在微博征集的一个异步ajax调用的小例子)

按需异步载入js

详解Javascript 装载和执行(javascript.)

上面那个DOM方式的例子解决了异步载入Javascript的问题,但是没有解决我们想让他按我们指定的时机运行的问题。所以,我们只需要把上面那个DOM方式绑到某个事件上来就可以了。

比如:

绑在window.load事件上——示例四

你一定要比较一下示例四和示例三在执行上有什么不同,我在这两个示例中都专门用了个代码高亮的javascript,看看那个代码高亮的的脚本的执行和我的alert.js的执行的情况,你就知道不同了)

绑在特定的事件上——示例五

这个示例很简单了。当你点击某个DOM元素,才会真正载入我们的alert.js。

更多

但是,绑定在某个特定事件上这个事似乎又过了一点,因为只有在点击的时候才会去真正的下载js,这又会太慢了了。好了,到这里,要抛出我们的终极问题——我们想要异步地把js文件下载到用户的本地,但是不执行,仅当在我们想要执行的时候去执行。

要是我们有下面这样的方式就好了:

可惜的是,这只是一个美丽的梦想,今天我们的Javascript还比较原始,这个“JS梦”还没有实现呢。

所以,我们的程序员只能使用hack的方式来搞。

有的程序员使用了非标准的script的type来cache javascript。如:

因为”cache/script”,这个东西根本就不能被浏览器解析,所以浏览器也就不能把alert.js当javascript去执行,但是他又要去下载js文件,所以就可以搞定了。可惜的是,webkit严格符从了HTML的标准——对于这种不认识的东西,直接删除,什么也不干。于是,我们的梦又破了。

所以,我们需要再hack一下,就像N多年前玩preload图片那样,我们可以动用object标签(也可以动用iframe标签),于是我们有下面这样的代码:

然后,我们在的最后调用一下这个函数。请参看一下相关的示例:示例六

在Chrome下按 Ctrl+Shit+I,切换到network页,你就可以看到下载了alert.js但是没有执行,然后我们再用示例五的方式,因为浏览器端有缓存了,不会再从服务器上下载alert.js了。所以,就能保证执行速度了。

关于这种preload这种东西你应该不会陌生了。你还可以使用Ajax的方式,如:

到这里我就不再多说了,也不给示例了,大家可以自己试试去。

最后再提两个js,一个是ControlJS,一个叫HeadJS,专门用来做异步load javascript文件的。

好了,这是所有的内容了,希望大家看过后能对Javascript的载入和执行,以及相关的技术有个了解。同时,也希望各前端高手不吝赐教!

JavaScript函数详解 简介在很多传统语言(C/C++/Java/C#等)中,函数都是作为一个二等公民存在,你只能用语言的关键字声明一个函数然后调用它,如果需要把函数作为参数

删除Javascript Object中间的key 这个也不会,回家种田去吧你deletethisIsObject[key]ordeletethisIsObject.key顺便我们来谈谈delete的用法几个礼拜前,我有了个机会去翻阅StoyanStefanov的Object-OrientedJav

深入理解javascript变量声明 相对于C/C++来说,ECMAScript里的for循环并不能创建一个局部的上下文。for(varkin{a:1,b:2}){alert(k);}alert(k);//尽管循环已经结束但变量k依然在当前作用域任何时

标签: javascript.

本文链接地址:https://www.jiuchutong.com/biancheng/384799.html 转载请保留说明!

上一篇:FF(火狐)浏览器无法执行window.close()解决方案(火狐firefox浏览器官网)

下一篇:JavaScript函数详解(javascript 函数)

  • 小规模纳税人可以收专票吗
  • 农产品普通发票抵扣政策
  • 本期应纳税额减征额怎么填写
  • 加计扣除是什么意思举例说明农产品
  • 自行研发无形资产暂时性差异
  • 新公司成立后需要办理导航业务吗
  • 存货暂估入账需要什么单据?
  • 逆流交易合并报表抵消分录
  • 购买的固定资产什么时候折旧
  • 代开的专用发票如何开具红字发票
  • 事业单位未取得工资
  • 装修费用如何摊销成本
  • 固定资产账载金额和税收金额的区别
  • 工会经费计入应付职工薪酬
  • 2021虚开发票案例
  • 印花税税目错了能申报更正吗
  • 关于医疗服务质量的医疗服务要素
  • 买卖投资证券基金怎么进行财税处理?
  • 继承房产也需要缴税吗
  • 免税个体户发票税率多少
  • 进口发票怎么认证
  • 洒水车属于免税车辆吗?
  • 营改增后融资租赁税率
  • 分公司开票信息
  • 以前年度的费用可以入在当年吗?
  • 电脑右下角的弹窗怎么关
  • 计提本月短期借款利息1000元
  • 购买交易性金融资产时,支付的交易费用应计入
  • cmos是bios参数设置的
  • win7系统中怎样
  • windows无法验证此设备数字签名
  • PHP:preg_split()的用法_PCRE正则函数
  • smart图形怎么单独设置动画
  • php实现和工作原理
  • uniapp 打开小程序
  • 退休返聘人员算临时工吗
  • yolov5 libtorch
  • win11设置项改中文
  • redissessiondao
  • php静态方法可以被继承吗
  • tr命令详解
  • 充话费如何开公司发票
  • 去年留抵税额会计分录
  • 可供出售的价格基本上可以估计
  • 处理废旧材料会计分录
  • 软件研发费用怎么做账
  • 年资产总额增长怎么算
  • 资产负债表是怎么核对的
  • 应收账款未计提坏账能直接核销
  • 基建账是否为可不并入大账
  • 资产处置收入需要缴纳增值税吗
  • 垃圾清运费会计处理
  • 支付商业承兑汇票怎么做
  • 免税申请需要什么材料
  • 银行日记账记错了怎么办
  • 管理不善造成的存货盘亏损失计入什么科目
  • 固定资产转让开票大类是什么
  • 残疾人保障金的工资按实发还是应发
  • 赡养老人扣除标准个税
  • 银行凭证怎么记账
  • 日记账的建立
  • xp怎么删除电脑系统
  • pavprot.exe - pavprot是什么进程 作用是什么
  • win10怎么关闭讲述人模式
  • android mark
  • 在解决ul居中问题时想到的几点
  • python 爬虫例子
  • bat 截取字符串
  • node.js中的http.request方法使用说明
  • android应用结构包括哪些
  • node的express
  • jquery教程与例子
  • 江苏省国家税务局
  • 中国海关化妆品关税
  • 河南十大纳税公司
  • 国家税务局公告2018年第28号
  • 房屋契税和维修基金是开发商交还是业主交
  • 增值税普票十万怎么开
  • 电子税局个税申报步骤
  • 财务制度备案表单怎么填
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设