封装方法到对象(javascript)

 

 

/*!

* artDialog 5

* Date: 2012-03-21

* http://code.google.com/p/artdialog/

* (c) 2009-2012 TangBin, http://www.planeArt.cn

*

* This is licensed under the GNU LGPL, version 2.1 or later.

* For details, see: http://creativecommons.org/licenses/LGPL/2.1/

*/



;(function (window, undefined) {



var $ = window.art = function (selector, context) {

return new $.fn.constructor(selector, context);

},

quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,

rclass = /[\n\t]/g;



if (window.$ === undefined) {

window.$ = $;

};



$.fn = $.prototype = {



constructor: function (selector, context) {

var match, elem;

context = context || document;



if (!selector) {

return this;

};



if (selector.nodeType) {

this[0] = selector;

return this;

};



if (typeof selector === 'string') {

match = quickExpr.exec(selector);



if (match && match[2]) {

elem = context.getElementById(match[2]);

if (elem && elem.parentNode) this[0] = elem;

return this;

};

};



this[0] = selector;

return this;

},



/**

* 判断样式类是否存在

* @param    {String}    名称

* @return    {Boolean}

*/

hasClass: function (name) {    

var className = ' ' + name + ' ';



if ((' ' + this[0].className + ' ').replace(rclass, ' ').indexOf(className) > -1) {

return true;

};



return false;

},



/**

* 添加样式类

* @param    {String}    名称

*/

addClass: function (name) {

if (!this.hasClass(name)) {

this[0].className += ' ' + name;

};



return this;

},



/**

* 移除样式类

* @param    {String}    名称

*/

removeClass: function (name) {

var elem = this[0];



if (!name) {

elem.className = '';

} else

if (this.hasClass(name)) {

elem.className = elem.className.replace(name, ' ');

};



return this;

},



/**

* 读写样式<br />

* css(name) 访问第一个匹配元素的样式属性<br />

* css(properties) 把一个"名/值对"对象设置为所有匹配元素的样式属性<br />

* css(name, value) 在所有匹配的元素中,设置一个样式属性的值<br />

*/

css: function (name, value) {

var i, elem = this[0], obj = arguments[0];



if (typeof name === 'string') {

if (value === undefined) {

return $.css(elem, name);

} else {

elem.style[name] = value;    

};

} else {

for (i in obj) {

elem.style[i] = obj[i];

};

};



return this;

},



/** 显示元素 */

show: function () {

return this.css('display', 'block');

},



/** 隐藏元素 */

hide: function () {

return this.css('display', 'none');

},



/**

* 获取相对文档的坐标

* @return    {Object}    返回left、top的数值

*/

offset: function () {

var elem = this[0],

box = elem.getBoundingClientRect(),

doc = elem.ownerDocument,

body = doc.body,

docElem = doc.documentElement,

clientTop = docElem.clientTop || body.clientTop || 0,

clientLeft = docElem.clientLeft || body.clientLeft || 0,

top = box.top + (self.pageYOffset || docElem.scrollTop) - clientTop,

left = box.left + (self.pageXOffset || docElem.scrollLeft) - clientLeft;



return {

left: left,

top: top

};

},



/**

* 读写HTML - (不支持文本框)

* @param    {String}    内容

*/

html: function (content) {

var elem = this[0];



if (content === undefined) return elem.innerHTML;

$.cleanData(elem.getElementsByTagName('*'));

elem.innerHTML = content;



return this;

},



/**

* 移除节点

*/

remove: function () {

var elem = this[0];



$.cleanData(elem.getElementsByTagName('*'));

$.cleanData([elem]);

elem.parentNode.removeChild(elem);



return this;

},



/**

* 事件绑定

* @param    {String}    类型

* @param    {Function}    要绑定的函数

*/

bind: function (type, callback) {

$.event.add(this[0], type, callback);

return this;

},



/**

* 移除事件

* @param    {String}    类型

* @param    {Function}    要卸载的函数

*/

unbind: function(type, callback) {

$.event.remove(this[0], type, callback);

return this;

}



};



$.fn.constructor.prototype = $.fn;





/** 检测window */

$.isWindow = function (obj) {

return obj && typeof obj === 'object' && 'setInterval' in obj;

};





/**

* 搜索子元素

* 注意:只支持nodeName或.className的形式,并且只返回第一个元素

* @param    {String}

*/

$.fn.find = function (expr) {

var value, elem = this[0],

className = expr.split('.')[1];



if (className) {

if (document.getElementsByClassName) {

value = elem.getElementsByClassName(className);

} else {

value = getElementsByClassName(className, elem);

};

} else {

value = elem.getElementsByTagName(expr);

};



return $(value[0]);

};

function getElementsByClassName (className, node, tag) {

node = node || document;

tag = tag || '*';

var i = 0,

j = 0,

classElements = [],

els = node.getElementsByTagName(tag),

elsLen = els.length,

pattern = new RegExp("(^|\\s)" + className + "(\\s|$)");



for (; i < elsLen; i ++) {

if (pattern.test(els[i].className)) {

classElements[j] = els[i];

j ++;

};

};

return classElements;

};



/**

* 遍历

* @param {Object}

* @param {Function}

*/

$.each = function (obj, callback) {

var name, i = 0,

length = obj.length,

isObj = length === undefined;



if (isObj) {

for (name in obj) {

if (callback.call(obj[name], name, obj[name]) === false) {

break;

};

};

} else {

for (

var value = obj[0];

i < length && callback.call(value, i, value) !== false;

value = obj[++i]

) {};

};



return obj;

};



/**

* 读写缓存

* @param     {HTMLElement}    元素

* @param     {String}     缓存名称

* @param     {Any}     数据

* @return     {Any}     如果无参数data则返回缓存数据

*/

$.data = function (elem, name, data) {

var cache = $.cache,

id = uuid(elem);



if (name === undefined) {

return cache[id];

};



if (!cache[id]) {

cache[id] = {};

};



if (data !== undefined) {

cache[id][name] = data;

};



return cache[id][name];

};



/**

* 删除缓存

* @param     {HTMLElement}    元素

* @param     {String}     缓存名称

*/

$.removeData = function (elem, name) {

var empty = true,

expando = $.expando,

cache = $.cache,

id = uuid(elem),

thisCache = id && cache[id];



if (!thisCache) {

return;

};



if (name) {



delete thisCache[name];

for (var n in thisCache) {

empty = false;

};



if (empty) {

delete $.cache[id];

};



} else {



delete cache[id];



if (elem.removeAttribute) {

elem.removeAttribute(expando);

} else {

elem[expando] = null;

};



};

};



$.uuid = 0;

$.cache = {};

$.expando = '@cache' + + new Date;



// 标记元素唯一身份

function uuid (elem) {

var expando = $.expando,

id = elem === window ? 0 : elem[expando];

if (id === undefined) elem[expando] = id = ++ $.uuid;

return id;

};





/**

* 事件机制

* @namespace

* @requires    [$.data, $.removeData]

*/

$.event = {



/**

* 添加事件

* @param     {HTMLElement}    元素

* @param     {String}     事件类型

* @param     {Function}     要添加的函数

*/

add: function (elem, type, callback) {

var cache, listeners,

that = $.event,

data = $.data(elem, '@events') || $.data(elem, '@events', {});



cache = data[type] = data[type] || {};

listeners = cache.listeners = cache.listeners || [];

listeners.push(callback);



if (!cache.handler) {

cache.elem = elem;

cache.handler = that.handler(cache);



elem.addEventListener

? elem.addEventListener(type, cache.handler, false)

: elem.attachEvent('on' + type, cache.handler);

};

},



/**

* 卸载事件

* @param     {HTMLElement}    元素

* @param     {String}     事件类型

* @param     {Function}     要卸载的函数

*/

remove: function (elem, type, callback) {

var i, cache, listeners,

that = $.event,

empty = true,

data = $.data(elem, '@events');



if (!data) {

return;

};



if (!type) {

for (i in data) that.remove(elem, i);

return;

};



cache = data[type];



if (!cache) {

return;

};



listeners = cache.listeners;

if (callback) {

for (i = 0; i < listeners.length; i ++) {

listeners[i] === callback && listeners.splice(i--, 1);

};

} else {

cache.listeners = [];

};



if (cache.listeners.length === 0) {

elem.removeEventListener

? elem.removeEventListener(type, cache.handler, false)

: elem.detachEvent('on' + type, cache.handler);



delete data[type];

cache = $.data(elem, '@events');



for (var n in cache) {

empty = false;

};



if (empty) {

$.removeData(elem, '@events');

};

};

},



/** @inner 事件句柄 */

handler: function (cache) {

return function (event) {

event = $.event.fix(event || window.event);

for (var i = 0, list = cache.listeners, fn; fn = list[i++];) {

if (fn.call(cache.elem, event) === false) {

event.preventDefault();

event.stopPropagation();

};

};

};

},



/** @inner Event对象兼容处理 */

fix: function (event) {

if (event.target) {

return event;

};



var eventObj = {

target: event.srcElement || document,

preventDefault: function () {event.returnValue = false},

stopPropagation: function () {event.cancelBubble = true}

};



// IE6/7/8 在原生window.event对象写入数据会导致内存无法回收,应当采用拷贝

for (var i in event) {

eventObj[i] = event[i];

}



return eventObj;

}



};



/**

* 清理元素集的事件与缓存

* @requires    [$.removeData, $.event]

* @param     {HTMLCollection}    元素集

*/

$.cleanData = function (elems) {

var i = 0, elem,

len = elems.length,

removeEvent = $.event.remove,

removeData = $.removeData;



for (; i < len; i ++) {

elem = elems[i];

removeEvent(elem);

removeData(elem);

};

};



// 获取css

$.css = 'defaultView' in document && 'getComputedStyle' in document.defaultView ?

function (elem, name) {

return document.defaultView.getComputedStyle(elem, false)[name];

} :

function (elem, name) {

return elem.currentStyle[name] || '';

};





/**

* 获取滚动条位置 - [不支持写入]

* $.fn.scrollLeft, $.fn.scrollTop

* @example     获取文档垂直滚动条:$(document).scrollTop()

* @return     {Number}    返回滚动条位置

*/

$.each(['Left', 'Top'], function (i, name) {

var method = 'scroll' + name;



$.fn[method] = function () {

var elem = this[0], win;



win = getWindow(elem);

return win ?

('pageXOffset' in win) ?

win[i ? 'pageYOffset' : 'pageXOffset'] :

win.document.documentElement[method] || win.document.body[method] :

elem[method];

};

});



function getWindow (elem) {

return $.isWindow(elem) ?

elem :

elem.nodeType === 9 ?

elem.defaultView || elem.parentWindow :

false;

};



/**

* 获取窗口或文档尺寸 - [只支持window与document读取]

* @example 

获取文档宽度:$(document).width()

获取可视范围:$(window).width()

* @return    {Number}

*/

$.each(['Height', 'Width'], function (i, name) {

var type = name.toLowerCase();



$.fn[type] = function (size) {

var elem = this[0];

if (!elem) {

return size == null ? null : this;

};



return $.isWindow(elem) ?

elem.document.documentElement['client' + name] || elem.document.body['client' + name] :

(elem.nodeType === 9) ?

Math.max(

elem.documentElement['client' + name],

elem.body['scroll' + name], elem.documentElement['scroll' + name],

elem.body['offset' + name], elem.documentElement['offset' + name]

) : null;

};



});



return $}(window));



