最近做一个合作项目,对方要求我们做一个web应用程序,然后嵌入到他们的总的wen应用中,风格要求保持一致,于是乎就发了一个html文件过来,大概列举了一下各种控件,对话框的效果。

    好了,重点说其中的一个弹出插件,其源码为:

(function($) {

    $('a[data-reveal-id]').live('click', function(e) {
e.preventDefault();
var modalLocation = $(this).attr('data-reveal-id');
$('#'+modalLocation).reveal($(this).data());
}); $.fn.reveal = function(options) { var defaults = {
animation: 'fade', //fade, fadeAndPop, none
animationspeed: , //how fast animtions are
animationopacity:0.6,// BG opacity
closeonbackgroundclick: true, //if you click background will modal close?
dismissmodalclass: 'close-reveal-modal', //the class of a button or element that will close an open modal
}; var options = $.extend({}, defaults, options); return this.each(function() { /*---------------------------
Global Variables
----------------------------*/
var modal = $(this),
topMeasure = parseInt(modal.css('top')),
topOffset = modal.height() + topMeasure,
locked = false,
modalBG = $('.reveal-modal-bg'); /*---------------------------
Create Modal BG
----------------------------*/
if(modalBG.length == ) {
modalBG = $('<div class="reveal-modal-bg" />').insertAfter(modal);
} /*---------------------------
Open and add Closing Listeners
----------------------------*/
//Open Modal Immediately
openModal(); //Close Modal Listeners
var closeButton = $('.' + options.dismissmodalclass).bind('click.modalEvent',closeModal)
if(options.closeonbackgroundclick) {
modalBG.css({"cursor":"pointer"})
modalBG.bind('click.modalEvent',closeModal)
} /*---------------------------
Open & Close Animations
----------------------------*/
//Entrance Animations
function openModal() {
modalBG.unbind('click.modalEvent');
$('.' + options.dismissmodalclass).unbind('click.modalEvent');
if(!locked) {
lockModal();
if(options.animation == "fadeAndPop") {
modal.css({'top': $(document).scrollTop()-topOffset, 'opacity' : , 'visibility' : 'visible'});
modalBG.fadeIn(options.animationspeed/);
modal.delay(options.animationspeed/).animate({
"top": $(document).scrollTop()+topMeasure,
"opacity" :
}, options.animationspeed,unlockModal());
}
if(options.animation == "fade") {
modal.css({'opacity' : , 'visibility' : 'visible', 'top': $(document).scrollTop()+topMeasure});
modalBG.fadeIn(options.animationspeed/, function(){
$(this).css('opacity',options.animationopacity);
});
modal.delay(options.animationspeed/).animate({
"opacity" :
}, options.animationspeed,unlockModal());
}
if(options.animation == "none") {
modal.css({'visibility' : 'visible', 'top':$(document).scrollTop()+topMeasure});
modalBG.css({"display":"block"});
unlockModal()
}
}
} //Closing Animation
function closeModal() {
if(!locked) {
lockModal();
if(options.animation == "fadeAndPop") {
modalBG.delay(options.animationspeed).fadeOut(options.animationspeed);
modal.animate({
"top": $(document).scrollTop()-topOffset,
"opacity" :
}, options.animationspeed/, function() {
modal.css({'top':topMeasure, 'opacity' : , 'visibility' : 'hidden'});
unlockModal();
});
}
if(options.animation == "fade") {
modalBG.delay(options.animationspeed).fadeOut(options.animationspeed);
modal.animate({
"opacity" :
}, options.animationspeed, function() {
modal.css({'opacity' : , 'visibility' : 'hidden', 'top' : topMeasure});
unlockModal();
});
}
if(options.animation == "none") {
modal.css({'visibility' : 'hidden', 'top' : topMeasure});
modalBG.css({'display' : 'none'});
}
}
} /*---------------------------
Animations Locks
----------------------------*/
function unlockModal() {
locked = false;
}
function lockModal() {
locked = true;
} });
}
})(jQuery);

这个插件的内容就是很简单,你写好如下的HTML,他就弹出一个提示请等待的Modal框,因为是JQuery的插件,所以调用方法其实就一句话:

$Obj.reveal()

其中,$Obj 是一个Jquery对象。这个模态框弹出之后,你点击之后就会关掉。(这个插件依赖Jqeury库,用的朋友你们懂的)

问题来了:这个拓展插件根本没提供程序关闭的方法有木有??难道只能手动点击才能关掉么?

  忍不了这破东西,要不是对方规定好了效果,我非得重新弄一个不可。看来,得挽起袖子重写一下了。嗯。

我的基本思路就是,将这个JQuery插件改写为直接用面向对象的方法调用,可以直接关闭的插件,因为这个插件用了太多闭包,看样子改写的幅度还蛮大。

