Javascript的装载和执行

通常来说,浏览器对于Javascript的运行有两大特性:

  1. 载入后马上执行
  2. 执行时会阻塞页面后续的内容(包括页面的渲染/其他资源的加载)。于是,如果有多个js文件被引入,那么对于浏览器来说,这些js文件被穿行地载入,并一次执行。

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

传统的方式

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

    <script type="text/javascript" src="http://coolshell.cn/asyncjs/alert.js"></script>

基本上来说,head里的script标签会阻塞后续资源的载入以及整个页面的生成。

所以,你知道为啥那么有很多网站把javascript放在网页的最后面了,要么就是动用window.onload或是$(document).ready(function(){})之类的事件。

另外,因为绝大多数哦的javascrit代码并不需要等页面,即:异步载入。那我们如何异步载入呢?

document.write 方式

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


    <script type="text/javascript" language="javascript">
        function loadjs(script_filename) {
            document.write('<' + 'script language="javascript" type="text/javascript"');
            document.write(' src="' + script_filename + '">');
            document.write('<'+'/script'+'>');
            alert("loadjs() exit...");
        }

        var script = 'http://coolshell.cn/asyncjs/alert.js';

        loadjs(script);
        alert("loadjs() finished!");
    </script>

    <script type="text/javascript" language="javascript">
       alert("another block");
    </script>

依此弹出的对话框为:

loadjs() exit...
loadjs() finished!
hello world
another block

然后才会显示页面。

scriptdeferasync属性

IE自从IE6就支持defer,如:

    <script defer type="text/javascript" src="./alert.js" ></script>

对于IE来说,这个标签会让IE并行下载js文件,并且把其执行hold到了整个DOM装载完毕(DOMContentLoaded),多个deferscript在窒息感时也会按照其出现的顺序来运行。但是因为这个defer只时IE专用,所以一般用的比较少。

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

支持async标签的浏览器是:Firefox3.6+,Chrome8.0+,Safari5.0,IE10+。Opera还不支持参考这里所以这个方法也不是太好。因此不是所有的浏览器你都能行。
这里写图片描述

动态创建DOM方式

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


    function loadjs(script_name){
        var script = doucment.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script.setAttribute('src', script_name);
        script.setAttribute('id', 'my_script_id');

        script_id = document.getElementById('my_script_id');
        if(script_id){
            document.getElementsByTagName('head')[0].removeChild(script_id);
        }
        document.getElementsByTagName('head')[0].appendChild(script);   
    };

    var script = 'http://coolshell.cn/asyncjs/alert.js';
    loadjs(script);

这个方式几乎成了标准的异步载入js文件的方式。

按需异步载入js

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

比如:

1) 绑在window.load 事件上(示例)

window.load = loadjs("http://coolshell.cn/asyncjs/alert.js")

2) 绑在特定的事件上(示例)

<p style="cursor: pointer" onclick="LoadJS()">Click to load alert.js </p>

比如当我们在点击某个DOM元素时,才载入我们的JS文件。

更多

但是,绑定在某个特定事件上这个事似乎又过了点,因此只有在点击的时候才会去真正的下载js,这又会太慢了。,我们想要异步地把嘉实稳键下载到本地,但又不执行,仅当在我们想要执行的时候去执行。

要是我们又下面的方式就好了:


    var script = document.createElement("script");
    script.noexecute = true;
    script.src = "alert.js";
    document.body.appendChild(script);

    //后面我们可以这么干
    script.execute();

可惜的是,这只是一个美丽的梦境,今天我们的javascript还比较原始,这个js梦还没有实现。

所以,我们的程序员只能是哟个hack的方式来搞。

有的程序员使用非标准的script的type来实现。如:

    <script type=cache/script src="./alert.js"></script>

因为“cache/script”,这个东西根本就不能被浏览器歇息,所以浏览器也就不能把alert.jsjavascript执行,但是它又要去下载嘉实稳键,所以就可以搞定了。可惜的是,webkit严格服从了HTML标准–对于这个不认识的东西,直接删除,什么也不干,于是我们的梦又破了。

所以,我们需要在hack以下,就是preload图片那样,我们可以动用object标签(也可以使用iframe标签),于是我们有了下面这样的代码:

    function cachejs(script_filename){
        var cache = document.createElement('object');
        cache.data = script_filename;
        cache.id = "coolshell_script_cache_id";
        cache.width = 0;
        cache.height = 0;
        document.body.appendChild(cache);
    }

示例

在Chrome下按Ctrl+Shift+I。切换到network页,你可以看到下载了alert.js但是没有执行,因为浏览器缓存了,不会再从服务器上下载alert.js,所以,就能保证执行速度了。

最后在提两个js,一个事ControlJs,另一个是HeadJs都是专门用来做异步load javascript文件的。

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在 Android 开发中,Fragment 是界面的一个模块化组件,可用于在 Activity 中灵活地添加、删除或替换。将 ListView 集成到 Fragment 中,能够实现数据的动态加载与列表形式展示,对于构建复杂且交互丰富的界面非常有帮助。本文将详细介绍如何在 Fragment 中使用 ListView。 首先,需要在 Fragment 的布局文件中添加 ListView 的 XML 定义。一个基本的 ListView 元素代码如下: 接着,创建适配器来填充 ListView 的数据。通常会使用 BaseAdapter 的子类,如 ArrayAdapter 或自定义适配器。例如,创建一个简单的 MyListAdapter,继承自 ArrayAdapter,并在构造函数中传入数据集: 在 Fragment 的 onCreateView 或 onActivityCreated 方法中,实例化 ListView 适配器,并将适配器设置到 ListView 上: 为了提升用户体验,可以为 ListView 设置点击事件监听器: 性能优化也是关键。设置 ListView 的 android:cacheColorHint 属性可提升滚动流畅度。在 getView 方法中复用 convertView,可减少视图创建,提升性能。对于复杂需求,如异步加载数据,可使用 LoaderManager CursorLoader,这能更好地管理数据加载,避免内存泄漏,支持数据变更时自动刷新。 总结来说,Fragment 中的 ListView 使用涉及布局设计、适配器创建与定制、数据绑定及事件监听。掌握这些步骤,可构建功能强大的应用。实际开发中,还需优化 ListView 性能,确保应用流畅运
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值