热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让你基于jQuery的插件兼容commonjs,amd范例

事变是如许的,我写了一个基于jQuery的插件,在传统的开辟形式中,我们须要如今页面引入jQuery.js,然后在引入我们的插件,我们的插件才运用。然则跟着webpack的鼓起,我

事变是如许的,我写了一个基于jQuery的插件,在传统的开辟形式中,我们须要如今页面引入jQuery.js,然后在引入我们的插件,我们的插件才运用。然则跟着webpack的鼓起,我不在想一步步的写入script标签,写着一堆的script标签。然则我们晓得这些都有着模块范例。比如在node环境中我们常常如许写:var example = require(‘./example.js’);那末就让我们的插件也支撑如许的写法吧。

先看传统式jQuery插件的写法。(jquery的插件有许多种写法,这里就不过量议论)

;(function($,window){
var plugin=function(){
}
plugin.prototype={
a:function(){
},
b:function(){
}
}
window.plugin=plugin;
})($,window)

如许我们在页面中如许写:

var p = new plugin()

题目来了,我都是用webpack来打包js文件的,怎样能够经由过程require(’./plugin.js’)的体式格局来引入我的插件呢?

node的模块范例是commonjs,这些我们是晓得的,网上也有很引见,鄙人就不多哔哔了。然则题目来了,网上许多只是引见怎样把一个模块导出,然则当你的模块依靠某个模块时,这时候该怎样处置惩罚?

先看一段代码

(function(window,$){
var mtable = function (opt, data) {
this.tableId = opt.tableid;
this.tableClass = opt.tableclass;
this.tableParent = opt.tableparent;
......
this.mergeCells = opt.mergeCells || false;
if (this instanceof mtable) {
this.init();
return this;
} else {
return new mtable(opt, data).init()
}
} mtable.prototype = {
constructor: mtable,
init: function () {
var that = this;
that.createTable();
//兼并单元格
if (this.mergeCells == true) {
mtable.MergeCell(that.tableId)
}
this.addEventDom();
this.removeEventDom();
},
addEventDom: function () {
var that = this;
//在这里我们运用了jquery
$(this.addDom).on('click', function () {
console.log("最先临盆表格...")
that.createTable();
})
}
}
})(window,$)

接着我们尝试着在闭包函数中,写写兼容模块,让函数能被导出去

//兼容模块
if(typeof module !=='undefined' && typeof exports ==='object'){
module.exports=mtable;
}else if(typeof define ==='function' && (define.amd || define.cmd)){
define(function(){
return mtable;
})
}else{
window.mtable=mtable;
}

然则我们经由过程 var mtable = require('mtable')时,经由webpack打包,会发明览器毛病提醒$ is not defined
既然$ is not defined 申明我们并没把jQuery这个参数传进去。

在换种体式格局call()函数,对,你没看错,这个要领常常被人拿出来引见。。。

//如果是在node环境中,经由过程require引入jQuery中,如果是在浏览器中,就经由过程window体式格局通报jQuery
if(typeof module !=='undefined' && typeof exports ==='object'){
var $=require('jquery');
}else{
var $=window.$
}
(function(){
var mtable = function (opt, data) {
this.tableId = opt.tableid;
this.tableClass = opt.tableclass;
this.tableParent = opt.tableparent;
this.table;
this.theade = opt.theade;
this.addDom = opt.adddom;
this.removeDom = opt.removedom;
this.data = data;
this.mergeCells = opt.mergeCells || false;
if (this instanceof mtable) {
this.init();
return this;
} else {
return new mtable(opt, data).init()
}
}
mtable.prototype = {
constructor: mtable,
init: function () {
var that = this;
that.createTable();
//兼并单元格
if (this.mergeCells == true) {
mtable.MergeCell(that.tableId)
}
this.addEventDom();
this.removeEventDom();
return this;
},
createTable: function () {
var that = this;
var t = createTable({
id: that.tableId,
class: that.tableClass
}, that.data, that.theade);
if (this.tableParent != null && this.tableParent != '') {
$(this.tableParent).append(t)
} else {
document.body.appendChild(t);
}
},
addEventDom: function () {
var that = this;
//var tableObj=document.getElementById('m');
$(this.addDom).on('click', function () {
console.log("最先临盆表格...")
that.createTable();
})
},
removeEventDom: function () {
$(this.removeDom).on('click', function () {
})
}
}
$.each(data, function (index, item) {
var tr = document.createElement("tr");
for (var i in item) {
console.log(item)
var td = document.createElement("td");
td.innerHTML = item[i];
tr.appendChild(td);
}
tbody.appendChild(tr);
});
vtable.appendChild(tbody);
return vtable;
}
}
//兼容模块
if(typeof module !=='undefined' && typeof exports ==='object'){
module.exports=mtable;
}else if(typeof define ==='function' && (define.amd || define.cmd)){
define(function(){
return mtable;
})
}else{
window.mtable=mtable;
}
}).call(function(){
return (typeof window !=='undefined' ? window : global )
},$)//传入$

不论是在node中,照样在浏览器中都能够引用了。

示例


var mtable=require("../lib/easyTable");
var data = [
{ 'a': '小明', 'b': '100' },
{ 'a': '小明', 'b': '250' },
{ 'a': '小明', 'b': '260' },
{ 'a': '小明', 'b': '270' },
{ 'a': '小花', 'b': '90' },
{ 'a': '小花', 'b': '190' }
]
var c = new mtable({
tableid: 'm',
adddom: ".add",
tableclass: 'table table-bordered',
tableparent: '.tcon',
theade: '姓名价钱',
mergeCells: true
}, data)

基于上面的要领我写了个浅易的基于jQuery的自动天生表格的插件,能够兼并单元格。关于兼容commonjs这些范例,写法也许多,愿望多多指教
完全代码github:easyTable


推荐阅读
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • ECMA262规定typeof操作符的返回值和instanceof的使用方法
    本文介绍了ECMA262规定的typeof操作符对不同类型的变量的返回值,以及instanceof操作符的使用方法。同时还提到了在不同浏览器中对正则表达式应用typeof操作符的返回值的差异。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
author-avatar
手机用户2502873943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有