/**
* @description Mask 弹层
* @function
* @name Mask
* @param {Object} options 配置项
*/ var passport = passport || {} passport.page = passport.page || {}; /**
* @description 获取页面宽度
* @name passport.page.getWidth
* @function
* @grammar passport.page.getWidth()
* @return {number} 页面宽度
*/
passport.page.getWidth = function () {
var doc = document,
body = doc.body,
html = doc.documentElement,
client = doc.compatMode == 'BackCompat' ? body : doc.documentElement; return Math.max(html.scrollWidth, body.scrollWidth, client.clientWidth);
}; /**
* @description 获取页面高度
* @name passport.page.getHeight
* @function
* @grammar passport.page.getHeight()
*
* @return {number} 页面高度
*/
passport.page.getHeight = function () {
var doc = document,
body = doc.body,
html = doc.documentElement,
client = doc.compatMode == 'BackCompat' ? body : doc.documentElement; return Math.max(html.scrollHeight, body.scrollHeight, client.clientHeight);
}; /**
* @description 获取页面视觉区域宽度
* @name passport.page.getViewWidth
* @function
* @grammar passport.page.getViewWidth()
*
* @return {number} 页面视觉区域宽度
*/
passport.page.getViewWidth = function () {
var doc = document,
client = doc.compatMode == 'BackCompat' ? doc.body : doc.documentElement; return client.clientWidth;
}; /**
* @description 获取页面视觉区域高度
* @name passport.page.getViewHeight
* @function
* @grammar passport.page.getViewHeight()
* @return {number} 页面视觉区域高度
*/
passport.page.getViewHeight = function () {
var doc = document,
client = doc.compatMode == 'BackCompat' ? doc.body : doc.documentElement; return client.clientHeight;
}; /**
* @description 获取纵向滚动量
* @name passport.page.getScrollTop
* @function
* @grammar passport.page.getScrollTop()
* @return {number} 纵向滚动量
*/
passport.page.getScrollTop = function () {
var d = document;
return window.pageYOffset || d.documentElement.scrollTop || d.body.scrollTop;
}; /*
* @description 获取横向滚动量
*
* @return {number} 横向滚动量
*/
passport.page.getScrollLeft = function () {
var d = document;
return window.pageXOffset || d.documentElement.scrollLeft || d.body.scrollLeft;
}; function Mask(options){
var me = this,
ua = navigator.userAgent,
maskHtml = me.toHTMLString(),
sf = /(\d+\.\d)?(?:\.\d)?\s+safari\/?(\d+\.\d+)?/i.test(ua) && !/chrome/i.test(ua) ? + (RegExp['\x241'] || RegExp['\x242']) : undefined,
ie = /msie (\d+\.\d+)/i.test(ua) ? (document.documentMode || + RegExp['\x241']) : undefined; me.zIndex = 999;
me.opacity = 0.3;
me.bgColor = "#000000";
me.coverable = false;
me.container = document.body; insertHTML.call(me.container,"afterBegin", maskHtml) me.maskDom = document.getElementById('PASSP__DIA__Mask'); if(ie == 6){
me.maskDom.style.position = "absolute";
} function insertHTML( position, html) {
var range,begin,element = this; //在opera中insertAdjacentHTML方法实现不标准,如果DOMNodeInserted方法被监听则无法一次插入多element
if (element.insertAdjacentHTML) {
element.insertAdjacentHTML(position, html);
} else {
// 这里不做"undefined" != typeof(HTMLElement) && !window.opera判断,其它浏览器将出错?!
// 但是其实做了判断,其它浏览器下等于这个函数就不能执行了
range = element.ownerDocument.createRange();
// FF下range的位置设置错误可能导致创建出来的fragment在插入dom树之后html结构乱掉
// 改用range.insertNode来插入html, by wenyuxiang @ 2010-12-14.
position = position.toUpperCase();
if (position == 'AFTERBEGIN' || position == 'BEFOREEND') {
range.selectNodeContents(element);
range.collapse(position == 'AFTERBEGIN');
} else {
begin = position == 'BEFOREBEGIN';
range[begin ? 'setStartBefore' : 'setEndAfter'](element);
range.collapse(begin);
}
range.insertNode(range.createContextualFragment(html));
}
return element;
} function resize(){
if (me.container == document.body) {
var ls = me.maskDom.style; ls.width = passport.page.getViewWidth() + 'px'; ls.height = passport.page.getViewHeight() + 'px'; ls.display = "";
}
} function scroll(){
if (me.container == document.body) {
var ls = me.maskDom.style;
ls.display = "none";
ls.top = passport.page.getScrollTop() + "px";
ls.left = passport.page.getScrollLeft() + "px";
ls.display = "";
}
} function showObjects(bool){
var objects = document.getElementsByTagName("object");
var v = bool ? "visible" : "hidden";
for(var i = 0, o, l = objects.length; i < l; i ++){
o = objects[i];
o.style.visibility = v;
}
} Mask.prototype.show = function(){
var me = this;
resize();
ie == 6 && scroll();
$(window).on("resize", resize);
ie == 6 && $(window).on("scroll", scroll); var es = me.maskDom.style;
es.opacity = me.opacity;
es.zIndex = me.zIndex;
es.filter = "alpha(opacity=" + me.opacity * 100 + ")";
es.backgroundColor = me.bgColor; es.display = ''; sf && showObjects(false);
} Mask.prototype.hide = function(){
var es = me.maskDom.style;
es.display = 'none';
$(window).off("resize", resize);
ie == 6 && $(window).off("scroll", scroll);
sf && showObjects(true);
} } Mask.prototype.toHTMLString = function(){
return "<div id='PASSP__DIA__Mask' style='top:0px; left:0px; position:fixed; display:none;'>"
+("<iframe frameborder='0' style='"
+"filter:progid:DXImageTransform.Microsoft.Alpha(opacity:0);"
+"position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:-1' "
+"src='" + (window.location.protocol.toLowerCase() == "https:" ? "https://passport.passport.com/passApi/html/_blank.html" : "about:blank") + "'></iframe><div style='position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:-1;'> </div>") +"</div>";
} /**
* @description Dialog 弹层
* @class
* @name Dialog
* @param {Object} options 配置项
* @param {Number} options.width 弹层宽度
* @param {Number} options.height 弹层高度
* @param {Boolean} options.mask 是否需要遮罩层
* @param {String} options.titleText 标题
*/ function Dialog(options){
this.options = options;
this._width = this.options.width || "auto";
this._height = this.options.height || "auto";
this.dom = this.options.dom;
this._mask = this.options.mask || true;
this._titleText = this.options.title;
this._closeBtn = this.options.closeBtn || true,
this._eventMng = [];
this.onRender = this.options.onRender || function(){};
this._num = 'PASSP__DIA__'+Math.floor(Math.random() * 2147483648).toString(36).toUpperCase()+'_';
this.init()
} Dialog.renderMask = function(){
var me = this;
if(this._mask) return this;
this._mask = new Mask()
} Dialog._createElement = function(id){
var el = document.createElement('div');
el.id = id;
return el
} Dialog.prototype.setWidth = function(width){
this.el.style.width = width + 'px'
} Dialog.prototype.setHeight = function(height){
this.el.style.width = height + 'px' } Dialog.prototype.setSize = function(size){
this.setWidth(size.width || size[0])
this.setHeight(size.height || size[1])
} Dialog.prototype.setPosition = function(pos){
if(this.el.style.position == "static"){
this.el.style.position = 'absolute'
} if(typeof pos.left == "number")
this.el.style.left = pos.left + 'px'
if(typeof pos.top == "number")
this.el.style.top = pos.top + 'px'
} Dialog.prototype.show = function(){
if(this.options.beforeShow && this.options.beforeShow() === false)
return this;
this._mask && Dialog._mask.show();
this.el.style.display = "block";
this.dom.style.display = 'block';
this._isShown = true; } Dialog.prototype.hide = function(){
if(this.options.beforeHide && this.options.beforeHide() === false)
return this;
this._mask && Dialog._mask.hide();
this.el.style.display = "none";
this._isShown = false;
} Dialog.prototype.center = function(){
var bodyWidth = passport.page.getViewWidth();
var bodyHeight = passport.page.getViewHeight();
var left = (((bodyWidth - (this._width || this.el.offsetWidth)) / 2) | 0) + passport.page.getScrollLeft();
var top = (((bodyHeight - (this._height || this.el.offsetHeight)) / 2) | 0) + passport.page.getScrollTop();
this.setPosition({left: left,top: top });
} Dialog.prototype.init = function(){ this._createContainer() if(this._mask){
Dialog.renderMask()
} if(this._titleText){
this._createTitle()
} this._createBody(); this.show(); this._bind();
} Dialog.prototype._createContainer = function(){
this.el = Dialog._createElement(this._num + 'Container');
this.el.className = 'pass-dialog-container';
this.el.style.zIndex = this.zIndex || 1000;
if(this._width){
this.el.style.width = this._width + 'px';
}
if(this._height){
this.el.style.height = this._height + 'px';
} } Dialog.prototype._createTitle = function(){
var tit = Dialog._createElement(this._num + 'Title');
tit.className = 'pass-dialog-title';
var titleText = '<span class="pass-dialog-titText" id="'+this._num + 'titleText">'+this._titleText+'</span>'
tit.appendChild($(titleText).get(0))
this.el.appendChild(tit)
if(this._closeBtn){
var closeBtn = '<span class="pass-dialog-close" id="'+this._num + 'close">X</span>'
tit.appendChild($(closeBtn).get(0))
} } /*Dialog.prototype._createMask = function(){
//var height = Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
var mask = document.createElement('div'),
height = Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);
mask.id = 'PASSP__DIAMASK__'+this._num;
mask.className = 'pass-dialog-mask';
mask.style.height = height + 'px';
this.el.appendChild(mask)
//$('body').append(this.maskDom)
//this.maskDom.height(height);
}*/ Dialog.prototype._createBody = function(){
var body = Dialog._createElement(this._num + 'Body') body.appendChild(this.dom) this.el.appendChild(body) document.body.appendChild(this.el)
} Dialog.prototype.addEvent = function(el, event, handler){
el.on(event, handler);
this._eventMng.push({
el: el,
event: event,
handler: handler
});
}; Dialog.prototype._bind = function(){
var me = this;
me.action = {
'close' : function(evt){
me.hide();
evt.preventDefault()
}
}
me.addEvent($("#"+me._num + 'close'),'click',me.action['close'])
} Dialog.prototype.destroy = function(){
for(var i = 0 , j = this._eventMng.length; i < j; i++){
var e = this._eventMng[i];
e.el.off(e.event, e.handler);
}
$(el).remove()
}

  

