网站首页 > 技术文章 正文
----------基于上次写的jquery插件进行改造
http://www.cnblogs.com/GerryOfZhong/p/5533773.html
背景:jQuery插件依赖jQuery库,虽然jQuery使用十分广泛,但是对于移动开发或者在其他带宽需求需要注意的时候,就得考虑,因为我不可能完成一项技术相对来说引用了一个更大的库,这样之不值得的。所以原生js是所有浏览器都支持的一种语言,原生js相对来说就very good了,但是原生js相对新手或者没有很强基础的人来说还是相对比较深奥晦涩一点的,毕竟要考虑一些额外的因素:
- 不能污染全局的变量,因为你不知道你的代码将会和其他库或者页面加载的广告代码进行冲突
- 一些高阶的设计模式,因为一些设计模式都是十分经典的思想的凝结,用语言实现也相对比较复杂
- 前端面向对象编程,因为js自由度比较高,没有和后台定义一样。比如模拟的接口,继承,封装等,来实现功能强大的架构或者需求
- ..........
设计模式:单体模式
好处:在使用单体模式的时候,你会享受到真正的私有成员带来的所有好处,而不必付出什么代价,因为单体泪只会被实例化一次单体模式之所以是javascript中最流行的、应用最广泛的模式之一
-
-
描述性命名增强代码的自我说明性
-
包裹单体中可以防止被其他人误改
-
与第三方库和广告隔离起来
-
后期进行优化,比如惰性加载
-
弊端:在使用单体模式的时候,必须要十分了解闭包等概念,而且以后结合其他设计模式共同使用的时候,复杂度和代码量相对来说要求更高,所以需要使用者自己进行衡量,值不值得使用,会不会增加项目开发难度等。如果值得就用,不值得就不建议使用
下面为闭包单体模式的骨架(用空专门讲设计模式和一些案例和使用):
var nameSpance= window.nameSpance|| {}; //声明一个空间 nameSpance.gerry=(function{ //这里可以存放私有属性和私有方法,不对外开放,防止其他开发者私自改动 var privateAttr = false; function privateMethod { console.log("这是私有方法,不对外开放..."); } //这里为抛出对象,供开发者使用的 var publicObject = { publicAttr : true, publicMethod : function{ console.log("这是抛出方法,供开发者使用...") } } return publicObject; })
原生代码设计:
- 声明空间然后搭建骨架
var gerry = window.gerry || {}; //声明 gerry.setBackgroundImage = (function{
var publicMethods = {};return publicMethods;
})
- 设置插件默认值(注明:该默认值不提供外部修改,不开放特权方法去set改变它的值)
var gerry = window.gerry || {}; //声明 gerry.setBackgroundImage = (function{ //私有参数设置(不对外开放) var config={ imgArr: , //图片数组 imgSecond: 1000, //图片淡出的时间 isRandom:false //是否为随机图片 } //暴露给开发者使用的方法,可随意拓展 var publicMethods = {}; return publicMethods ; })
- 封装一些tool,放在私有方法中,因为毕竟不是jQuery了,一些方法需要自己进行封装下
var tool = { //ID选择器 id_selector:function (selector){ return document.getElementById(selector); }, //创建节点 createElement:function(node){ return document.createElement(node); }, //设置节点属性 attr:function(setArrObject){ for(var i = 0,len=setArrObject.attribute.length;i<len;i++){ setArrObject.node.setAttribute(setArrObject.attribute[i].key,setArrObject.attribute[i].value); } } }
- 设置一些需要使用的样式,放到一个css对象中
//设置的样式 var css = { divT : 'position:absolute;left:0;top:0;z-index:-1;overflow:hidden;width:100%;height:100%', ImgT:'position:absolute;left:0;top:0;z-index:-2;opacity:0;', }
- 封装一些私有方法处理一些常用的方法,比如参数处理呀啥的
//私有方法,不对外开放 var privateMethods = { //对开发者的配置进行处理 paraHandling:function(option){ var configTemp ; if(option.config != undefined){ //开发者设置了值 option.config.imgArr== undefined ? option.config.imgArr =config.imgArr:null; option.config.imgSecond== undefined ? option.config.imgSecond = config.imgSecond:null; option.config.isRandom== undefined ? option.config.isRandom = config.isRandom:null; configTemp = option.config; }else{ configTemp = config; }; return configTemp; }, //针对IE9处理淡出效果,因为IE9不支持transition divFadeIn:function(option){ if(option.selector == undefined){ throw new Error("please select a id (div).") }else{ var showTime = Number(option.config.imgSecond); var opacityValue = 0; //设置opacity的属性值 var divSelector = tool.id_selector(option.selector); //获得div的ID var temp = setInterval(function{ opacityValue+=0.01; divSelector.style.opacity = opacityValue; if(opacityValue>1){ clearInterval(temp); } },showTime/100); //针对ie9 用opacity配合setInterval定时函数来实现淡出的效果,注意控制刷新的频率,给视觉上一种流畅的感觉 } }, //创建内容主题 createContent:function(option){ //设置ID var divImg = tool.createElement("div"); var object_div = { node:divImg, attribute:[ { key:"id", value:"divShow" }, { key:"style", value:css.divT } ] }; tool.attr(object_div); //设置img属性 var img = tool.createElement("img"); var object_div = { node:img, attribute:[ { key:"id", value:"imgShow" }, { key:"style", value:css.ImgT+"transition:opacity "+option.config.imgSecond/1000+"s ease", } ] }; tool.attr(object_div); divImg.appendChild(img); document.body.appendChild(divImg); privateMethods.delayLoadImg(option.config.imgArr[0]); }, //延迟加载图片 delayLoadImg:function(img_src){ var img = new Image; img.src = img_src; img.onload = function{ var temp = { node:tool.id_selector("imgShow"), attribute:[ { key:"src", value:img_src } ] }; tool.attr(temp); tool.id_selector("imgShow").style.opacity = 1; } } }
- 最后再抛出的供给开发者使用的init方法,里面检查一些参数和属性
//暴露给开发者使用的方法,可随意拓展 var publicMethods = { init:function(option){ if(arguments.length == 0){ //检查参数 throw new Error("this method need a config object"); }else{ if(document.body.style.opacity == undefined){ //检测是否支持opacity属性 [即IE9及以上] throw new Error("please use the browser of high version "); }else { option.config = privateMethods.paraHandling(option); option.selector = "divShow"; //如果是IE9的话 if (document.body.style.transition == undefined) { privateMethods.createContent(option); privateMethods.divFadeIn(option); } else { privateMethods.createContent(option); }; } } } }
- 测试代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> </body> </html> <script src="setBackgroundImage_js.js"></script> <script> +(function{ var temp ={ config:{ imgArr:["http://z.k1982.com/show_img/201303/2013033012383895.jpg"], imgSecond:3000 } } gerry.setBackgroundImage.init(temp); }) </script>
总结与说明:
因为IE8下面的滤镜比较麻烦,所以也没有对IE8做处理,就IE9+ 因为支持透明属性。移动端没做过测试,不过应该可以使用,因为针对移动端的话就更加简单了,因为现在移动端的趋势都是相对来说支持一些普遍的html5和css3的熟悉的。其实上面代码中主要讲的思想和对ie9做的兼容性,因为不可以使用第三方库了,所以就自己写了。整个代码我也不贴了,直接放到github上了,希望大家点颗星赞一个,得到人的赏识还是很有动力的。
github地址:
https://github.com/GerryIsWarrior/setBackgroundImage_js
猜你喜欢
- 2025-04-30 交通运输:传统物流介入保税模式中前端 荐3股
- 2025-04-30 华安基金管理有限公司 关于旗下所有前端收费模式基金 在直销柜台实施费率优惠的公告
- 2025-04-30 博时基金管理有限公司 关于旗下所有前端收费模式基金 在直销柜台实施费率优惠的公告
- 2025-04-30 Bun v0.8.0发布!支持SvelteKit、Nuxt、OpenAI模式!
- 2025-04-30 真香!阿里架构师大牛万字详解redis 哨兵模式
- 2025-04-30 AI与数字孪生结合,彻底改变工厂设备控制模式
- 2025-04-30 前端设计-单例模式在实战中的应用技巧
- 2025-04-30 「Web应用架构」模式:前端的后端(BFF)
- 2025-04-30 js设计模式:观察者模式,一个小例子帮忙理解一下。
- 2025-04-30 浅谈前端路由hash模式和history模式的区别
你 发表评论:
欢迎- 06-24发现一款开源宝藏级工作流低代码快速开发平台
- 06-24程序员危险了,这是一个 无代码平台+AI+code做项目的案例
- 06-24一款全新的工作流,低代码快速开发平台
- 06-24如何用好AI,改造自己的设计工作流?
- 06-24濮阳网站开发(濮阳网站建设)
- 06-24AI 如何重塑前端开发,我们该如何适应
- 06-24应届生靠这个Java简历模板拿下了5个offer
- 06-24服务端性能测试实战3-性能测试脚本开发
- 566℃Oracle分析函数之Lag和Lead()使用
- 565℃几个Oracle空值处理函数 oracle处理null值的函数
- 550℃Oracle数据库的单、多行函数 oracle执行多个sql语句
- 545℃0497-如何将Kerberos的CDH6.1从Oracle JDK 1.8迁移至OpenJDK 1.8
- 543℃Oracle 12c PDB迁移(一) oracle迁移到oceanbase
- 536℃【数据统计分析】详解Oracle分组函数之CUBE
- 526℃最佳实践 | 提效 47 倍,制造业生产 Oracle 迁移替换
- 519℃Oracle有哪些常见的函数? oracle中常用的函数
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端缓存 (63)
- 前端react (48)
- 前端aes加密 (58)
- 前端脚手架 (56)
- 前端md5加密 (54)
- 前端富文本编辑器 (47)
- 前端路由 (61)
- 前端数组 (73)
- 前端js面试题 (50)
- 前端定时器 (59)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle 中文 (51)
- oracle的函数 (57)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)