首先引入甘露模型:

/* File Created: 七月 23, 2014 */

function Class() {
var aDefine = arguments[arguments.length - ]; //最后一个参数是类定义
if (!aDefine) return;
var aBase = arguments.length > ? arguments[] : object; //解析基类 function prototype_() { }; //构造prototype的临时函数,用于挂接原型链
prototype_.prototype = aBase.prototype; //准备传递prototype
var aPrototype = new prototype_(); //建立类要用的prototype for (var member in aDefine) //复制类定义到当前类的prototype
if (member != "Create") //构造函数不用复制
aPrototype[member] = aDefine[member]; //根据是否继承特殊属性和性能情况,可分别注释掉下列的语句
if (aDefine.toString != Object.prototype.toString)
aPrototype.toString = aDefine.toString;
if (aDefine.toLocaleString != Object.prototype.toLocaleString)
aPrototype.toLocaleString = aDefine.toLocaleString;
if (aDefine.valueOf != Object.prototype.valueOf)
aPrototype.valueOf = aDefine.valueOf; if (aDefine.Create) //若有构造函数
var aType = aDefine.Create //类型即为该构造函数
else //否则为默认构造函数
aType = function () {
this.base.apply(this, arguments); //调用基类构造函数
}; aType.prototype = aPrototype; //设置类(构造函数)的prototype
aType.Base = aBase; //设置类型关系,便于追溯继承关系
aType.prototype.Type = aType; //为本类对象扩展一个Type属性
return aType; //返回构造函数作为类
}; //根类object定义:
function object() { } //定义小写的object根类,用于实现最基础的方法等
object.prototype.isA = function (aType) //判断对象是否属于某类型
{
var self = this.Type;
while (self) {
if (self == aType) return true;
self = self.Base;
};
return false;
}; object.prototype.base = function () //调用基类构造函数
{
var Base = this.Type.Base; //获取当前对象的基类
if (!Base.Base) //若基类已没有基类
Base.apply(this, arguments) //则直接调用基类构造函数
else //若基类还有基类
{
this.base = MakeBase(Base); //先覆写this.base
Base.apply(this, arguments); //再调用基类构造函数
delete this.base; //删除覆写的base属性
};
function MakeBase(Type) //包装基类构造函数
{
var Base = Type.Base;
if (!Base.Base) return Base; //基类已无基类,就无需包装
return function () //包装为引用临时变量Base的闭包函数
{
this.base = MakeBase(Base); //先覆写this.base
Base.apply(this, arguments); //再调用基类构造函数
};
};
};

O了,这一段如果有不明白的地方,必须得看《悟透Javascript这本书了》 我这里篇幅有限,不多介绍了。

接下来,写下自己已经改造好了的插件

/* File Created: 七月 23, 2014 */