;(function ($, window, undefined) {



// artDialog 只支持 xhtml 1.0 或者以上的 DOCTYPE 声明

if (document.compatMode === 'BackCompat') {

throw new Error('artDialog: Document types require more than xhtml1.0');

};



var _singleton,

_count = 0,

_expando = 'artDialog' + + new Date,

_isIE6 = window.VBArray && !window.XMLHttpRequest,

_isMobile = 'createTouch' in document && !('onmousemove' in document)

|| /(iPhone|iPad|iPod)/i.test(navigator.userAgent),

_isFixed = !_isIE6 && !_isMobile;





var artDialog = function (config, ok, cancel) {



config = config || {};



if (typeof config === 'string' || config.nodeType === 1) {



config = {content: config, fixed: !_isMobile};

};





var api, defaults = artDialog.defaults;

var elem = config.follow = this.nodeType === 1 && this || config.follow;





// 合并默认配置

for (var i in defaults) {

if (config[i] === undefined) {

config[i] = defaults[i];

};

};





config.id = elem && elem[_expando + 'follow'] || config.id || _expando + _count;

api = artDialog.list[config.id];







if (api) {

if (elem) {

api.follow(elem)

};

api.zIndex().focus();

return api;

};







// 目前主流移动设备对fixed支持不好

if (!_isFixed) {

config.fixed = false;

};



// !$.isArray(config.button)

if (!config.button || !config.button.push) {

config.button = [];

};





// 确定按钮

if (ok !== undefined) {

config.ok = ok;

};



if (config.ok) {

config.button.push({

id: 'ok',

value: config.okValue,

callback: config.ok,

focus: true

});

};





// 取消按钮

if (cancel !== undefined) {

config.cancel = cancel;

};



if (config.cancel) {

config.button.push({

id: 'cancel',

value: config.cancelValue,

callback: config.cancel

});

};



// 更新 zIndex 全局配置

artDialog.defaults.zIndex = config.zIndex;



_count ++;



return artDialog.list[config.id] = _singleton ?

_singleton.constructor(config) : new artDialog.fn.constructor(config);

};



artDialog.version = '5.0';



artDialog.fn = artDialog.prototype = {



/** @inner */

constructor: function (config) {

var dom;



this.closed = false;

this.config = config;

this.dom = dom = this.dom || this._getDom();



config.skin && dom.wrap.addClass(config.skin);



dom.wrap.css('position', config.fixed ? 'fixed' : 'absolute');

dom.close[config.cancel === false ? 'hide' : 'show']();

dom.content.css('padding', config.padding);



this.button.apply(this, config.button);



this.title(config.title)

.content(config.content)

.size(config.width, config.height)

.time(config.time);



config.follow

? this.follow(config.follow)

: this.position();



this.zIndex();

config.lock && this.lock();



this._addEvent();

this[config.visible ? 'visible' : 'hidden']().focus();



_singleton = null;



config.initialize && config.initialize.call(this);



return this;

},





/**

* 设置内容

* @param    {String, HTMLElement, Object}    内容 (可选)

*/

content: function (message) {



var prev, next, parent, display,

that = this,

$content = this.dom.content,

content = $content[0];





if (this._elemBack) {

this._elemBack();

delete this._elemBack;

};





if (typeof message === 'string') {



$content.html(message);

} else



if (message && message.nodeType === 1) {



// 让传入的元素在对话框关闭后可以返回到原来的地方

display = message.style.display;

prev = message.previousSibling;

next = message.nextSibling;

parent = message.parentNode;



this._elemBack = function () {

if (prev && prev.parentNode) {

prev.parentNode.insertBefore(message, prev.nextSibling);

} else if (next && next.parentNode) {

next.parentNode.insertBefore(message, next);

} else if (parent) {

parent.appendChild(message);

};

message.style.display = display;

that._elemBack = null;

};



$content.html('');

content.appendChild(message);

$(message).show();



};



return this.position();

},





/**

* 设置标题

* @param    {String, Boolean}    标题内容. 为 false 则隐藏标题栏

*/

title: function (content) {



var dom = this.dom,

outer = dom.outer,

$title = dom.title,

className = 'd-state-noTitle';



if (content === false) {

$title.hide().html('');

outer.addClass(className);

} else {

$title.show().html(content);

outer.removeClass(className);

};



return this;

},

/** @inner 位置居中 */

position: function () {



var dom = this.dom,

wrap = dom.wrap[0],

$window = dom.window,

$document = dom.document,

fixed = this.config.fixed,

dl = fixed ? 0 : $document.scrollLeft(),

dt = fixed ? 0 : $document.scrollTop(),

ww = $window.width(),

wh = $window.height(),

ow = wrap.offsetWidth,

oh = wrap.offsetHeight,

left = (ww - ow) / 2 + dl,

top = top = (oh < 4 * wh / 7 ? wh * 0.382 - oh / 2 : (wh - oh) / 2) + dt,

style = wrap.style;



style.left = Math.max(left, dl) + 'px';

style.top = Math.max(top, dt) + 'px';



return this;

},





/**

*    尺寸

*    @param    {Number, String}    宽度

*    @param    {Number, String}    高度

*/

size: function (width, height) {



var style = this.dom.main[0].style;



if (typeof width === 'number') {

width = width + 'px';

};



if (typeof height === 'number') {

height = height + 'px';

};



style.width = width;

style.height = height;



return this;

},





/**

* 跟随元素

* @param    {HTMLElement}

*/

follow: function (elem) {



var $elem = $(elem),

config = this.config;





// 隐藏元素不可用

if (!elem || !elem.offsetWidth && !elem.offsetHeight) {



return this.position(this._left, this._top);

};



var fixed = config.fixed,

expando = _expando + 'follow',

dom = this.dom,

$window = dom.window,

$document = dom.document,

winWidth = $window.width(),

winHeight = $window.height(),

docLeft = $document.scrollLeft(),

docTop = $document.scrollTop(),

offset = $elem.offset(),

width = elem.offsetWidth,

height = elem.offsetHeight,

left = fixed ? offset.left - docLeft : offset.left,

top = fixed ? offset.top - docTop : offset.top,

wrap = this.dom.wrap[0],

style = wrap.style,

wrapWidth = wrap.offsetWidth,

wrapHeight = wrap.offsetHeight,

setLeft = left - (wrapWidth - width) / 2,

setTop = top + height,

dl = fixed ? 0 : docLeft,

dt = fixed ? 0 : docTop;





setLeft = setLeft < dl ? left :

(setLeft + wrapWidth > winWidth) && (left - wrapWidth > dl)

? left - wrapWidth + width

: setLeft;





setTop = (setTop + wrapHeight > winHeight + dt)

&& (top - wrapHeight > dt)

? top - wrapHeight

: setTop;





style.left = setLeft + 'px';

style.top = setTop + 'px';





this._follow && this._follow.removeAttribute(expando);

this._follow = elem;

elem[expando] = config.id;



return this;

},





/**

* 自定义按钮

* @example

button({

value: 'login',

callback: function () {},

disabled: false,

focus: true

}, .., ..)

*/

button: function () {



var dom = this.dom,

$buttons = dom.buttons,

elem = $buttons[0],

strongButton = 'd-state-highlight',

listeners = this._listeners = this._listeners || {},

ags = [].slice.call(arguments);



var i = 0, val, value, id, isNewButton, button;



for (; i < ags.length; i ++) {



val = ags[i];



value = val.value;

id = val.id || value;

isNewButton = !listeners[id];

button = !isNewButton ? listeners[id].elem : document.createElement('input');



button.type = 'button';

button.className = 'd-button';



if (!listeners[id]) {

listeners[id] = {};

};



if (value) {

button.value = value;

};



if (val.width) {

button.style.width = val.width;

};



if (val.callback) {

listeners[id].callback = val.callback;

};



if (val.focus) {

this._focus && this._focus.removeClass(strongButton);

this._focus = $(button).addClass(strongButton);

this.focus();

};



button[_expando + 'callback'] = id;

button.disabled = !!val.disabled;

if (isNewButton) {

listeners[id].elem = button;

elem.appendChild(button);

};

};



$buttons[0].style.display = ags.length ? '' : 'none';



return this;

},





/** 显示对话框 */

visible: function () {

//this.dom.wrap.show();

this.dom.wrap.css('visibility', 'visible');

this.dom.outer.addClass('d-state-visible');



if (this._isLock) {

this._lockMask.show();

};



return this;

},





/** 隐藏对话框 */

hidden: function () {

//this.dom.wrap.hide();

this.dom.wrap.css('visibility', 'hidden');

this.dom.outer.removeClass('d-state-visible');



if (this._isLock) {

this._lockMask.hide();

};



return this;

},





/** 关闭对话框 */

close: function () {



if (this.closed) {

return this;

};



var dom = this.dom,

$wrap = dom.wrap,

list = artDialog.list,

beforeunload = this.config.beforeunload,

follow = this.config.follow;



if (beforeunload && beforeunload.call(this) === false) {

return this;

};





if (artDialog.focus === this) {

artDialog.focus = null;

};





if (follow) {

follow.removeAttribute(_expando + 'follow');

};





if (this._elemBack) {

this._elemBack();

};







this.time();

this.unlock();

this._removeEvent();

delete list[this.config.id];





if (_singleton) {



$wrap.remove();



// 使用单例模式

} else {



_singleton = this;



dom.title.html('');

dom.content.html('');

dom.buttons.html('');



$wrap[0].className = $wrap[0].style.cssText = '';

dom.outer[0].className = 'd-outer';



$wrap.css({

left: 0,

top: 0,

position: _isFixed ? 'fixed' : 'absolute'

});



for (var i in this) {

if (this.hasOwnProperty(i) && i !== 'dom') {

delete this[i];

};

};



this.hidden();



};



this.closed = true;

return this;

},





/**

* 定时关闭

* @param    {Number}    单位毫秒, 无参数则停止计时器

*/

time: function (time) {



var that = this,

timer = this._timer;



timer && clearTimeout(timer);



if (time) {

this._timer = setTimeout(function(){

that._click('cancel');

}, time);

};





return this;

},



/** @inner 设置焦点 */

focus: function () {



if (this.config.focus) {

//setTimeout(function () {

try {

var elem = this._focus && this._focus[0] || this.dom.close[0];

elem && elem.focus();

// IE对不可见元素设置焦点会报错

} catch (e) {};

//}, 0);

};



return this;

},





/** 置顶对话框 */

zIndex: function () {



var dom = this.dom,

top = artDialog.focus,

index = artDialog.defaults.zIndex ++;



// 设置叠加高度

dom.wrap.css('zIndex', index);

this._lockMask && this._lockMask.css('zIndex', index - 1);



// 设置最高层的样式

top && top.dom.outer.removeClass('d-state-focus');

artDialog.focus = this;

dom.outer.addClass('d-state-focus');



return this;

},





/** 设置屏锁 */

lock: function () {



if (this._isLock) {

return this;

};



var that = this,

config = this.config,

dom = this.dom,

div = document.createElement('div'),

$div = $(div),

index = artDialog.defaults.zIndex - 1;



this.zIndex();

dom.outer.addClass('d-state-lock');



$div.css({

zIndex: index,

position: 'fixed',

left: 0,

top: 0,

width: '100%',

height: '100%',

overflow: 'hidden'

}).addClass('d-mask');



if (!_isFixed) {

$div.css({

position: 'absolute',

width: $(window).width() + 'px',

height: $(document).height() + 'px'

});

};





$div.bind('click', function () {

that._reset();

}).bind('dblclick', function () {

that._click('cancel');

});



document.body.appendChild(div);



this._lockMask = $div;

this._isLock = true;



return this;

},





/** 解开屏锁 */

unlock: function () {



if (!this._isLock) {

return this;

};



this._lockMask.unbind();

this._lockMask.hide();

this._lockMask.remove();



this.dom.outer.removeClass('d-state-lock');

this._isLock = false;



return this;

},





// 获取元素

_getDom: function () {



var body = document.body;



if (!body) {

throw new Error('artDialog: "documents.body" not ready');

};



var wrap = document.createElement('div');



wrap.style.cssText = 'position:absolute;left:0;top:0';

wrap.innerHTML = artDialog._templates;

body.insertBefore(wrap, body.firstChild);



var name,

i = 0,

dom = {},

els = wrap.getElementsByTagName('*'),

elsLen = els.length;



for (; i < elsLen; i ++) {

name = els[i].className.split('d-')[1];

if (name) {

dom[name] = $(els[i]);

};

};



dom.window = $(window);

dom.document = $(document);

dom.wrap = $(wrap);



return dom;

},





// 按钮回调函数触发

_click: function (id) {



var fn = this._listeners[id] && this._listeners[id].callback;



return typeof fn !== 'function' || fn.call(this) !== false ?

this.close() : this;

},





// 重置位置

_reset: function () {

var elem = this.config.follow;

elem ? this.follow(elem) : this.position();

},





// 事件代理

_addEvent: function () {



var that = this,

dom = this.dom;





// 监听点击

dom.wrap

.bind('click', function (event) {



var target = event.target, callbackID;



// IE BUG

if (target.disabled) {

return false;

};



if (target === dom.close[0]) {

that._click('cancel');

return false;

} else {

callbackID = target[_expando + 'callback'];

callbackID && that._click(callbackID);

};



})

.bind('mousedown', function () {

that.zIndex();

});



},





// 卸载事件代理

_removeEvent: function () {

this.dom.wrap.unbind();

}



};



artDialog.fn.constructor.prototype = artDialog.fn;



 



$.fn.dialog = $.fn.artDialog = function () {

var config = arguments;

this[this.live ? 'live' : 'bind']('click', function () {

artDialog.apply(this, config);

return false;

});

return this;

};



 



/** 最顶层的对话框API */

artDialog.focus = null;



 



/**

* 根据 ID 获取某对话框 API

* @param    {String}    对话框 ID

* @return    {Object}    对话框 API (实例)

*/

artDialog.get = function (id) {

return id === undefined

? artDialog.list

: artDialog.list[id];

};



artDialog.list = {};



 



// 全局快捷键

$(document).bind('keydown', function (event) {

var target = event.target,

nodeName = target.nodeName,

rinput = /^input|textarea$/i,

api = artDialog.focus,

keyCode = event.keyCode;



if (!api || !api.config.esc || rinput.test(nodeName) && target.type !== 'button') {

return;

};



// ESC

keyCode === 27 && api._click('cancel');

});



 



// 浏览器窗口改变后重置对话框位置

$(window).bind('resize', function () {

var dialogs = artDialog.list;

for (var id in dialogs) {

dialogs[id]._reset();

};

});



 



// XHTML 模板

// 使用 uglifyjs 压缩能够预先处理"+"号合并字符串

// @see    http://marijnhaverbeke.nl/uglifyjs

artDialog._templates = 

'<div class="d-outer">'

+    '<table class="d-border">'

+     '<tbody>'

+     '<tr>'

+     '<td class="d-nw"></td>'

+     '<td class="d-n"></td>'

+     '<td class="d-ne"></td>'

+     '</tr>'

+     '<tr>'

+     '<td class="d-w"></td>'

+     '<td class="d-c">'

+     '<div class="d-inner">'

+     '<table class="d-dialog">'

+     '<tbody>'

+     '<tr>'

+     '<td class="d-header">'

+     '<div class="d-titleBar">'

+     '<div class="d-title"></div>'

+     '<a class="d-close" href="javascript:/*artDialog*/;">'

+     '\xd7'

+     '</a>'

+     '</div>'

+     '</td>'

+     '</tr>'

+     '<tr>'

+     '<td class="d-main">'

+     '<div class="d-content"></div>'

+     '</td>'

+     '</tr>'

+     '<tr>'

+     '<td class="d-footer">'

+     '<div class="d-buttons"></div>'

+     '</td>'

+     '</tr>'

+     '</tbody>'

+     '</table>'

+     '</div>'

+     '</td>'

+     '<td class="d-e"></td>'

+     '</tr>'

+     '<tr>'

+     '<td class="d-sw"></td>'

+     '<td class="d-s"></td>'

+     '<td class="d-se"></td>'

+     '</tr>'

+     '</tbody>'

+    '</table>'

+'</div>';



 



/**

* 默认配置

*/

artDialog.defaults = {



// 消息内容

content: '<div class="d-loading"><span>loading..</span></div>',



// 标题

title: 'message',



// 自定义按钮

button: null,



// 确定按钮回调函数

ok: null,



// 取消按钮回调函数

cancel: null,



// 对话框初始化后执行的函数

initialize: null,



// 对话框关闭前执行的函数

beforeunload: null,



// 确定按钮文本

okValue: 'ok',



// 取消按钮文本

cancelValue: 'cancel',



// 内容宽度

width: 'auto',



// 内容高度

height: 'auto',



// 内容与边界填充距离

padding: '20px 25px',



// 皮肤名(多皮肤共存预留接口)

skin: null,



// 自动关闭时间

time: null,



// 是否支持Esc键关闭

esc: true,



// 是否支持对话框按钮自动聚焦

focus: true,



// 初始化后是否显示对话框

visible: true,



// 让对话框跟随某元素

follow: null,



// 是否锁屏

lock: false,



// 是否固定定位

fixed: false,



// 对话框叠加高度值(重要:此值不能超过浏览器最大限制)

zIndex: 1987



};



this.artDialog = $.dialog = $.artDialog = artDialog;

}(this.art || this.jQuery, this));



 

 

你可能感兴趣的:(JavaScript)