A. 加速包js怎么实现
基于 AngularJS 的拖拽指令
支持 GPU 加速
支持边界限制
支持设置拖拽把柄
移动端与 PC 端通用
使用
支持使用 script 标签或者 webpack、requirejs、seajs 调用:
script
调用
script src="lib/angular.js"></script>
<script src="dist/angular-drag.js"></script>
<script>
var app = angular.mole('app', ['angular-drag']);
</script>
webpack
安装
npm install angular-drag
调用
require('angular-drag');
var app = angular.mole('app', ['angular-drag']);
angular-drag 依赖 angular 与 jquery 两个全局模块
指令
drag 被拖拽的元素
drag-handle 触发拖拽的把柄(可选)
示例
简单的可拖拽元素
<迟睁侍早橘div drag class="example">
hello world
</div>
自定义拖拽的把柄
<div drag class="example">
<码吵div drag-handle></div>
<p>hello world</p>
</div>
B. seajs和requiejs的区别,和用gulp打包方法
从demo.html 引入一个入口c.js, c.js require-b.js , b.js require - a.js
代码如下:
c mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole c");
require('b');
console.log("c finished");
});
b mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole b")
var a = require('a');
console.log("b finished")
});
a mole
[html] view plain print?
define(function() {
console.log("hello mole a")
});
requriejs 的 html代码:
[html] view plain print?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="require.min.js" data-main="c.js"></script>
</head>
<body>
</body>
</html>
执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:3
c finishedc.js:7
seajs的html代码:
[html] view plain print?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="sea.2.3.js"></script>
<script>
seajs.use('./c');
</script>
</head>
<body>
</body>
</html>
执行结果:
hello mole cc.js:3
hello mole bb.js:2
hello mole aa.js:2
b finishedb.js:4
c finishedc.js:7
所以总结:
seajs是从上到下执行,
requriejs是把其中require的js全部加载完了,再往下执行。·
2、依赖的加载有所不同
在define中 requriejs加载了依赖就执行;而seajs在define中只是加载不会执行(如果要执行,需要用require()方法)
案例代码:
c.js模块
[html] view plain print?
define(['b'],function(require,exports,mole){
console.log("hello mole c");
console.log("c finished");
});
b.js模块
[html] view plain print?
define(['a'],function(require,exports,mole) {
console.log("hello mole b")
console.log("b finished")
});
a.js模块
[html] view plain print?
define(['b'],function(require,exports,mole) {
console.log("hello mole a")
});
seajs和requirejs的 html代码 和 1 中一样
执行结果:
seajs执行结果:
hello mole cc.js:2
c finishedc.js:4
requiresj的执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:2
c finishedc.js:4
总结: 在define书写中A:requirejs 加载了就执行,所以requirejs是预执行(在define中预先执行所有require依赖的js),RequireJS的做法是并行加载所有依赖的模块, 并完成解析后, 再开始执行其他代码, 因此执行结果只会"停顿"1次, 完成整个过程是会比SeaJS要快. 预执行
B:seajs只是纯粹的加载依赖的文件,不执行就连console都不执行就是纯粹的“加载”,SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析,
这里耗费了时间, 因为这个特例中的模块巨大, 因此造成"停顿"2次的现象, 这就是我所说的SeaJS中的"懒执行".
在2的基础上 c.js代码为
[html] view plain print?
define(function(require,exports,mole){
require('b');
require('a');
console.log("hello mole c");
console.log("c finished");
});
执行结果都是一样
hello mole bb.js:2
b finishedb.js:4
hello mole aa.js:2
hello mole cc.js:4
c finishedc.js:6
3、取别名时requirejs默认舍掉.js的后缀
4、 打包方法
gulp 打包seajs
requirejs 打包
C. 请教seajs 的define参数 的问题
开发阶段不推荐define的参数传入三个,只需给定后面的factory即可,发布时通过构建工版具提取压权缩模块,会自动加上idhe依赖数组(即第二个参数),这样seajs能够更快的定位本身这个模块和它依赖的模块。
顺便提一下,第二个参数,如果显示传入了,那么seajs就不会再通过正则去扫描factory.toString(),直接根据这个参数去加载依赖模块,如果为[]即表示无依赖。
D. requirejs和seajs的区别
SeaJS对模块的态度是懒执行, 而RequireJS对模块的态度是预执行
如下模块通过SeaJS/RequireJS来加载, 执行结果会是怎样?
define(function(require, exports, mole) {
console.log('require mole: main');
var mod1 = require('./mod1');
mod1.hello();
var mod2 = require('./mod2');
mod2.hello();
return {
hello: function() {
console.log('hello main');
}
};
});
先试试SeaJS的执行结果
require mole: main
require mole: mod1
hello mod1
require mole: mod2
hello mod2
hello main
E. angularJS关于依赖和模块与amd/cmd的区别,分享下结合使用示例
双向绑定,可测试性的代码结构,模型视图分离的一个前端MV*框架
其中angular也提供了模型的概念和依赖管理,不过这个依赖都是要在js对象都已经定义的前提下,没有像amd/cmd提供按需加载。
我个人比较喜欢cmd(seajs),它对顶级作用域window的使用约束较多,全局对象和方法少,缺点就是很多原生库,都需要手工wrap下。
angular定义的controller一般都是全局的,我想用seajs来管理angular的代码和依赖,下面是一起使用的示例,有类似需求的童鞋可以参考下:
java">//fileng_mole2.js
define(function(require){
varLog=require('log');
return{
init:function(){
Log.w('Loadangularmole:m2');
varag=window.angular;
if(!ag){
Log.w('Errorwhenloadangularmole:m2:noangular');
return;
}
varm2=ag.mole('m2',[]);
m2.filter('greet',function(){
returnfunction(name){
return'Hello,'+name+'!';
};
});
}
};
});
//fileng_mole1.js
define(function(require){
require('mole/demo/ng_mole2').init();
varLog=require('log');
return{
init:function(){
Log.w('Loadangularmole:m1');
varag=window.angular;
if(!ag){
Log.w('Errorwhenloadangularmole:m1:noangular');
return;
}
varm1=ag.mole('m1',['m2']);
m1.directive('testDateFormat',function(){
returnfunction(scope,el,attrs,ctrl){
varformat='yyyy-MM-dd';
varupdateTime=function(){
el.text(newDate().format(format));
};
//watchscope.formatinctrl
scope.$watch('format',function(value){
format=value;
updateTime();
});
updateTime();
}
});
}
};
});
//filedemo/ng1.js
//初始化页面
define(function(require){
varLog=require('log');
require('mole/demo/ng_mole1').init();
varagAdaptor=require('x/x.ex.angular');
return{
initPage:function(from,pageInfo,params){
varTestCtrl=function($scope){
$scope.format='yyyy/MM/dd';
};
window.TestCtrl=TestCtrl;
agAdaptor.init(['m1'],'TestCtrl','ngContext');
},
mp:''
};
});
//filex/x.ex.angular.js
//angularbootstrap适配——在bootstrap之前动态修改下dom
define(function(require){
var$=require('jquery');
varLog=require('log');
return{
init:function(moles,ctrlName,contextId){
if(!window.angular){
Log.w('Noangluardefined!','WARN');
return;
}
var_context=$('#'+contextId);
this.initCtrl(_context,ctrlName);
this.initModel(_context);
this.bootstrapAngular(moles);
},
//把ng-controller补上
initCtrl:function(_context,ctrlName){
if(ctrlName)
_context.attr('ng-controller',ctrlName);
},
//根据name把ng-model补上
initModel:function(_context){
_context.find('[name^=f_]').each(function(){
var_el=$(this);
varname=_el.attr('name');
varmodelName=name.split('_').remove(0).join('.');
_el.attr('ng-model',modelName);
});
},
bootstrapAngular:function(moles){
window.angular.bootstrap(document,moles);
}
};
});
<divclass="m_10">
<h3>Angular——WorkwithSeaJS</h3>
<divid="ngContext">
Dateformat:<inputng-model="format">
<br/>
Currenttimeis:<spantest-date-format=""></span>
</div>
</div>
seajs.use('mole/demo/ng1',function(IPage){
IPage.initPage();
});
F. GitHub 上有哪些值得推荐的开源电子书
语言无关类
操作系统
鸟哥的Linux私房菜 (简体)
Linux 系统高级编程
The Linux Command Line (中英文版)
Linux 设备驱动 (第三版)
深入分析Linux内核源码
UNIX TOOLBOX
Docker中文指南
Docker —— 从入门到实践
FreeRADIUS新手入门
Mac 开发配置手册
FreeBSD 使用手册
Linux 命令行(中文版)
一步步搭建物联网系统
Nginx开发从入门到精通 (淘宝团队出品)
Git教程 (本文由 @廖雪峰 创作,如果觉得本教程对您有帮助,可以去 iTunes 购买)
git – 简易指南
猴子都能懂的GIT入门
Git 参考手册
Pro Git
Git Magic
GotGitHub
Git Community Book 中文版
Mercurial 使用教程
HgInit (中文版)
沉浸式学 Git
Git-Cheat-Sheet (感谢 @flyhigher139 翻译了中文版)
GitHub秘籍
NoSQL数据库笔谈 (PDF)
Redis 设计与实现
Redis 命令参考
带有详细注释的 Redis 3.0 代码
带有详细注释的 Redis 2.6 代码
The Little MongoDB Book
The Little Redis Book
Neo4j 简体中文手册 v1.8
Neo4j .rb 中文资源
MySQL索引背后的数据结构及算法原理
持续集成(第二版) (译言网)
让开发自动化系列专栏
追求代码质量
selenium 中文文档
Joel谈软件
约耳谈软体(Joel on Software)
关于浏览器和网络的 20 项须知
前端知识体系
浏览器开发工具的秘密
Chrome 开发者工具中文手册
Chrome扩展开发文档
Grunt中文文档
移动Web前端知识库
正则表达式30分钟入门教程
前端开发体系建设日记
移动前端开发收藏夹
JSON风格指南
HTTP 接口设计指北
前端资源分享(一)
前端资源分享(二)
前端代码规范 及 最佳实践
w3school教程整理
大数据/数据挖掘/推荐系统/机器学习相关资源
程序员编程艺术
每个程序员都应该了解的内存知识(译)【第一部分】
取悦的工序:如何理解游戏 (豆瓣阅读,免费书籍)
OpenWrt智能、自动、透明翻墙路由器教程
awk程序设计语言
C++ 并发编程指南 (@傅海平ICT)
Linux C编程一站式学习 (宋劲杉, 北京亚嵌教育研究中心)
CGDB中文手册
100个gdb小技巧
100个gcc小技巧
ZMQ 指南
How to Think Like a Computer Scientist (中英文版)
跟我一起写Makefile(PDF)
GNU make中文手册
GNU make 指南
Google C++ 风格指南
C/C++ Primer (by @andycai)
简单易懂的C魔法
Cmake 实践 (PDF版)
C++ FAQ LITE(中文版)
C++ Primer 5th Answers
学习CSS布局
通用 CSS 笔记、建议与指导
CSS参考手册
Emmet 文档
前端代码规范 (腾讯alloyteam团队)
Dart 语言导览
Fortran77和90/95编程入门
实时 Java 系列
Apache Shiro 用户指南
使用 Eclipse 和 Java SE 6 创建独立 Web Services 应用程序
第 1 部分: Web Services 服务端应用程序
第 2 部分: Web 服务客户端应用程序
JavaServer Faces 1.2 入门
第 1 部分: 构建基本应用程序
第 2 部分: JSF 生命周期、转换、检验和阶段监听器
用 Eclipse Europa 进行 Web 开发
第 1 部分: Eclipse Java EE
第 2 部分: PHP 开发工具
第 3 部分: Ruby Development Toolkit 和 RadRails
使用 JavaServer Faces 构建 Apache Geronimo 应用程序
第 1 部分: 使用 Eclipse 和 Apache MyFaces Core 构建基本的应用程序
第 2 部分: 在 JavaServer Faces 中使用 Tomahawk
第 3 部分: 使用 ajax4jsf 添加 Ajax 功能
第 4 部分: 使用 Apache Trinidad 组件扩展 JSF
第 5 部分: 将 JSF 应用程序与 Spring 集成
Apache Geronimo 和 Spring 框架
第 1 部分: 开发方法学
第 2 部分: 构建第一个应用程序
第 3 部分: 集成 DAO 与 ORM
第 4 部分: 混合使用 Spring AOP 和 Spring Web Flow
第 5 部分: Spring MVC
第 6 部分: Spring MVC:使用 Web 视图技术
终极 mashup —— Web 服务和语义 Web
第 1 部分: 使用与组合 Web 服务
第 2 部分: 管理 Mashup 数据缓存
第 3 部分: 理解 RDF 和 RDFs
第 4 部分: 创建本体
第 5 部分: 切换 Web 服务
Jersey 2.x 用户指南
MyBatis中文文档
Google JavaScript 代码风格指南
Airbnb JavaScript 规范
JavaScript 标准参考教程(alpha)
Javascript编程指南 (源码)
javascript 的 12 个怪癖
JavaScript 秘密花园
JavaScript核心概念及实践 (PDF) (此书已由人民邮电出版社出版发行,但作者依然免费提供PDF版本,希望开发者们去购买,支持作者)
《JavaScript 模式》翻译,此书中文版有售,但是纸质书翻译的还没有这个版本翻译的好
命名函数表达式探秘 (注:原文由为之漫笔翻译,原始地址无法打开,所以此处地址为我博客上的备份)
学用 JavaScript 设计模式 (开源中国)
深入理解JavaScript系列
ECMAScript 6 入门 (作者:阮一峰)
jQuery
jQuery 解构
简单易懂的JQuery魔法
How to write jQuery plugin
Node.js
Node入门
七天学会NodeJS
Nodejs Wiki Book (繁体中文)
express.js 中文文档
koa 中文文档
使用 Express + MongoDB 搭建多人博客
Express框架
nodejs文档
Node.js 包教不包会
Learn You The Node.js For Much Win! (中文版)
Node debug 三法三例
underscore.js
Underscore.js中文文档
backbone.js
backbone.js入门教程 (PDF)
Backbone.js入门教程第二版
Developing Backbone.js Applications(中文版)
AngularJS
AngularJS最佳实践和风格指南
AngularJS中译本
AngularJS入门教程
构建自己的AngularJS
在Windows环境下用Yeoman构建AngularJS项目
zepto 简明中文手册
Sea.js
Hello Sea.js
CoffeeScript
CoffeeScript Cookbook
The Little Book on CoffeeScript中文版
ExtJS
Ext4.1.0 中文文档
Chrome扩展及应用开发
JavaScript入门教程
PHP调试技术手册(PDF)
XDebug 2中文手册(译) (CHM)
PHP之道
PHP 最佳实践
PHP安全最佳实践
深入理解PHP内核
PHP扩展开发及内核应用
CodeIgniter 用户指南
Laravel4 中文文档
Laravel 入门
Symfony2中文文档 (未译完)
Phalcon中文文档(翻译进行中)
YiiBook几本Yii框架的在线教程
简单易懂的PHP魔法
swoole文档及入门教程
iOS开发60分钟入门
iOS7人机界面指南
Google Objective-C Style Guide 中文版
iPhone 6 屏幕揭秘
Apple Watch开发初探
马上着手开发 iOS 应用程序
网易斯坦福大学公开课:iOS 7应用开发字幕文件
Android Design(中文版)
Google Android官方培训课程中文版
Android学习之路
小白的Python教程
简明Python教程
零基础学Python
Python 2.7 官方教程中文版
Python 3.3 官方教程中文版
深入 Python 3
PEP8 Python代码风格规范
Google Python 风格指南 中文版
Python入门教程 (PDF)
Python的神奇方法指南
笨办法学 Python (PDF版下载)
Django 文档中文版
Django 最佳实践
The Django Book 中文版
web.py 0.3 新手指南
Web.py Cookbook 简体中文版
Dive Into Python 中文版
Bottle 文档中文版 (需翻墙)
Flask 文档中文版
Jinja2 文档中文版
Werkzeug 文档中文版
Flask之旅
Introction to Tornado 中文翻译
Python自然语言处理中文版 (感谢陈涛同学的翻译,也谢谢 @shwley 联系了作者)
Python 绘图库 matplotlib 官方指南中文翻译
Scrapy 0.25 文档
ThinkPython
Ruby 风格指南
Rails 风格指南
笨方法学 Ruby
Ruby on Rails 指南
Ruby on Rails 实战圣经
Ruby on Rails Tutorial 原书第 2 版 (本书网页版免费提供,电子版以 PDF、EPub 和 Mobi 格式提供购买,仅售 9.9 美元)
编写Ruby的C拓展
Ruby 源码解读
Shell脚本编程30分钟入门
Go编程基础
Go入门指南
学习Go语言 (PDF)
Go Web 编程 (此书已经出版,希望开发者们去购买,支持作者的创作)
Go实战开发 (当我收录此项目时,作者已经写完第三章,如果读完前面章节觉得有帮助,可以给作者捐赠,以鼓励作者的继续创作)
Network programming with Go 中文翻译版本
实战 Groovy 系列
一份其实很短的 LaTeX 入门文档
一份不太简短的 LATEX 2ε 介绍 (PDF版)
ANSI Common Lisp 中文翻译版
Lua编程入门
Real World Haskell 中文版
R语言忍者秘笈
Scala课堂 (Twitter的Scala中文教程)
Effective Scala(Twitter的Scala最佳实践的中文翻译)
Scala指南
The Swift Programming Language 中文版
Modern Perl 中文版
Perl 程序员应该知道的事
笨办法学Prolog
Vim中文文档
笨方法学Vimscript 中译本
Vim中文文档
编译原理(紫龙书)中文第2版习题答案
把《编程珠玑》读薄
Effective C++读书笔记
Golang 学习笔记、Python 学习笔记、C 学习笔记 (PDF)
Jsoup 学习笔记
学习笔记: Vim、Python、memcached
图灵开放书翻译计划–C++、Python、Java等
蒂姆·奥莱利随笔 (由译言网翻译,电子版免费)
Octave 入门 (PDF版)
SICP 解题集
精彩博客集合
正则表达式简明参考
G. 请大神帮我解答一下这个函数。。。包括function中的两个参数
jQuery插件开发的五种形态
插件的第一形态
面对这种情况,通常我们会通过定义function的方式来实现。
复制代码代码如下:
function pluginName($selector){
$.each($selector, function () {
$(this).css("background-color", "#ccc");
// to do something...
});
}
// pluginName(document.getElementsByClassName("demo"));
因为我谈的是jQuery插件开发,那么我现在把这段代码扩展到jQuery上,代码如下:
复制代码代码如下:
// IIFE(立即调用函数表达式); [参考http://suqing.iteye.com/blog/1981591/]
;(function ($) {
// 扩展这个方法到jQuery.
// $.extend() 是吧方法扩展到 $ 对象上,和 $.fn.extend 不同。 扩展到 $.fn.xxx 上后,
// 调用的时候就可以是 $(selector).xxx()
$.fn.extend({
// 插件名字
pluginName: function () {
// 遍历匹配元素的集合
// 注意这里有个"return",作用是把处理后的对象返回,实现链式操作
return this.each(function () {
// 在这里编写相应的代码进行处理
});
}
});
// 传递jQuery到内层作用域去, 如果window,document用的多的话, 也可以在这里传进去.
// })(jQuery, window, document, undefined);
})(jQuery, undefined);
// 调用方式 $(".selector").pluginName().otherMethod();
但是还差的远,目前只解决了两个问题
代码相对独立
链式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被缓存
可扩展
无冲突处理
事件代理,动态初始化
插件的第二形态
现在来给插件添加参数支持。代码如下
复制代码代码如下:
;(function($){
$.fn.pluginName = function(options) {
// 合并参数,通过“extend”合并默认参数和自定义参数
var args = $.extend({}, $.fn.pluginName.defaults, options);
return this.each(function() {
console.log(args.text);
// to do something...
});
};
// 默认参数
$.fn.pluginName.defaults = {
text : "hello"
};
})(jQuery);
// $(".selector").pluginName({
// text : "hello world!"
// });
添加参数支持还比较容易些,又解决一问题
代码相对独立
链式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被缓存
可扩展
无冲突处理
事件代理,动态初始化
插件的第三形态
现在来添加方法的支持,我前面所提到的生命周期可控制,意思差不多,例如添加reInit,destory等方法来控制插件。
复制代码代码如下:
;(function($){
$.fn.pluginName = function (method) {
// 如果第一个参数是字符串, 就查找是否存在该方法, 找到就调用; 如果是object对象, 就调用init方法;.
if (methods[method]) {
// 如果存在该方法就调用该方法
// apply 是吧 obj.method(arg1, arg2, arg3) 转换成 method(obj, [arg1, arg2, arg3]) 的过程.
// Array.prototype.slice.call(arguments, 1) 是把方法的参数转换成数组.
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
} else if (typeof method === 'object' || !method) {
// 如果传进来的参数是"{...}", 就认为是初始化操作.
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.pluginName');
}
};
// 不把方法扩展在 $.fn.pluginName 上. 在闭包内建个"methods"来保存方法, 类似共有方法.
var methods = {
/**
* 初始化方法
* @param _options
* @return {*}
*/
init : function (_options) {
return this.each(function () {
var $this = $(this);
var args = $.extend({}, $.fn.pluginName.defaults, _options);
// ...
})
},
publicMethod : function(){
private_methods.demoMethod();
}
};
// 私有方法
function private_methods = {
demoMethod : function(){}
}
// 默认参数
$.fn.pluginName.defaults = {
};
})(jQuery);
// 调用方式
// $("div").pluginName({...}); // 初始化
// $("div").pluginName("publicMethod"); // 调用方法
又解决一问题
代码相对独立
链式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被缓存
可扩展
无冲突处理
事件代理,动态初始化
插件的第四形态
第三形态的插件修改就已经可以应对大多数插件的需求了。精益求精嘛,继续升级。
第四形态的插件是照帮司徒正美的《javascript框架设计》的代码。加了点面向对象的知识。
复制代码代码如下:
(function ($) {
var Plugin = function (element, options) {
this.element = element;
this.options = options;
};
Plugin.prototype = {
create: function () {
console.log(this.element);
console.log(this.options);
}
};
$.fn.pluginName = function (options) {
// 合并参数
return this.each(function () {
// 在这里编写相应的代码进行处理
var ui = $._data(this, "pluginName");
// 如果该元素没有初始化过(可能是新添加的元素), 就初始化它.
if (!ui) {
var opts = $.extend(true, {}, $.fn.pluginName.defaults, typeof options === "object" ? options : {});
ui = new Plugin(this, opts);
// 缓存插件
$._data(this, "pluginName", ui);
}
// 调用方法
if (typeof options === "string" && typeof ui[options] == "function") {
// 执行插件的方法
ui[options].apply(ui, args);
}
});
};
$.fn.pluginName.defaults = {};
})(jQuery);
// 调用的方式和之前一样。
这里特别要提下缓存这个东西,插件用多了,觉的这个真的是好东西。
在传统面向对象的插件开发中,至少会声明个变量保存它,但是我到目前写的jQuery插件中都没有,用起来很麻烦。自从把初始化后的插件缓存起来后,方便了许多。通过代码$("#target").data("pluginName")就可以取到对象了。 来看看还有什么问题没有解决
代码相对独立
链式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被缓存
可扩展
无冲突处理
事件代理,动态初始化
插件的第五形态
看了上面的代码是否脑子有点晕了,如果是,休息片刻,稍后回来,下面的代码更精彩。 最后一个方案算是比较全面的了。方案来自Bootstrap,下面代码以 Bootstrap 的 button 插件为例.
复制代码代码如下:
!function ($) {
// ecma262v5 的新东西, 强制使用严谨的代码编写.
"use strict";
// BUTTON PUBLIC CLASS DEFINITION
// ==============================
var Button = function (element, options) {
this.$element = $(element);
this.options = $.extend({}, Button.DEFAULTS, options);
};
Button.DEFAULTS = {
loadingText: 'loading...'
};
Button.prototype.setState = function (state) {
// ...
};
Button.prototype.toggle = function () {
// ...
};
// BUTTON PLUGIN DEFINITION
// ========================
var old = $.fn.button; // 这里的 $.fn.button 有可能是之前已经有定义过的插件,在这里做无冲突处理使用。
$.fn.button = function (option) {
return this.each(function () {
var $this = $(this);
// 判断是否初始化过的依据
var data = $this.data('bs.button');
var options = typeof option == 'object' && option;
// 如果没有初始化过, 就初始化它
if (!data) $this.data('bs.button', (data = new Button(this, options)));
if (option == 'toggle') data.toggle();
else if (option) data.setState(option)
})
};
// ① 暴露类名, 可以通过这个为插件做自定义扩展
$.fn.button.Constructor = Button;
// 扩展的方式
// 设置 : $.fn.button.Constructor.newMethod = function(){}
// 使用 : $btn.button("newMethod");
// ② 无冲突处理
$.fn.button.noConflict = function () {
$.fn.button = old;
return this
};
// ③ 事件代理, 智能初始化
$(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
var $btn = $(e.target);
// 查找要初始化的对象
if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn');
// 直接调用方法, 如果没有初始化, 内部会先进行初始化
$btn.button('toggle');
e.preventDefault();
});
}(jQuery);
来看看还有什么问题没有解决
代码相对独立
链式操作
插件可配置
有可操作的方法,插件的生命周期可控制
配置可被缓存
可扩展
无冲突处理
事件代理,动态初始化
补充
现在的插件都要求灵活性要高,比如希望插件可以同时适配jQuery和Zepto,又或者需要支持AMD或者CMD规范。
支持jQuery和Zepto
复制代码代码如下:
if (window.jQuery || window.Zepto) {
(function ($) {
// plugin code...
})(window.jQuery || window.Zepto);
}
中间件支持,node
复制代码代码如下:
if (typeof(mole) !== 'undefined')
{
mole.exports = pluginName;
}
requirejs(AMD) support
if (typeof define === 'function' && define.amd) {
define([], function () {
'use strict';
return pluginName;
});
}
seajs(CMD) support
if (typeof define === 'function') {
define([], function () {
'use strict';
return pluginName;
});
}
H. seajs和requiejs的区别,和用gulp打包方法
1、执烂返行顺序不同
从demo.html 引入一个入口c.js, c.js require-b.js , b.js require - a.js
代码如下:
c mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole c");
require('b');
console.log("c finished");
});
b mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole b")
var a = require('a');
console.log("b finished")
});
a mole
[html] view plain print?
define(function() {
console.log("hello mole a")
});
requriejs 的 html代码:
[html] view plain print?
<!doctype html>
<html lang="仔晌en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="require.min.js" data-main="c.js"></script>
</head>
<body>
</body>
</html>
执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:3
c finishedc.js:7
==============================================
seajs的html代码:
[html] view plain print?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="sea.2.3.js"></script>
<script>
seajs.use('./c'饥戚饥);
</script>
</head>
<body>
</body>
</html>
执行结果:
hello mole cc.js:3
hello mole bb.js:2
hello mole aa.js:2
b finishedb.js:4
c finishedc.js:7
所以总结:
seajs是从上到下执行,
requriejs是把其中require的js全部加载完了,再往下执行。·
2、依赖的加载有所不同
在define中 requriejs加载了依赖就执行;而seajs在define中只是加载不会执行(如果要执行,需要用require()方法)
案例代码:
c.js模块
[html] view plain print?
define(['b'],function(require,exports,mole){
console.log("hello mole c");
console.log("c finished");
});
b.js模块
[html] view plain print?
define(['a'],function(require,exports,mole) {
console.log("hello mole b")
console.log("b finished")
});
a.js模块
[html] view plain print?
define(['b'],function(require,exports,mole) {
console.log("hello mole a")
});
seajs和requirejs的 html代码 和 1 中一样
执行结果:
seajs执行结果:
hello mole cc.js:2
c finishedc.js:4
requiresj的执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:2
c finishedc.js:4
总结: 在define书写中A:requirejs 加载了就执行,所以requirejs是预执行(在define中预先执行所有require依赖的js),RequireJS的做法是并行加载所有依赖的模块, 并完成解析后, 再开始执行其他代码, 因此执行结果只会"停顿"1次, 完成整个过程是会比SeaJS要快. 预执行
B:seajs只是纯粹的加载依赖的文件,不执行就连console都不执行就是纯粹的“加载”,SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析,
这里耗费了时间, 因为这个特例中的模块巨大, 因此造成"停顿"2次的现象, 这就是我所说的SeaJS中的"懒执行".
在2的基础上 c.js代码为
[html] view plain print?
define(function(require,exports,mole){
require('b');
require('a');
console.log("hello mole c");
console.log("c finished");
});
执行结果都是一样
hello mole bb.js:2
b finishedb.js:4
hello mole aa.js:2
hello mole cc.js:4
c finishedc.js:6
3、取别名时requirejs默认舍掉.js的后缀
4、 打包方法
gulp 打包seajs
requirejs 打包
http://blog.csdn.net/kongjiea/article/details/48316049
I. seajs和requiejs的区别,和用gulp打包方法
1、执行顺序不同
从demo.html 引入一个入口c.js, c.js require-b.js , b.js require - a.js
代码如下:
c mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole c");
require('b');
console.log("c finished");
});
b mole
[html] view plain print?
define(function(require, exports, mole) {
console.log("hello mole b")
var a = require('a');
console.log("b finished")
});
a mole
[html] view plain print?
define(function() {
console.log("hello mole a")
});
requriejs 的 html代码:
[html] view plain print?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="require.min.js" data-main="c.js"></script>
</head>
<body>
</body>
</html>
执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:3
c finishedc.js:7
==============================================
seajs的html代码:
[html] view plain print?
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>seajs和requirejs的区别</title>
<script src="sea.2.3.js"></script>
<script>
seajs.use('./c');
</script>
</head>
<body>
</body>
</html>
执行结果:
hello mole cc.js:3
hello mole bb.js:2
hello mole aa.js:2
b finishedb.js:4
c finishedc.js:7
所以总结:
seajs是从上到下执行,
requriejs是把其中require的js全部加载完了,再往下执行。·
2、依赖的加载有所不同
在define中 requriejs加载了依赖就执行;而seajs在define中只是加载不会执行(如果要执行,需要用require()方法)
案例代码:
c.js模块
[html] view plain print?
define(['b'],function(require,exports,mole){
console.log("hello mole c");
console.log("c finished");
});
b.js模块
[html] view plain print?
define(['a'],function(require,exports,mole) {
console.log("hello mole b")
console.log("b finished")
});
a.js模块
[html] view plain print?
define(['b'],function(require,exports,mole) {
console.log("hello mole a")
});
seajs和requirejs的 html代码 和 1 中一样
执行结果:
seajs执行结果:
hello mole cc.js:2
c finishedc.js:4
requiresj的执行结果:
ello mole aa.js:2
hello mole bb.js:2
b finishedb.js:4
hello mole cc.js:2
c finishedc.js:4
总结: 在define书写中A:requirejs 加载了就执行,所以requirejs是预执行(在define中预先执行所有require依赖的js),RequireJS的做法是并行加载所有依赖的模块, 并完成解析后, 再开始执行其他代码, 因此执行结果只会"停顿"1次, 完成整个过程是会比SeaJS要快. 预执行
B:seajs只是纯粹的加载依赖的文件,不执行就连console都不执行就是纯粹的“加载”,SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析,
这里耗费了时间, 因为这个特例中的模块巨大, 因此造成"停顿"2次的现象, 这就是我所说的SeaJS中的"懒执行".
在2的基础上 c.js代码为
[html] view plain print?
define(function(require,exports,mole){
require('b');
require('a');
console.log("hello mole c");
console.log("c finished");
});
执行结果都是一样
hello mole bb.js:2
b finishedb.js:4
hello mole aa.js:2
hello mole cc.js:4
c finishedc.js:6
3、取别名时requirejs默认舍掉.js的后缀
4、 打包方法
gulp 打包seajs
requirejs 打包
http://blog.csdn.net/kongjiea/article/details/48316049
J. seajs2.3.0和spm3怎么配合打包
开发一个组件的流程: 初始化组件 在本地磁盘新建文件夹,文件夹名称为组件名称,名称要符合 [a-z\d-.],并以英文字母开头,首选合适的英文单词, 禁止使用驼峰 。避免组件名称产生冲突。 下面以epay-mole1为例,说明组件初始化过程。 $ mkdir epay-mole1 $ cd epay-mole1 $ spm init Creating a spm package: [?] Package name: epay-mole1 [?] Version: 0.0.0 [?] Description: [?] Author: Initialize a spm package Succeccfully! 初始化完成后会生成一个骨架,在这个基础上进行开发更方便。 epay-mole1 ├── examples 组件演示 │ └── index.md ├── HISTORY.md 版本更新说明 ├── index.js 组件的主要入口文件 ├── package.json 版本等元信息 ├── README.md 组件总体说明,包括功能描述、api文档 └── tests 单元测试 └── index-spec.js 4.首先分析组件的依赖,比如需要 jquery。 可以使用 spm install 下载依赖。 $ spm install jquery --save 这样 spm 会自动在 package.json 中添加依赖,你也可以手动添加并 install 。 "spm": { "dependencies": { "jquery": "1.7.2" } } 并且,所有依赖的模块都会被下载到 spm_moles 下。 修改 index.js 进行开发 var $ = require('jquery') var epayMole1 = function(){ this.info = 'hello mole1' }; mole.exports = epayMole1 启动本地服务进行调试。 $ spm doc 通过浏览器访问 http://127.0.0.1:8000/ 本地调试 examples 也使用 md 编写,这样写起来非常方便。 在 examples/index.md 添加实例化代码,可以直接 use。 seajs.use('../index', function(Mole1) { var mole1 = new Mole1() console.log(mole1.info) }); 也可以用 require 来调用模块。 var Mole1 = require('index'); 通过四个 "````" 所包裹的代码不仅会显示成代码片段,也会插入 HTML 中进行实际运行,这样你调试好代码后,演示页面的文档也同时生成好了。 spm doc 支持 livereload,只要通过 spm doc 启动服务,修改文件后都会自动构建。 修改组件元信息 修改 package.json 配置打包方式 "spm": { "main": "index.js" } 这样 spm build 将打包 index.js 文件,并将这个文件中的本地依赖文件也打包进来。 接下来就可以开始打包,build 后会在 dist 目录生成打包的文件和 -debug 文件。 $ spm build 发布组件 你的组件发布后可以很方便的被其他组件调用。通过 spm publish 命令将会把你的组件发布到服务器上。 $ spm publish 发布组件文档 $ spm doc publish