var CustomerModal = Class({
openModal: function () {
modalBG.unbind('click.modalEvent');
$('.' + this.options.dismissmodalclass).unbind('click.modalEvent');
if (!locked) {
this.lockModal();
if (this.options.animation == "fadeAndPop") {
modal.css({ 'top': $(document).scrollTop() - topOffset, 'opacity': , 'visibility': 'visible' });
modalBG.fadeIn(this.options.animationspeed / );
modal.delay(this.options.animationspeed / ).animate({
"top": $(document).scrollTop() + topMeasure,
"opacity":
}, this.options.animationspeed, this.unlockModal());
}
if (this.options.animation == "fade") {
modal.css({ 'opacity': , 'visibility': 'visible', 'top': $(document).scrollTop() + topMeasure });
modalBG.fadeIn(this.options.animationspeed / , function () {
$(this).css('opacity', 0.6);
});
modal.delay(this.options.animationspeed / ).animate({
"opacity":
}, this.options.animationspeed, this.unlockModal());
}
if (this.options.animation == "none") {
modal.css({ 'visibility': 'visible', 'top': $(document).scrollTop() + topMeasure });
modalBG.css({ "display": "block" });
this.unlockModal()
}
}
},
closeModal: function (CModal) {
if (!locked) {
CModal.lockModal();
if (CModal.options.animation == "fadeAndPop") {
modalBG.delay(CModal.options.animationspeed).fadeOut(CModal.options.animationspeed);
modal.animate({
"top": $(document).scrollTop() - topOffset,
"opacity":
}, CModal.options.animationspeed / , function () {
modal.css({ 'top': topMeasure, 'opacity': , 'visibility': 'hidden' });
CModal.unlockModal();
});
}
if (CModal.options.animation == "fade") {
modalBG.delay(CModal.options.animationspeed).fadeOut(CModal.options.animationspeed);
modal.animate({
"opacity":
}, CModal.options.animationspeed, function () {
modal.css({ 'opacity': , 'visibility': 'hidden', 'top': topMeasure });
CModal.unlockModal();
});
}
if (this.options.animation == "none") {
modal.css({ 'visibility': 'hidden', 'top': topMeasure });
modalBG.css({ 'display': 'none' });
}
}
},
unlockModal: function () {
locked = false;
},
lockModal: function () {
locked = true;
}, show: function ($obj, CModal) {
this.defaults = {
animation: 'fade', //fade, fadeAndPop, none
animationspeed: , //how fast animtions are
animationopacity: 0.6, // BG opacity
closeonbackgroundclick: true, //if you click background will modal close?
dismissmodalclass: 'close-reveal-modal' //the class of a button or element that will close an open modal
}; this.options = $.extend({}, this.defaults, this.options); /*---------------------------
Global Variables
----------------------------*/
modal = $obj,
topMeasure = parseInt(modal.css('top')),
topOffset = modal.height() + topMeasure,
locked = false,
modalBG = $('.reveal-modal-bg'); /*---------------------------
Create Modal BG
----------------------------*/
if (modalBG.length == ) {
modalBG = $('<div class="reveal-modal-bg" />').insertAfter(modal);
} /*---------------------------
Open and add Closing Listeners
----------------------------*/
//Open Modal Immediately
this.openModal(); //Close Modal Listeners
var closeButton = $('.' + this.options.dismissmodalclass).bind('click.modalEvent', function () { CModal.closeModal(CModal); });
if (this.options.closeonbackgroundclick) {
modalBG.css({ "cursor": "pointer" });
modalBG.bind('click.modalEvent', function () { CModal.closeModal(CModal) });
} /*---------------------------
Open & Close Animations
----------------------------*/
//Entrance Animations //Closing Animation /*---------------------------
Animations Locks
----------------------------*/
}
});

调用就很简单了:

m_CustomerModal = new CustomerModal();
m_CustomerModal.show($("#watingmodal"),m_CustomerModal);

这个是一个div框而已了,代码如下:

   <div id="watingmodal" class="wating_modal spopup">
请等待......</div>

关闭的时候如此调用:

 m_CustomerModal.closeModal(m_CustomerModal);

虽然看起来有那么些别扭,但是Javascript的this关键字是比较特殊的,如果用call其实也是可以的,条条大路通罗马。

当然,别忘了样式:

