如何确保JavaScript的执行顺序 之jQuery.html深度分析

 更新时间:2011年03月03日 11:59:57   作者:  
在上一篇文章《如何确保JavaScript的执行顺序 - 之实战篇》中,我们发现jQuery的html函数能够确保动态加载的JavaScript按照引入顺序执行。

我们先来简单回顾下HTML源代码(test2.htm):

复制代码 代码如下:

<html>
<head>
<title></title>
<script src="js/jquery-1.4.4.js" type="text/javascript"></script>
<script>
$(function(){
$('#container').html('<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text\/javascript"><\/script>' + '<script>alert(typeof(jQuery.ui));<\/script>');
});
</script>
</head>
<body>
<div id="container">
</div>
</body>
</html>

2.调试,单步跟进
逐行分析jQuery源代码是一件相当枯燥的事情。我这里会以test2.htm为目标,调试进入jQuery源代码。
1) 首先在html: 打一个断点,刷新页面

这里的value是字符串:"<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text/javascript"></script><script>alert(typeof(jQuery.ui));</script>"
我们来看会进入那个条件分支:首先看看rnocache是啥?

可见value中含有 <script 字符串,不会进入第二个条件分支。
2) 进入html函数的最后一个条件分支

来看看append函数:

3) 进入domManip函数

继续单步调试,发现目标,这里有对scripts的长度判断:

应该是已经分析了输入字符串,并提取了其中的script标签,我们来看下这里的局部变量scripts的内容:

4)发现目标
这里的两个局部变量scripts和evalScript是我们重点需要关注的,我们分别来看下:
scripts,这是一个数组,包含两个script标签:
[<script src=​"./​service.ashx?file=js/​jquery-ui.js&delay=2000" type=​"text/​javascript">​</script>​
, <script>​alert(typeof(jQuery.ui));​</script>​]
evalScript,这是一个函数,通过jQuery.each函数来调用,上述数组中的每个值都会作为参数传到这个函数中执行:

复制代码 代码如下:

function evalScript( i, elem ) {
if ( elem.src ) {
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});
} else {
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
}
if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}

3. 哦,明白了
通过上面的分析,我们清楚的看到jQuery.html函数会首先把其中的script检索出来,然后对于每个script标签应用evalScript函数。
在这个函数中,对于外部JavaScript个内联JavaScript,进行了不同的处理。
1)jQuery.html如何处理字符串中的外部script标签
复制代码 代码如下:

jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});

对于外部script标签,比如:<script src="./service.ashx?file=js/jquery-ui.js&delay=2000" type="text/javascript"></script>,jQuery采用了同步Ajax方案(async: false)。这也是在各种不同浏览器中能够保证动态JS的加载顺序的关键所在。
2)jQuery.html如何处理字符串中的内联script标签
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
来看下globalEval函数的定义:

由此可见,对于内联的script标签,jQuery通过在head中创建script标签来执行。
4. 后记
目前来看,一切来龙去脉似乎清晰可见。那么大家有没有考虑过,如果动态加载加载不同域名下(Cross-Domain)的JavaScript文件,jQuery还能确保在所有浏览器下的JavaScript的执行顺序吗?
也就是说在当前流行的静态资源的CDN加速情况下,jQuery.html是不是一个完全之策呢?
请看下篇 如何确保JavaScript的执行顺序 - 之jQuery.html并非万能钥匙。待续。。。

相关文章

  • JQuery获取元素尺寸、位置及页面滚动事件应用示例

    JQuery获取元素尺寸、位置及页面滚动事件应用示例

    这篇文章主要介绍了JQuery获取元素尺寸、位置及页面滚动事件应用,结合实例形式分析了jQuery针对页面元素动态操作相关实现技巧,并给出了购物车动画效果案例进行总结,需要的朋友可以参考下
    2019-05-05
  • 实例详解jQuery的链式编程风格

    实例详解jQuery的链式编程风格

    jQuery中的链式操作,它让代码变得更有层次更简洁,所以这篇文章主要给大家介绍了关于jQuery链式编程风格的相关资料,需要的朋友可以参考下
    2021-06-06
  • 仿JQuery输写高效JSLite代码的一些技巧

    仿JQuery输写高效JSLite代码的一些技巧

    这篇文章主要介绍了仿JQuery输写高效JSLite代码的一些技巧,本文计划根据他人对jQuery总结的一些速度方面的技巧和一些建议,来教你提升你的JSLite和javascript代码,需要的朋友可以参考下
    2015-01-01
  • jquery等待效果示例

    jquery等待效果示例

    这篇文章主要介绍了jquery等待效果示例,需要的朋友可以参考下
    2014-05-05
  • jquery实现的鼠标下拉滚动置顶效果

    jquery实现的鼠标下拉滚动置顶效果

    鼠标下拉滚动置顶效果想必大家在浏览网页时都有遇到过,下面有个不错的小例子,需要的朋友可以参考下
    2014-07-07
  • jQuery实现鼠标移入显示蒙版效果

    jQuery实现鼠标移入显示蒙版效果

    这篇文章主要为大家详细介绍了jQuery实现鼠标移入显示蒙版效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • jQuery+json实现的简易Ajax调用实例

    jQuery+json实现的简易Ajax调用实例

    这篇文章主要介绍了jQuery+json实现的简易Ajax调用,结合实例形式分析了jQuery基于ajax实现json传参调用的技巧,需要的朋友可以参考下
    2015-12-12
  • 限制上传文件大小和格式的jQuery插件实例

    限制上传文件大小和格式的jQuery插件实例

    这篇文章主要介绍了限制上传文件大小和格式的jQuery插件,实例分析了对上传文件的大小及格式的限制功能,非常具有实用价值,需要的朋友可以参考下
    2015-01-01
  • JQuery选择器绑定事件及修改内容的方法

    JQuery选择器绑定事件及修改内容的方法

    这篇文章主要介绍了JQuery选择器绑定事件及修改内容的方法,涉及bind()、show()、hide()、html()等方法的使用技巧,需要的朋友可以参考下
    2015-01-01
  • jquery操作checked属性以及disabled属性的多种方法

    jquery操作checked属性以及disabled属性的多种方法

    这篇文章主要介绍了jquery控制checked属性以及disabled属性的多种方法,下面只提到checked,其实disabled在jquery里的用法和checked是一模一样的,需要的朋友可以参考下
    2014-06-06

最新评论