Layui模块化,改造传统jquery扩展为layui模块

简介: 在我使用jquery扩展,拖拽组件的时候,因为使用的布局模板有些冲突,导致无法使用扩展,所以才会解决之后写下这篇文章。 Layui中内置了jquery 只有你所使用的模块有依赖到它,它才会加载,并且如果你的页面已经script引入了jquery,它并不会重复加载。内置的jquery模块去除了全局的和jQuery。这是layui文档中的描述,它内置了jq,但是去除了全局的和jQuery对象,也就是在window的全局对外接口被删除了。 拖拽组件的实现 假设siam.js是一个扩展,里面提供了一个类似这样的方法

此篇文章比较偏向笔记类型


在我使用jquery扩展,拖拽组件的时候,因为使用的布局模板有些冲突,导致无法使用扩展,所以才会解决之后写下这篇文章。 Layui中内置了jquery 只有你所使用的模块有依赖到它,它才会加载,并且如果你的页面已经script引入了jquery,它并不会重复加载。内置的jquery模块去除了全局的jQuerylayuijq和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');
});


注意,此篇文章并不是通用方法,只是简单阐述了我解决这个问题的思路和方案,可以参考学习,如果有其他类型的相似问题欢迎留言一起交流

目录
相关文章
|
4月前
|
JavaScript 前端开发
如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!
如何在Vue 2或Vue 3项目中引入jQuery及其动画扩展库jQuery.easing,以实现更丰富的动画效果。
191 0
如何在Vue2.X/Vue3.X项目引入jQuery,以及增加jQuery.easing扩展?让你的动画效果更加丝滑!
|
7月前
|
Java 数据库 Maven
基于SSM框架流浪动物救助及领养管理系统(spring+springmvc+mybatis+jsp+jquery+layui)
基于SSM框架流浪动物救助及领养管理系统(spring+springmvc+mybatis+jsp+jquery+layui)
146 0
|
7月前
|
Java 数据库 Maven
SSM汽车租赁管理系统(spring+springmvc+mybatis+mysql+jsp+jquery+layui)
SSM汽车租赁管理系统(spring+springmvc+mybatis+mysql+jsp+jquery+layui)
|
JavaScript
layUI下使用jQuery
layUI下使用jQuery
|
编解码 移动开发 前端开发
【JQuery】扩展BootStrap入门——知识点讲解(一)
本期主要介绍扩展BootStrap入门——知识点讲解(一)
146 0
【JQuery】扩展BootStrap入门——知识点讲解(一)
|
前端开发 JavaScript iOS开发
【JQuery】扩展BootStrap入门——知识点讲解(二)
本期主要介绍扩展BootStrap入门——知识点讲解(二)
137 0
【JQuery】扩展BootStrap入门——知识点讲解(二)
|
JavaScript 前端开发 开发者
jQuery_可见性过滤 jQuery 扩展|学习笔记
快速学习 jQuery_可见性过滤 jQuery 扩展
213 0
jQuery_可见性过滤 jQuery 扩展|学习笔记
|
JavaScript
【Layui】使用jquery
【Layui】使用jquery
186 0
|
JSON JavaScript 前端开发
jQuery系列 第八章 jQuery框架Ajax模块
第八章 jQuery框架Ajax模块 8.1 jQuery框架中的Ajax简介 Ajax技术的核心是XMLHTTPRequest对象,该对象是Ajax实现的关键,发送异步请求、接收服务器端的响应以及执行回调等操作都是通过XMLHTTPRequest对象来完成的。
1349 0