动态加载JS脚本【转】

原文:http://mario-design.iteye.com/blog/147810

要实现动态加载JS脚本有4种方法:

1、直接document.write

<script language="javascript"> document.write("<script src='test.js'><\/script>"); 
</script> 

注意document.write中的<\/script>,斜杠要转义

2、动态改变已有script的src属性

<script src='' id="s1"></script> 
<script language="javascript"> s1.src="test.js" 
</script> 

3、动态创建script元素

<script> var oHead = document.getElementsByTagName('HEAD').item(0); var oScript= document.createElement("script"); oScript.type = "text/javascript"; oScript.src="test.js"; oHead.appendChild( oScript); 
</script> 

这三种方法都是异步执行的,也就是说,在加载这些脚本的同时,主页面的脚本继续运行,如果用以上的方法,那下面的代码将得不到预期的效果。

要动态加载的JS脚本:a.js,以下是该文件的内容。

var str = "中国"; 
alert( "这是a.js中的变量:" + str ); 

主页面代码:

<script language="JavaScript"> 
function LoadJS( id, fileUrl ) 
{ var scriptTag = document.getElementById( id ); var oHead = document.getElementsByTagName('HEAD').item(0); var oScript= document.createElement("script"); if ( scriptTag  ) oHead.removeChild( scriptTag  ); oScript.id = id; oScript.type = "text/javascript"; oScript.src=fileUrl ; oHead.appendChild( oScript); 
} 
LoadJS( "a.js" ); 
alert( "主页面动态加载a.js并取其中的变量:" + str ); 
</script> 

上述代码执行后 a.js 的 alert 执行并弹出消息,

 

但是 主页面产生了错误,没有弹出对话框。原因是 'str' 未定义,为什么呢?因为主页面在取 str 的时候 a.js 并没有完全加载成功。遇到需要同步执行脚本的时候,可以用下面的第四种方法。

4、原理:用XMLHTTP取得要脚本的内容,再创建 Script 对象。

注意:a.js必须用UTF8编码保存,要不会出错。因为服务器与XML使用UTF8编码传送数据。

主页面代码:

<script language="JavaScript"> 
function GetHttpRequest() 
{ if ( window.XMLHttpRequest ) // Gecko return new XMLHttpRequest() ; else if ( window.ActiveXObject ) // IE return new ActiveXObject("MsXml2.XmlHttp") ; 
} 
function AjaxPage(sId, url){ var oXmlHttp = GetHttpRequest() ; oXmlHttp.OnReadyStateChange = function()  { if ( oXmlHttp.readyState == 4 ) { if ( oXmlHttp.status == 200 || oXmlHttp.status == 304 ) { IncludeJS( sId, url, oXmlHttp.responseText ); } else { alert( 'XML request error: ' + oXmlHttp.statusText + ' (' + oXmlHttp.status + ')' ) ; } } } oXmlHttp.open('GET', url, true); oXmlHttp.send(null); 
} function IncludeJS(sId, fileUrl, source) 
{ if ( ( source != null ) && ( !document.getElementById( sId ) ) ){ var oHead = document.getElementsByTagName('HEAD').item(0); var oScript = document.createElement( "script" ); oScript.language = "javascript"; oScript.type = "text/javascript"; oScript.id = sId; oScript.defer = true; oScript.text = source; oHead.appendChild( oScript ); } 
} 
AjaxPage( "scrA", "b.js" ); 
alert( "主页面动态加载JS脚本。"); 
alert( "主页面动态加载a.js并取其中的变量:" + str ); 
</script> 

现在完成了一个JS脚本的动态加载。

转载于:https://www.cnblogs.com/walkerwang/archive/2011/06/01/2067129.html

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

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

相关文章

如何将Eclipse中的开源项目使用到Android Studio中

近几日&#xff0c;笔者用到了一些开源项目&#xff0c;比如著名的PTR项目。但是在使用的过程中&#xff0c;遇到了一些问题。 这个开源库是在Eclipse上面写的&#xff0c;我们现在开发用的是Android stuido。 两种软件的项目结构是不同的&#xff0c;那么怎么把PTR用到我们的项…

EditPlus常用快捷键

From: http://katrina.blog.51cto.com/709863/144111 editplus占内存比较小&#xff0c;加载速度快&#xff0c;很强大。文本类&#xff1a;新建普通文本 CtrlN 新建普通的文本(经常建立一个新脚本平时很容易遇到)新建浏览器窗口 CtrlShiftB 新建浏览器…

[react] super()和super(props)有什么区别?

[react] super()和super(props)有什么区别&#xff1f; react 中的class 是基于es6的规范实现的, 继承是使用extends关键字实现继承的&#xff0c;子类必须在constructor()中调用super() 方法否则新建实例 就会报错&#xff0c;报错的原因是 子类是没有自己的this对象的&#…

VC实现表单提交并设置获取COOKIE:

可以尝试通过 HttpAddRequestHeaders 来添加自已的COOKIE: char * lpszHeaders "Cookie: Keysomevalue"; DWORD dwHeadersLength strlen(lpszHeaders); HttpAddRequestHeaders(hOpenRequest, lpszHeaders, dwHeadersLength, HTTP_ADDREQ_FLAG_A…

STM32 网络通信Web Server中 SSI与CGI的应用解析

本次主要解析STM32网络通信中WebServer应用&#xff0c;从网页界面的编写到浏览器与STM32之间进行通信的数据来说明SSI与CGI的原理及应用&#xff0c;并对GET与POST指令进行应用解析。 硬件和软件环境&#xff1a; 1.硬件环境&#xff1a;STM32F407&#xff0c;网卡芯片LAN87…

ggg

ggg转载于:https://www.cnblogs.com/britphy/p/4744739.html

树莓派SSH 连接不上:socket error Event:32 Error:10053

问题如下&#xff1a; 解决办法&#xff1a;ssh文件夹下的文件权限问题。 cd /etc/ssh sudo chmod 0644 * sudo chmod 0600 ssh_host_ecdsa_key ssh_host_rsa_key登陆成功&#xff1a;

嵌入式设备web服务器比较

现在在嵌入式设备中所使用的web服务器主要有&#xff1a;boa、thttpd、mini_httpd、shttpd、lighttpd、goaheand、appweb和apache等。 Boa 1.介绍 Boa诞生于1991年&#xff0c;作者Paul Philips。是开源的&#xff0c;应用很广泛&#xff0c;特别适合于嵌入式设备&#xff0c…

UML造型——使用EA时序图工具的开发实践和经验

Enterprise Architect&#xff08;下面简称EA&#xff09;是一款基于OMG UML的可视化模型与设计工具。提供了对软件系统的设计和构建、业务流程建模和基于领域建模的支持&#xff0c;被企业和组织不仅应用于对系统的建模&#xff0c;还用于推进模型在整个应用程序开发周期中实现…

Qt QInputDialog文本输入对话框示例

1、代码如下 //引入头文件: #include <QInputDialog>//...//...//...//具体用法&#xff1a; bool isOK;//QInputDialog 是否成功得到输入 QString text QInputDialog::getText(NULL, "参数设定", "输入单次召测统计时间&#xff0c;eg.\"0:0:…

winform 与WPF

winform 与WPF 在多线程上的改进性能没大区别&#xff0c;WPF 是富客户端&#xff0c;winform是常见的客户端&#xff0c;就是说wpf实现一些绚丽界面比winform更容易&#xff0c;这就是他们的区别&#xff0c;当然wpf是微软取代winform的客户端技术&#xff0c;所以在一些数据绑…

[react] 怎样将事件传递给子组件?

[react] 怎样将事件传递给子组件&#xff1f; 这道题出的有问题。 一般情况下我们父组件向子组件传递的不是事件&#xff0c;而是事件处理函数 const Parent ({ lastName }) > {onClick () {console.log(event handler in parent)}return <Child lastName{lastName} o…

EF 6 code first - 从SQL server迁移到MySQL

最近鼓捣一个SaaS项目&#xff0c;后台用的是entity framework 6 code first &#xff0b;SQL server&#xff0c;需要把数据库迁移到MySQL&#xff0c;在这里记录一下遇到的问题。时间比较久了记得不是很准确&#xff0c;供参考。 1&#xff0c; 以前残留的Migration .cs文件&…

三种嵌入式web服务器(Boa / lighttpd / shttpd)的 linux移植笔记

一&#xff1a;移植Boa(web服务器)到嵌入式Linux系统 一、Boa程序的移植 1、下载Boa源码 下载地址: http://www.boa.org/ 目前最新发行版本&#xff1a; 0.94.13 &#xff08;几年没更新版本了&#xff09; 下载 boa-0.94.13.tar.gz&#xff0c; 注意&#xff…

单元测试工具Numega BoundsChecker

From: http://blog.csdn.net/wangweitingaabbcc/article/details/7794985 1 前言 我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。 NuMega是一个动态测试工具&#xff0c;主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuM…

Qt split字符串分割

1、需求 从指定格式的时间字符串中提取关键参数。 2、实现 调用字符串的split方法 QString text "12:14:35"; QStringList list text.split(":");int hour list[0].toInt(); int min list[1].toInt(); int sec list[2].toInt();

在Codeigniter框架中使用NuSOAP

0、NuSOAP的简介 NuSOAP 是一组功能强大的PHP类&#xff0c;这个工具的发布让使用和创建SOAP消息变得相当简单。 NuSOAP有Dirtrich Ayala编写&#xff0c;可以无缝的与许多最流行的SOAP服务实现交互&#xff0c;它以LGPL协议进行发布。NuSOAP的主要特性包括&#xff1a; 简单&a…

[react] 你有使用过loadable组件吗?它帮我们解决了什么问题?

[react] 你有使用过loadable组件吗&#xff1f;它帮我们解决了什么问题&#xff1f; 目前有两个 react-loadable和 loadable component&#xff0c;用于代码分割&#xff0c;解决打包体积过大的问题 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易…

JAVA运行程序代码段

我记得那时候刚毕业。学习JAVA恐惧是这里&#xff0c;它是关于JAVA称号。我总是不正确。如今&#xff0c;这最后审查。看了好半天。得赶紧把刚才学习到的那点东西记下来。 一、关于static的代码段运行顺序 运行结果例如以下&#xff1a; Inside main() Mug(1) Mug(2) c1 & …

Keil使用PC-Lint

Keil使用PC-Lint 随着项目的推进与迭代&#xff0c;一个Project的代码量往往会不知不觉增长&#xff0c;当项目代码达到数万行&#xff0c;迭代经历较长时间后&#xff0c;仅靠开发人员自身的代码质量已不能满足对整体质量的把控。难以避免会出现一些潜在的逻辑错误与非逻辑错误…