dialog组件的更多相关文章

  1. Vue结合slot插槽分发父组件内容实现高度复用、更加灵活的dialog组件

    之前写过一篇关于vue实现dialog会话框组件的文章(http://www.cnblogs.com/fozero/p/8546883.html)[http://www.cnblogs.com/foz ...

  2. element-ui dialog组件添加可拖拽位置 可拖拽宽高

    edge浏览器下作的gifhttp://www.lanourteam.com/%E6... 有几个点需要注意一下 每个弹窗都要有唯一dom可操作 指令可以做到 拖拽时要添加可拖拽区块 header 由 ...

  3. element的Dialog组件踩坑

    在一个组件页面中需要有一个弹窗,为了代码简洁我把弹窗封装成一个组件方便重复调用 描述大致是一个父组件,里面有一个按钮还有一个子组件(弹窗),点击按钮让弹窗出来,弹窗自带的有关闭功能,点击关闭以后再点击 ...

  4. 移动端dialog组件

    移动端dialog组件 dialogView是满足移动端下,用户自定义的dialog组件,API可扩展性强,使用便捷.现版本是基于jquery库编写的,在使用之前需要引入jquery库或者Zepto库 ...

  5. 06 - Vue3 UI Framework - Dialog 组件

    做完按钮之后,我们应该了解了遮罩层的概念,接下来我们来做 Dialog 组件! 返回阅读列表点击 这里 需求分析 默认是不可见的,在用户触发某个动作后变为可见 自带白板卡片,分为上中下三个区域,分别放 ...

  6. element-ui Tag、Dialog组件源码分析整理笔记(五)

    Tag 标签组件 <script> export default { name: 'ElTag', props: { text: String, closable: Boolean, // ...

  7. 关于Vue的component制作dialog组件

    其实原理很简单,兴个粟子, 点击按钮出现 dialog 弹出杠, 将dialog做成一个组件,components/dialog.vue 就是在components里面新建一个vue.将这个vue做为 ...

  8. 封装element-ui的dialog组件

    封装组件: <template> <div class="dialog-container"> <el-dialog title="titl ...

  9. dialog组件的jquery封装实现

    (function($){ $.extend({ Dialog : function(id, options){ var option = $.extend({}, options); option. ...

随机推荐

  1. 为什么数据可以从pl/sql查出来而使用ado.net查询,结果却是空?

    1.背景 一条记录(如select * from A where a='1'),使用pl/sql作为条件可以查询出记录,但用ado.net sql查询结果却是空. 2.原因 a字段的数据类型的char ...

  2. POJ 2528 Mayor's posters (线段树,染色问题,离散化要注意)

    做这题建议看一下该题的discuss. #include <iostream> #include <stdio.h> #include <string.h> #in ...

  3. 关于DotNetBar中DataGridViewX 自动全屏 Anchor属性无效问题

    由于在DataGridViewX 中使用了控件DataGridViewCheckBoxXColumn会导致 Anchor属性无效问题化,具体原因未知,建议改换为系统自带的DataGridViewChe ...

  4. [YY题]HDOJ5288 OO’s Sequence

    题意:求这个式子 $\sum \limits_{i=1}^{n} \sum \limits_{j=1}^{m} f(i, j) mod (10^9 + 7)$ 的值 就是对每个区间[i, j]枚举区间 ...

  5. 6.5 THUSC 考试题解

    QAQ 由于并没有数据,而且没有A掉的是提交答案题目,所以并没有修改 QAQ 只能放题解了,代码还没有拿到,不过在清华听了一波习题讲评的安利 第一题 成绩单 先说暴力分 对于单调序列来说最优决策一定是 ...

  6. phpmyadmin导入大sql文件失败解决办法

    摘自:http://www.xunway.com/info/post/499.asp 昨天小编的一个客户在在利用phpmyadmin导入大sql文件的时候,总是提示错误,反应给小编,小编也是第一次遇到 ...

  7. Linux多线程编程和Linux 2.6下的NPTL

    Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构, ...

  8. Apache 下SVN项目管理使用说明

    Apache 下SVN项目管理使用说明 (1)Apaceh和SVN先要装好. (2)在apache的目录下找到httpd.conf文件,在最后一行增加如下配置 Include conf/svn.pro ...

  9. Haxe - Actuate.Tween

    方法解释: Actuate.tween( target : Dynamic , duration : Float , properties : Dynamic , ?overwrite : Bool ...

  10. jps

    jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上 ...