Javascript弹出对话框组件

简介:

              Javascript弹出对话框组件

    自从做前端以来 也快有一年了,也接触过很多javascript框架,比如Jquery YUI KISSY等等,但是有时候太依赖于框架并不好,要更多的学习原审javascript才会更能理解!因为IT很多大型公司都有自己内部封装的框架,所以对于我们前端人员来说 框架并不可靠 可靠的要深刻理解javascript!今天我分享的是弹出对话框组件,以前做页面时 做项目时 都是调用腾讯写好的弹出框组件,但是一直用它的也并不好!所以我用Jquery框架写了个弹出框来,然后借助于那个思想!简单的用javascript封装了下!为什么我会想的写组件呢 那是因为考虑到网站性能及高效的代码!因为如果你没有用组件的话 假如页面上有100个甚至更多弹出框 那你是不是要写更多的重复js代码,嘿嘿 好了 废话小说...  现在来谈谈我写的这个弹出框的一个思路吧!能兼容IE6 7 8 火狐 谷歌 搜狗 等等游览器!  

1.点击HTML元素时 弹出一个对话框 同时使页面的颜色变成半透明!                2.弹出对话框要居中对齐 并且当页面缩放时 也要居中对齐!

下面是HTML/css代码

 

 
 
 
 
 
 
  1. <script type="text/javascript"
  2. function getType(o){ 
  3.         var _t; 
  4.         return ((_t = typeof(o)) == "object" ? o==null && "null" || Object.prototype.toString.call(o).slice(8,-1):_t).toLowerCase(); 
  5.     } 
  6.     //获取元素样式 
  7. function getStyle(el, styleName) { 
  8.         return el.style[styleName] ? el.style[styleName] : el.currentStyle ? el.currentStyle[styleName] : window.getComputedStyle(el, null)[styleName]; 
  9.     } 
  10. function getStyleNum(el, styleName) { 
  11.         return parseInt(getStyle(el, styleName).replace(/px|pt|em/ig,'')); 
  12.     } 
  13. function setStyle(el, obj){ 
  14.     if (getType(obj) == "object") { 
  15.         for (s in obj) { 
  16.             var cssArrt = s.split("-"); 
  17.             for (var i = 1; i < cssArrt.length; i++) { 
  18.                 cssArrt[i] = cssArrt[i].replace(cssArrt[i].charAt(0), cssArrt[i].charAt(0).toUpperCase()); 
  19.             } 
  20.             var cssArrtnew = cssArrt.join(""); 
  21.             el.style[cssArrtnew] = obj[s]; 
  22.         } 
  23.     } 
  24.     else  
  25.         if (getType(obj) == "string") { 
  26.             el.style.cssText = obj; 
  27.         } 
  28. function getSize(el) { 
  29.     if (getStyle(el, "display") != "none") { 
  30.         return { width: el.offsetWidth || getStyleNum(el, "width"), height: el.offsetHeight || getStyleNum(el, "height") }; 
  31.     } 
  32.     var _addCss = { display: "", position: "absolute", visibility: 'hidden' }; 
  33.     var _oldCss = {}; 
  34.     for (i in _addCss) { 
  35.         _oldCss[i] = getStyle(el, i); 
  36.     } 
  37. setStyle(el, _addCss); 
  38.     var _width = el.clientWidth || getStyleNum(el, "width"); 
  39.     var _height = el.clientHeight || getStyleNum(el, "height"); 
  40.     for (i in _oldCss) { 
  41.         setStyle(el, _oldCss); 
  42.     } 
  43.     return { width: _width, height: _height }; 
  44.  
  45. function Sid(id){ 
  46.     return "string" ==typeof id ? document.getElementById(id) : id; 
  47. function WW(sID,hID,cID){ 
  48.     var ss = Sid(sID), 
  49.         hh = Sid(hID), 
  50.         cc = Sid(cID); 
  51.         (function(id){ 
  52.             ss.onclick = function(){ 
  53.                 showDialog(id); 
  54.                 hh.style.display = "block";          
  55.             } 
  56.         })(hh); 
  57.         cc.onclick = function(){ 
  58.             hh.style.display = "none"
  59.         } 
  60. var dialogId = ''
  61. function showDialog(hh){ 
  62.     dialogId = hh; 
  63.     var cw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, 
  64.         ch = window.innerHeight|| document.documentElement.clientHeight || document.body.clientHeight; 
  65.         var objC = Sid(hh); 
  66.      var objW = getSize(objC).width, 
  67.          objH = getSize(objC).height, 
  68.         scrollL = document.documentElement.scrollLeft || document.body.scrollLeft 
  69.         scrollT = document.documentElement.scrollTop || document.body.scrollTop; 
  70.         var left = (cw-objW)/2 + scrollL, 
  71.             top = (ch-objH)/2 + scrollT; 
  72.             objC.style.left = left+"px"
  73.             objC.style.top = top + "px";         
  74. window.onresize = function(){ 
  75.     showDialog(dialogId); 
  76. </script> 
 
 
  1. <script> 
  2.     new WW("buy_btn1","window1","closed1");  
  3.     new WW("buy_btn2","window2","closed2");  
  4. </script> 
  5. <!-- 很抱歉 不足90元 --> 
  6. <div id="window1"><div id="closed1"></div></div> 
  7. <!-- 很抱歉 每个买家只能参加五个活动 --> 
  8. <div id="window2"><div id="closed2"></div></div> 
  9. <!-- 很抱歉 当日道具码被另完了 --> 
  10. <div id="window3"><div id="closed3"></div></div> 
  11. <!-- 很抱歉 活动已经结束了 --> 
  12. <div id="window4"><div id="closed4"></div></div> 

点击aaaaa元素时就会弹出一个对话框 并且居中对齐 ,但是要注意几个问题:一开始时候我用display:none;把对话框隐藏了起来,大家都知道display:none 这样设置后,然后再js里面获取隐藏的对话框的宽度和高度时候根本就获取不到!因为diaplay:none后在页面上不占据任何的物理空间!所以当你用上面的js获取宽度和高度时候 会显示0;之后我想用HTML这个属性:visiblity:hidden;当调用js时获取宽度和高度之前用js让他显示出来!就可以获取隐藏后对话框的宽度和高度 因为他隐藏了但还是占据物理空间,然后就可以顺利的计算对话框居中的位置!!但是用visiblity:hidden可以完成居中这个方法 并且兼容IE6 IE8 火狐 谷歌等游览器 但是在IE7下有个小小的bug 就是我一打开页面 本来用visiblity:hidden 弹出框是隐藏的 但是在IE7下 他却能显现出来 但是当你一刷新后就没有啊 之后你再点击 关闭都是正常的!但是在打开页面渲染的时候 有个小小bug  所以用了上面一段js来获取隐藏后的对话框的宽度和高度就可以了!!调用方法:在页面上可以看得到!还要注意一个情况是:

document.documentElement.scrollLeft 这个方法和 document.documentElement.scrollTop在IE和火狐都显示正常, 但是在谷歌和360则显示不正常 所以要加上 document.body.scrollTop和document.body.scrollLeft!








本文转自 涂根华 51CTO博客,原文链接:http://blog.51cto.com/tugenhua/712602,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
JavaScript
Vue.js 修饰符:精准控制组件行为
Vue.js 修饰符:精准控制组件行为
|
5月前
|
JavaScript 前端开发 开发者
哇塞!Vue.js 与 Web Components 携手,掀起前端组件复用风暴,震撼你的开发世界!
【8月更文挑战第30天】这段内容介绍了Vue.js和Web Components在前端开发中的优势及二者结合的可能性。Vue.js提供高效简洁的组件化开发,单个组件包含模板、脚本和样式,方便构建复杂用户界面。Web Components作为新兴技术标准,利用自定义元素、Shadow DOM等技术创建封装性强的自定义HTML元素,实现跨框架复用。结合二者,不仅增强了Web Components的逻辑和交互功能,还实现了Vue.js组件在不同框架中的复用,提高了开发效率和可维护性。未来前端开发中,这种结合将大有可为。
193 0
|
3月前
|
JavaScript 前端开发 API
探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
【10月更文挑战第5天】探索Vue.js 3的组合式API:一种更灵活的组件状态管理方式
|
4月前
|
Web App开发 JavaScript 前端开发
用 JavaScript 创建 XPCOM 组件
用 JavaScript 创建 XPCOM 组件
|
5月前
|
JavaScript 前端开发
揭秘Vue.js组件魔法:如何轻松驾驭前端代码,让维护变得轻而易举?
【8月更文挑战第30天】本文探讨了如何利用Vue.js的组件化开发提升前端代码的可维护性。组件化开发将复杂页面拆分为独立、可复用的组件,提高开发效率和代码可维护性。Vue.js支持全局及局部组件注册,并提供了多种组件间通信方式如props、事件等。通过示例展示了组件定义、数据传递及复用组合的方法,强调了组件化开发在实际项目中的重要性。
51 1
|
5月前
|
JavaScript 前端开发 测试技术
[译]: Vue.js 函数式组件:what, why & when?
[译]: Vue.js 函数式组件:what, why & when?
[译]: Vue.js 函数式组件:what, why & when?
|
5月前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
198 0
|
5月前
|
JavaScript 开发者
揭秘Vue.js生命周期钩子:它们是如何掌控组件的生与死?
【8月更文挑战第30天】Vue.js 的生命周期钩子是开发者必须掌握的关键概念,它涵盖了组件从创建、挂载、更新到销毁的整个过程,提供了在特定时机操作DOM、获取数据或执行逻辑的能力。从 `beforeCreate` 到 `unmounted`,每个阶段都有特定的任务:如 `created` 适合异步数据获取,`mounted` 用于DOM操作,而 `beforeUnmount` 则用于清理资源。
41 0
|
6月前
|
JavaScript 前端开发 API
前端框架与库 - Vue.js 组件与路由
【7月更文挑战第15天】Vue.js 框架以简洁API和高效DOM更新著名,组件和路由是构建应用的关键。组件是自包含的实例,常见问题包括命名冲突、作用域混淆和状态管理。要避免这些问题,可使用命名空间、明确数据绑定和事件,以及采用Vuex管理状态。Vue Router提供声明式路由,常见挑战包括路由守卫、动态路由参数和懒加载配置。正确使用路由守卫、处理动态参数和实现代码分割能优化路由管理。提供的代码示例展示了基本组件和路由配置。
61 1
|
6月前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
222 2