JS工厂模式开发实践案例分析

本文实例讲述了JS工厂模式开发。分享给大家供大家参考,具体如下:

基于JS工厂模式的H5应用,实现了轮播图功能与滑屏功能,并且实现了文字大小的自适应功能,基于SASS样式开发。

核心的JS代码如下:

index.js

define(function(){
 var self = null,
 start = null,
 move = null,
 end = null,
 handle = null,
 timer = null,
 left = 0,
 x = 0,
 startX = 0,
 baseWidth = window.screen.width, // 移动设备屏幕的宽度
 baseSize = baseWidth * 0.2,   // 滑动切换阈值
 banner = document.getElementById("banner"), // 获取Banner
 center = document.getElementById("center"), // 获取center
 ulList = document.getElementsByTagName("ul"),
 incBanner = document.getElementById('incBanner'),
 incCenter = document.getElementById('incCenter');
 var app = {
  init : function(){
   self = this;
   start = self.touchStart;
   move = self.touchMove;
   end = self.touchEnd;
   handle = self.addHandler;
   self.pageInit();
   self.bindTouch(banner, start, move, end);
   self.bindTouch(center, start, move, end);
   self.shiftBanner(banner);
  },
  pageInit : function(){
   for (var i=0; i < ulList.length; i++) {
    ulList[i].style.left = 0 + 'px';
    ulList[i].style.width = 3 * baseWidth + 'px';
   }
  },
  bindTouch : function(elem, handler1, handler2, handler3){
   handle(elem, "touchstart", handler1);
   handle(elem, "touchmove", handler2);
   handle(elem, "touchend", handler3);
  },
  touchStart : function(event){
   var touch = event.touches[0];
   left = parseInt(this.style.left);
   x = 0;
   startX = 0;
   startX = touch.pageX;  //刚触摸时的坐标
   if(this == banner){
    timer = clearInterval(timer);
   }
  },
  touchMove : function(event){ //滑动过程
   var touch = event.touches[0];
   x = startX - touch.pageX;  //滑动的距离
   this.style.left = left - x + 'px';
  },
  touchEnd : function(event){    //手指离开屏幕
   self.move(this);
   self.moveAdjust(this);
   self.indicate(this);
   if(this == banner){
    self.shiftBanner(banner);
   }
  },
  move : function(elem){
   var leftTmp = left;   //缓存touchMove结束时的滑动位置
   elem.style.left = left;
   if (x > baseSize) {
    elem.style.left = left - baseWidth + 'px';
   } else if (x < -baseSize) {
    elem.style.left = left + baseWidth + 'px';
   } else {
    elem.style.left = leftTmp + 'px';
   }
  },
  moveAdjust : function(elem){
   left = parseInt(elem.style.left)
   if (left < -baseWidth * 2) {
    left = -baseWidth * 2;
    elem.style.left = left + 'px';
   }
   if (left > 0) {
    left = 0;
    elem.style.left = left + 'px';
   }
   x = 0;
  },
  indicate : function(elem){
   if (elem == banner) {
    self.activeClass(incBanner);
   }else if (elem == center) {
    self.activeClass(incCenter);
   }
  },
  activeClass : function(elem){
   var len = elem.children.length;
   for (var i = 0; i < len; i++) {
     elem.children[i].className=" ";
    }
   if (left == 0) {
    elem.children[0].className = "active";
   } else if (left == (-baseWidth)) {
    elem.children[1].className = "active";
   }else if (left == (-2*baseWidth)) {
    elem.children[2].className = "active";
   }
  },
  shiftBanner : function(elem){
   var t = new Date();
   var tmpLeft = parseInt(elem.style.left);
   timer = setInterval(function(){
    if ((tmpLeft == 0) || (tmpLeft == -baseWidth)) {
     elem.style.left = tmpLeft - baseWidth + 'px';
    } else if (tmpLeft == -2*baseWidth) {
     elem.style.left = 0 + 'px';
    }
    tmpLeft = parseInt(elem.style.left);
    left = tmpLeft;
    // console.log(elem.style.left);
    // console.log(t);
    self.indicate(banner);
   },4000);
  },
  addHandler : function(element, type, handler){
   if (element.addEventListener) {
    element.addEventListener(type, handler, true);
   } else if (element.attachEvent) {
    element.attachEvent("on" + type, handler);
   } else {
    element["on" + type] = handler;
   }
  }
 };
 return {
  init : function(){
   app.init();
  }
 };
});
 

可以在浏览器中打开: https://iove1123.github.io/policy

项目源码见GitHub:https://github.com/iove1123/policy

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

(0)