.spopup{ top:200px;}
.big-link { display:block; margin-top:100px; text-align:center; font-size:16px;}
.reveal-modal-bg { position:fixed; height:%; width:%; background:#; z-index:; display:none; top:; left:; zoom:; filter:alpha(opacity=); opacity:0.7;}
.reveal-modal { visibility:hidden; position: absolute; left:%; margin-left:-300px; background:#EDEDED; z-index:; border:#ACAEB4 solid 1px; border-radius:5px; behavior:url(js/PIE.htc);}
.reveal-modal .close-reveal-modal { position:absolute; top:6px; right:12px; color:#aaa; cursor:pointer;}
.reveal-modal .popuptitle{ height:28px; background:url(../images/dot03.gif) 12px 7px no-repeat; padding-left:35px;}
.reveal-modal .popuptitle span{ position:relative; top:6px; line-height:20px; color:#E70000; letter-spacing:1px; font-weight:bold;}
.reveal-modal .popupcontent{ background:#FFF; border:#C0C0C0 solid 1px; margin: 4px 3px 4px;}
.reveal-modal .popupcontent .popupbut{ width:%; height:40px; border-top:#C0C0C0 solid 1px; background:#F4F4F4; text-align:right;}
.reveal-modal .popupcontent .popupbut h1{ margin:9px 20px ;}
.reveal-modal .popupcontent .popupbut h1 input{ margin-left:4px;}
.popupbutton{ height:22px; background:url(../images/graybutbg.png) repeat-x; border:#ABADB3 solid 1px; line-height:22px; text-align:center; padding: 10px; cursor:pointer; color:#;}
.popupbutton_on{ height:22px; line-height:22px; text-align:center; padding: 10px; cursor:pointer;}
.wating_modal { visibility:hidden; position: absolute; left:%; top:300px; margin-left:-200px; z-index:; color:#FFF; font-weight:bold; font-size:14px; letter-spacing:1px;}

好吧。。我是不是专业美工,但是扣代码大家都会的吧,模版都给你了的说。。。改造完毕。

改造一个JS插件的过程记录的更多相关文章

  1. js插件ztree使用

    最新给公司后台写了一个配置页面,在网上搜到一个js插件ztree,记录一下使用心得. 首先说一下ztree官网,好多方法我都是从官网api上学习的,官网地址http://www.treejs.cn/v ...

  2. rewrap-ajax.js插件

    很久没有动手写技术的文章,这个过程中间一直在写日记,生活点滴的记录替代了技术文章的编写,可以看出以往的内心是激情或烈火,现在是... 最近写了一个JS插件,用圈内的话说叫造了个轮子,造的好与不好都不是 ...

  3. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  4. [javascript]switchTab:仿腾讯首页Tab栏切换js插件

    腾讯首页的每个新闻栏目都是一个tab选项卡切换,属于延迟动作的:鼠标hover上去之后200毫秒才会切换,防止了因为浏览滑动导致的页面上选项卡的频繁切换.仿照这样的效果,自己写了一个js插件,实现了低 ...

  5. js插件设置innerHTML时,在IE8下报错“未知运行时错误”

    问题描述: 网站中使用了一个js插件,设置innerHTML时,在IE8下报错“未知运行时错误”: <div id=”divContainer”> <a name=”link”> ...

  6. jquery.validate.js插件的使用方法

    近期做项目.须要用到 jQuery.validate.js插件,于是记录一下工作中的一些经验,以便日后学习. [样例例如以下] 1.前台页面 <form id="form1" ...

  7. 关于最近在做的一个js全屏轮播插件

    最近去面试了,对方要求我在一个星期内用原生的js代码写一个全屏轮播的插件,第一想法就是跟照片轮播很相似,只是照片轮播是有定义一个宽高度大小已经确定了的容器用来存储所有照片,然后将照片全部左浮动,利用m ...

  8. pdf.js插件使用记录,在线打开pdf

    天记录一个js库:pdf.js.主要是实现在线打开pdf功能.因为项目需求需要能在线查看pdf文档,所以就研究了一下这个控件. 有些人很好奇,在线打开pdf文档浏览器不是支持吗.是的你说的都是现代浏览 ...

  9. 【记录】如何造一个vite插件(1)

    在看文章前,先做个定位,这不是一篇纯粹的技术性文章,可以把它理解成一个叙述文章,记录我开发插件的过程. 开始前简单的吹个牛 vue2 也写了很多年了,多人合作始终避不开用到别人的组件.关键是有些组件没 ...

随机推荐

  1. eclipse 中文或法文等语言注释错误解决办法 Some characters cannot be mapped using "GBK" character encoding

    这个问题会造成 无法修改包名.解决办法: Window->Preferences->Content Types->Text->Java Source File  Default ...

  2. “全栈2019”Java第六十三章:接口与抽象方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. HTML5中本地储存概念是什么,什么优点 ,与cookie有什么区别?

    html5中的Web Storage 包括了两种存储方式: sessionStorage  和  localStorage. seessionStorage 用于本地存储一个会话(session)中的 ...

  4. 五,Smarty模板技术/引擎——自定义函数机制

    自建函数是smarty提供的函数,不允许修改,只能被调用: 自定义函数是自己编写函数,注册成为smarty的函数,之后可以被调用: 示例:使用smarty自定义函数的机制,编写一个函数myfun1,通 ...

  5. JMeter—断言

    断言用来对服务器的响应数据做验证,常用的断言是响应断言,支持正则表达式. 一.BeanShell Assertion 用来访问JMeter的属性: log对象,可以利用此对象写日志 SampleRes ...

  6. scrapyd 参考(https://www.jianshu.com/p/2a189127901a)

    一    Scrapyd简介 Scrapyd 是一个用来部署和运行 Scrapy 项目的应用,由 Scrapy 的开发者开发.其可以通过一个简单的 Json API 来部署(上传)或者控制你的项目. ...

  7. 【Python】批量检测百度权重

    挖洞过程中收集了站点后,我一般习惯查看站点的百度权重值,为了方便,写了一个简单的脚本, 至于结果如何显示,看个人需求吧,我这里只是简单的列一下,脚本如下: #coding:utf-8 import r ...

  8. FreeRTOS-06任务运行时间信息统计

    根据正点原子FreeRTOS视频整理 单片机:STM32F207VC FreeRTOS源码版本:v10.0.1 * 1. 要使用vTaskGetRunTimeStats()函数,需满足以下条件: * ...

  9. flutter 导入 http 库 import 'package:http/http.dart' as http;

    1,查看最新 http 版本 https://pub.dartlang.org/packages/http#-installing-tab- 1. Depend on it 在项目中找到 pubspe ...

  10. Form Authentication

    1.创建登陆的控制器和视图,实现登陆基本功能 2.创建视图模型,并在Action里面引用. 3.创建一个接口两个类,那个IUserPricipal接口要实现IPrincipal接口,UserPrici ...