视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
改造传统jquery扩展为layui模块方法介绍
2020-11-03 23:09:27 责编:小采
文档


Layui中内置了jquery

只有你所使用的模块有依赖到它,它才会加载,并且如果你的页面已经script引入了jquery,它并不会重复加载。内置的jquery模块去除了全局的$和jQuery。

这是layui文档中的描述,它内置了jq,但是去除了全局的$和jQuery对象,也就是在window的全局对外接口被删除了。

拖拽组件的实现
假设siam.js是一个扩展,里面提供了一个类似这样的方法

<div id='test'>原始内容</div>

<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.min.js"></script>
<script>
$.fn.siam = function(params){
 var dom = this;
 dom.html(params);
};


setTimeout(function(){
 $("#test").siam('这是新内容');
},800);
</script>
// 延迟执行完之后会把div内容变为 > 这是新内容

这就是一些传统jq扩展的实现原理,对于你调用的dom,它会继续处理操作,如本文开始说的,我使用的是拖拽组件,扩展会通过这样子的对外接口 将dom处理为可以拖拽的,并且带有其他事件的元素。

问题冲突

以上两点是问题的基础补充,在layui中,去除了全局的$和Jquery对象,默认扩展中有以下代码

;(function($, window, document, undefined){
 .....扩展内容
})(window.jQuery || window.Zepto, window, document);

在最后面,它依赖加载window.Jquery对象,window对象,document对象

传递到上面的闭包中
对应$, window, document, undefined(因为没有传递 所以也一样)

所以导致闭包中使用的$是没有值的,一加载这个扩展就报错

$ is not defined
或者
Typeerror Cannot Read Property fn of undefined

测试过单独引入jq文件也解决不了问题,(我使用的模板加载顺序的原因,先加载了layui内置的jq)

layui自定义模块

这是官网的介绍

layui.code
/**
 扩展一个test模块
**/

layui.define(function(exports){ //提示:模块也可以依赖其它模块,如:layui.define('layer', callback);
 var obj = {
 hello: function(str){
 alert('Hello '+ (str||'mymod'));
 }
 };

 //输出test接口
 exports('mymod', obj);
});

我们可以使用layui自定义模块的方法,将layui的其他模块传递进来,使扩展能操作layui中的jq对象

layui.define(["jquery"], function (exports) {
 var $ = layui.jquery;
 // 把第一行的 ;(function($, window, document, undefined){ 换成以上
 ...扩展内容

 // 把最后一行的换成以下
 var obj = {
 };
 exports("自定义模块名", obj);
});

使用

 layui.use(['form','jquery','自定义模块名'], function (admin, form) {
 var $ = layui.jquery;
 var obj = layui.自定义模块名;

 // 正常使用 即可 比如我的
 $("#test").desta('open');
});

注意,此篇文章并不是通用方法,只是简单阐述了我解决这个问题的思路和方案,可以参考学习。

更多layui框架知识请关注layui框架教程。

下载本文
显示全文
专题