关于IE动态加载script的几个注意点

用js动态链接一个外部的js文件,很简单:

var script = document.createElement (“script”);
script.src = “XXX.js”;
document.getElementsByTagName(“head”).item(0).appendChild (script);

但是一个注意的地方是,其实在IE下,执行到script.src = “XXX.js”;这一句代码时,IE已经去加载script代码了,但是不会执行链入的js代码,必须等到插入到document中后,才会执行,而在标准浏览器下,则是在执行插入到document中的代码时才会去加载外部js文件。所以需要注意的是,但你使用了jQuery等第三方js库进行插入的时候尤其要注意,这会导致IE下有两次请求。

本人在IE6,IE9,IE10下亲测IE存在这个问题。

这个网友还对在script标签中设置了src属性,但是script标签对内有内容时浏览器如何处理的问题进行了研究,并通过查找了相关标准给出了答案。

HTML4标准

If the src attribute is not set, user agents must interpret the contents of the element as the script. If the src has a URI value, user agents must ignore the element’s contents and retrieve the script via the URI

文中还提到HTML5标准对动态修改已经存在的script标签的src属性时浏览器应如何处理

Changing the src, type, charset, async, and defer attributes dynamically has no direct effect; these attribute are only used at specific times described below.

文中指的网友文章地址 http://www.w3ctech.com/p/1141,具体内容大家还是看这位网友的原文。

jquery的jsonp请求的callback不能重复执行

如题,今天遇到一个jsonp的问题。和服务器有一个交互的过程,每次交互,都要从服务器去一段数据,并分析数据从而进行下一次的请求。同时这个服务器和当前php程序所在地服务器并非同源。

通过协商,服务器那边的返回结果格式如下

jQuery17105991549867037437_1353939516854(“<xml id=’111111111111111′>ksdfksd</xml>”);

jQuery17105991549867037437_1353939516854(“<xml id=’2222222222222222222′>ksdfksd</xml>”);

其中 jQuery17105991549867037437_1353939516854 是jQuery自动生成的回调函数名。

我在当前html页面的回调函数内设置在控制台输出接受到的参数。按照正常思维,输出应该是

<xml id=’111111111111111′>ksdfksd</xml>

<xml id=’2222222222222222222′>ksdfksd</xml>

但是实际输出的是<xml id=’2222222222222222222′>ksdfksd</xml>。只有第二个回调函数执行了。

 

但是,如果用原生的javascript插入script标签,则callback函数会执行两次。所以估计是jQuery封装所致,目前不知原因,网上亦没有搜到相关内容。所以我打算研究下jQuery源码,一探究竟。到时再补上原因。

 

Firefox的缓存js文件导致js错误

今天整理这一段时间写的代码,发现把一个js文件给删除了,导致了一个功能不能正常使用。于是从别处复制这个js文件,一运行,出现了“XXX is not defined”,检查发现是调用一个外部js文件中的函数,但是函数名称和外部定义的函数名不一致,换成正确的名称,再次运行。悲剧的是任就出现这个“is not defined”的错误。很不解,折腾了半天任就没有解决问题。后来将函数内容复制到php程序中,一刷新,问题解决了。难道是在firefox下面不能调用外部js文件中的函数。后来查了一些资料,说是缓存问题,而且Ctrl+F5都没有效果的。必须手动清理cookie,手动清了cookie,果然解决问题了。