相关推荐

  • javascript抽象工厂模式详细说明

    抽象工厂模式说明 1. 工厂方法模式的问题: 在工厂方法模式里,创建类都需要通过 工厂类,如果要扩展程序,就必须修改工厂类,这违背了闭包原则,对扩展开放,对修改关闭:对于设计有一定的问题.   2. 如何解决:就要用到抽象工厂模式,就是对功能类单独创建工厂类,这样就不必修改之前的代码,又扩展了功能.   3. 工厂模式其实就是对 实现同一接口的 实现类 的 统一 工厂方式创建调用,但 javascript 没有接口这号东西,所以就去掉这一层 实现,但位功能类的成员及方法都应当一样; 抽象工厂源码

  • js正则表达式中的单行模式与多行模式实例分析

    本文实例分析了js正则表达式中的单行模式与多行模式.分享给大家供大家参考.具体如下: js正则表达式是不支持单行模式的.也就是说,不能把某段内容(有换行),采用模式修正符来处理,使整段内容当成一行来处理. 正则多行替换,需要添加/mg模式增强符. <html> <head> <script type="text/javascript"> //正则替换链接,链接有换行 function t1(){ var con = document.getEleme

  • JavaScript设计模式之工厂模式和构造器模式

    什么是模式 前阵子准备期末考试,劳神又伤身的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式. 首先呢,我们需要知道的是:模式是一种可复用的解决方案,而反模式呢就是针对某个问题的不良解决方案. js反模式常见例子 1.向setTimeout和setInterval传递字符串,而不是函数,这会触发eval()的内部使用. 2.在全局上下文中定义大量的变量污染全局命名空间 3.修改Object类的原型 4.以内联形式使用js,嵌入在HTML文件中的js代码是无法包含在外部单元

  • js简单工厂模式用法实例

    本文实例讲述了js简单工厂模式用法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html> <html> <head> <title>简单工厂模式</title> </head> <body> <script> //简单工厂模式 var BicycleShop = function(){}; BicycleShop.prototype ={ sellBicycle : function(mod

  • 浅析JS抽象工厂模式

    以下就是作者学习中遇到的问题以及代码实例,最后还给大家关于JS抽象工厂模式的学习做了总结. 抽象工厂模式(Abstract Factory)就是通过类的抽象使得业务适用于一个产品类簇的创建,而不负责某一类产品的实例. JS中是没有直接的抽象类的,abstract是个保留字,但是还没有实现,因此我们需要在类的方法中抛出错误来模拟抽象类,如果继承的子类中没有覆写该方法而调用,就会抛出错误. const Car = function() { } Car.prototype.getPrice = fun

  • JavaWeb实现用户登录注册功能实例代码(基于Servlet+JSP+JavaBean模式)

    下面通过通过图文并茂的方式给大家介绍JavaWeb实现用户登录注册功能实例代码,一起看看吧. 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JS

  • Javascript设计模式理论与编程实战之简单工厂模式

    阅读目录 基本介绍 举例说明 总结说明 简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料机,要咖啡还是牛奶取决于你按哪个按钮. 简单工厂模式在创建ajax对象的时候也非常有用. 通常我们创建对象最常规的方法就是使用new关键字调用构造函数,这会导致对象之间的依赖性.工厂模式是一种有助于消除类之间依赖性的设计模式,它使用一个方法来决定要实例化哪一个

  • js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)

    在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法.这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧. 前言 虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码.因此为了解决这个问题,人们开始使用以下几种方式来常见对象. 工厂模式 该模

  • JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

    什么是面向对象?面向对象是一种思想!(废话). 面向对象可以把程序中的关键模块都视为对象,而模块拥有属性及方法.这样我们如果把一些属性及方法封装起来,日后使用将非常方便,也可以避免繁琐重复的工作.接下来将为大家讲解在JS中面向对象的实现.   工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,而由于在ECMAScript中无法创建类,因此用函数封装以特定接口创建对象.其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可. function createBlo

  • JavaScript 模式之工厂模式(Factory)应用介绍

    工厂模式也是对象创建模式之一,它通常在类或类的静态方法中去实现.构造对象的一种方式是使用new操作符,但使用new时正是针对实现编程,会造成"耦合"问题,与具体的类关系紧密.导致代码更脆弱,缺乏弹性,在复杂逻辑的项目中建议是面向接口编程. 先看简单工厂模式 复制代码 代码如下: Person(name, age) { var obj = {} obj.name = name obj.age = age return obj } var p1 = Person('jack', 25) v

  • javascript 模式设计之工厂模式学习心得

    模式类型:工厂模式 模式说明:常用模式之一,用来动态创建对象 适用范围:在运行期间需要在一系列可互换的子类中进行选择的类 注意事项:接口的实现,从而使不同子类可以被同等的对待,恰当的使用工厂模式,但不要拘泥与形式,理解本质. 关键点:以 函数/类/子类 构建的选择器 本质:函数作为选择器的使用 一般使用形式: 作为独立的选择器存在: 复制代码 代码如下: function FactoryMode(index){ switch(index){ case "index1" : return

随机推荐