写个js/css动态加载的JavaScript插件

简介: 由于现在手上项目没用到jQuery,以及希望能动态加载js/css所以就写了动态加载的脚本原理简介:通过给定的url参数中js/css文件的后缀动态插件节点通过参数绑定添加到的父级节点绑定节点加载onload 和 onerror事件执行文件加载成功或失败事件1.

由于现在手上项目没用到jQuery,以及希望能动态加载js/css
所以就写了动态加载的脚本
原理简介:
通过给定的url参数中js/css文件的后缀动态插件节点
通过参数绑定添加到的父级节点
绑定节点加载onload 和 onerror事件执行文件加载成功或失败事件

1.JavaScript创建节点添加到body或head

添加js的代码:

var n = document.createElement("script");
n.setAttribute("type", "text/javascript");
n.setAttribute("src", i);
document.body.appendChild(n); 
document.head.appendChild(n);

写个用来动态添加节点js的代码:

/*
es6 中 函数设置默认参数可以使用 例:function 函数名(变量= 默认值) {...}
如果想要兼容可以使用 例:function 函数名(变量) {if(变量==undefined){变量= 默认值}....}
*/
function cr_node(i, l = "body") { //创建节点并添加
    t = i.split(".").reverse()[0];//获取后缀
    var n = null;
    if (t == "js") {//后缀判断
        n = document.createElement("script");
        n.setAttribute("type", "text/javascript");
        n.setAttribute("src", i);
    } else if (t == "css") {
        n = document.createElement("link");
        n.setAttribute("rel", "stylesheet");
        n.setAttribute("href", i);
    }
    if (n != null) {
        if (l == "body") {
            document.body.appendChild(n);
        } else if (l == "head") {
            document.head.appendChild(n);
        } else {
            l.appendChild(n);
        }
    }
    return n;
}

使用示例:

//添加bootstrap样式
cr_node("http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css","head")

//默认添加jquery到<body>...</body>
cr_node("http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js");

//添加jquery到<head>...</head>
cr_node("http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js","head");

//添加jquery到<div id="id">...</div>
cr_node("http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js",document.getElementById("id"))

2.添加绑定事件函数

添加单个节点并绑定 事件

function cr_node(i, l = "body") {....}
function addNode(o, c = undefined) { //单个添加
    var n = null;
    if(typeof(o) == "object") {
        n = cr_node(o.src, (o.parent ? o.parent : "body"));
        if(typeof(o.load) == "function") {
            n.onload = o.load; //绑定加载事件
        }
        if(typeof(o.err) == "function") {
            n.onerror = o.err; //绑定错误事件
        }
    } else if(typeof(o) == "string") {
        n = cr_node(o); //直接添加节点
        if(typeof(c) == "function") {
            n.onerror = n.onload = c; //绑定加载事件
        }
    }
}

使用说明:

//直接使用
addNode("http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js",function(){...});
//完整使用
addNode({
    "src": "http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js",
    "load": function() {
        console.log("加载成功");
        console.log($("body").html());
    },
    "err":function() {
        console.log("加载失败");
    },
    "parent": document.getElementById("id")//不写默认是body
})

3.尝试写个批量添加的函数

如果仅仅是添加可以使用以下函数:

function addNodes(o, index = 0) { //多个添加
    if (o.src.length > index && typeof(o.src) == "object" && o.src.length > 0) {
        var n = cr_node(o.src[index], o.parent);
        if (o.src.length - 1 == index && typeof(o.load) == "function") {
            n.onerror = n.onload = o.load;
        } else {
            n.onerror = n.onload = function() {
                addNodes(o, index + 1);
            }
        }
    }
}

使用示例:

addNodes({
 "src":["http://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.css","http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js","http://cdn.bootcss.com/jquery-cookie/1.4.1/jquery.cookie.min.js","http://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"],
"parent":"head", 
"load":function(){
 console.log(1111);
   console.log($("body").html());
 }
})

动态插入节点加载js/css,其实是异步加载,所以在批量加载中我使用类似同步加载的办法来保证所有文件加载完成后调用函数,防止异步造成文件为读取完就执行导致的报错
如果大家也有好的办法欢迎留言。

相关文章
|
4天前
|
前端开发 JavaScript 索引
CSS常见用法 以及JS基础语法
CSS常见用法 以及JS基础语法
12 0
|
6天前
|
JavaScript 前端开发
js和css以及js制作弹窗
js和css以及js制作弹窗
11 1
|
6天前
|
JavaScript
js的插件
js的插件
12 1
|
10天前
|
JSON JavaScript 前端开发
使用JavaScript和XLSX.js将数据导出为Excel文件
使用JavaScript和XLSX.js将数据导出为Excel文件
21 0
|
12天前
|
JavaScript 前端开发 开发工具
【JavaScript 技术专栏】Node.js 基础与实战
【4月更文挑战第30天】本文介绍了Node.js的基础及应用,包括事件驱动的非阻塞I/O、单线程模型和模块系统。内容涵盖Node.js的安装配置、核心模块(如http、fs、path)及实战应用,如Web服务器、文件操作和实时通信。文章还讨论了Node.js的优劣势、与其他技术的结合,并通过案例分析展示项目实施流程。总结来说,Node.js是高效后端开发工具,适合构建高并发应用,其广阔的应用前景值得开发者探索。
|
13天前
|
JSON JavaScript 前端开发
深入探讨javascript的流程控制与分支结构,以及js的函数
深入探讨javascript的流程控制与分支结构,以及js的函数
|
14天前
|
前端开发 JavaScript
使用html+css+javaScript 完成计算器
使用html+css+javaScript 完成计算器
|
17天前
|
前端开发 JavaScript
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
前端 富文本编辑器原理——从javascript、html、css开始入门
28 0
前端 富文本编辑器原理——从javascript、html、css开始入门(二)
|
17天前
|
前端开发 JavaScript 索引
前端 富文本编辑器原理——从javascript、html、css开始入门(一)
前端 富文本编辑器原理——从javascript、html、css开始入门
36 0
|
19天前
|
JavaScript 前端开发 算法
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
在开发中,采用简洁的语法和结构,遵循一致的命名规范,具有良好的代码组织和注释,能很好的提高代码的质量。可读性:易于阅读和理解。清晰的命名、简洁的语法和良好的代码结构可以使代码的意图更加明确,降低理解代码的难度,提高代码的可读性。可维护性:易于维护。当代码逻辑清晰、结构简洁时,开发者可以更快速地定位和修复bug,进行功能扩展或修改。同时,可读性高的代码也有助于后续的代码重构和优化。可扩展性:更具有扩展性和灵活性。清晰的代码结构和简洁的代码风格使得添加新功能、修改现有功能或扩展代码更加容易。
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >