JAVASCRIPT基础09-购物车(02)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>购物车</title>
  <script type="text/javascript" src="js/jquery-1.9.1.js"></script>
  <script type="text/javascript">
        function Event(name) {
            var handlers = [];
            this.getName = function () {
                return name;
            };

            this.addHandler = function (handler) {
                handlers.push(handler);
            };

            this.removeHandler = function (handler) {
                for (var i = 0; i < handlers.length; i++) {
                    if (handlers[i] == handler) {
                        handlers.splice(i, 1);
                        break;
                    }
                }
            };

            this.fire = function (eventArgs) {  //执行事件的处理函数  可以是多个  (案例中都是一个处理函数)
                handlers.forEach(function (h) {
                 //   alert(h) ;
                    h(eventArgs);
                });
            };
        }

        function EventAggregator() {
            var events = [];
        //获取事件
            function getEvent(eventName) {
                return $.grep(events, function (event) {
                    return event.getName() === eventName;
                })[0];
            }
        //发布事件
            this.publish = function (eventName, eventArgs) {
                var event = getEvent(eventName);

                if (!event) {
                    event = new Event(eventName);
                    events.push(event);
                }
                event.fire(eventArgs);
            };
        //订阅事件
            this.subscribe = function (eventName, handler) {
                var event = getEvent(eventName);

                if (!event) {
                    event = new Event(eventName);
                    events.push(event);
                }

                event.addHandler(handler);

            };
        }

        function Product(id, description) {
            this.getId = function () {
                return id;
            };
            this.getDescription = function () {
                return description;
            };
        }

        function Cart(eventAggregator) {
            var items = [];

            this.addItem = function (item) {
                items.push(item);
                eventAggregator.publish("itemAdded", item);
            };
        }
           /**
         * 购物车控制器
         */
        function CartController(cart, eventAggregator) {
            //往事件数据event[]添加了一个itemAdded的事件 事件对应的处理为下面的function
            eventAggregator.subscribe("itemAdded", function (eventArgs) {
                var newItem = $(‘<li></li>‘).html(eventArgs.getDescription()).attr(‘id-cart‘, eventArgs.getId()).appendTo("#cart");
            });
            //添加一个 productSelected 事件   事件处理为往购物车中增加一个product
            eventAggregator.subscribe("productSelected", function (eventArgs) {
                cart.addItem(eventArgs.product);
            });
        }

        function ProductRepository() {
            var products = [new Product(1, "Star Wars Lego Ship"),
            new Product(2, "Barbie Doll"),
            new Product(3, "Remote Control Airplane")];

            this.getProducts = function () {
                return products;
            }
        }

        function ProductController(eventAggregator, productRepository) {
            var products = productRepository.getProducts();

            function onProductSelected() {
                var productId = $(this).attr(‘id‘);
                var product = $.grep(products, function (x) {
                    return x.getId() == productId;
                })[0];
                eventAggregator.publish("productSelected", {
                    product: product
                });
            }
            /**
             * 获取到所有的产品以后 添加到products的div中 同时为每个product提供一个双击事件 事件名称为 onProductSelected
             * onProductSelected的作用为 调用 事件聚合器中的  publish 方法  该方法会去调用 事件对应的handler 即  cart.addItem(eventArgs.product);
             */

            products.forEach(function (product) {
                var newItem = $(‘<li></li>‘).html(product.getDescription())
                                    .attr(‘id‘, product.getId())
                                    .dblclick(onProductSelected)
                                    .appendTo("#products");
            });
        }

        function init(){
                var eventAggregator = new EventAggregator(), //创建事件聚合器
                cart = new Cart(eventAggregator),  //创建购物车
                cartController = new CartController(cart, eventAggregator),  //此时已经有两个事件了 

                productRepository = new ProductRepository(),  //获取products
                productController = new ProductController(eventAggregator, productRepository);
        }

  </script>

</head>

<body onload="init();">

  <h2>购物车JS</h2><hr style="margin:0 auto;width:600px;">

    产品:<div id="products"></div>
    <br>
    我的购物车:<div id="cart"></div>
</body>
</html>

JAVASCRIPT基础09-购物车(02),布布扣,bubuko.com

时间: 2024-10-06 11:50:42

JAVASCRIPT基础09-购物车(02)的相关文章

JavaScript基础09——事件驱动

1.事件驱动 js控制页面的行为是由事件驱动的. 什么是事件?(怎么发生的) 事件就是js侦测到用户的操作或是页面上的一些行为 事件源(发生在谁身上) 引发事件的元素 事件处理程序(发生了什么事) 对事件处理的程序或函数 事件对象(用来记录发生事件时的相关信息) 只有在事件发生的时候,才会产生事件对象,无法手动创建,并且事件对象只能在处理函数内部访问,处理函数允许结束后该对象自动销毁 2. 事件的分类: 鼠标事件: onclick        单击 ondblclick     双击 onmo

JavaScript基础学习心得02

写一个js效果的步骤: 先实现布局: 了解动画实现的原理: 了解js语法: js如何获取元素? document.getElementById('link') 事件 鼠标事件: onclick onmouseover onmouseout onmousemove //鼠标的抚摸事件 onmousedown onmouseup 键盘事件: 系统事件: onload //加载完了html代码后再执行script脚本 表单事件: 自定义事件:原生没有,我们得自己做. 如何添加事件? 就像酱紫:元素.o

Javascript.01 -- Javascript基础

Javascript基础 1 聊聊Javascript 1.1 Javascript的历史来源 94年网景公司   研发出世界上第一款浏览器. 95年 sun公司   java语言诞生 网景公司和sun合作. Java+script   ===> javascript 1.2 W3c规范 ?结构标准        html ?表现标准   css ?行为标准      js 1.3 JavaScript和ECMAScript的关系 ECMAScript是一种由Ecma国际前身为欧洲计算机制造商协

Javascript基础篇小结

Javascript基础篇小结 字数9973 阅读3975 评论7 喜欢28 转载请声明出处 博客原文 随手翻阅以前的学习笔记,顺便整理一下放在这里,方便自己复习,也希望你有也有帮助吧 第一课时 入门基础 知识点: 操作系统就是个应用程序 只要是应用程序都要占用物理内存 浏览器本身也是一个应用程序 浏览器本身只懂得解析HTML 调用浏览器这个应用程序的一个功能绘制 1.javascript介绍 JavaScript操作DOM的本质是=获取+触发+改变 目的:就是用来操作内存中的DOM节点 修改D

JavaScript基础--内部类(九)

js的内部类javascript 中本身提供一些,可以直接使用的类,这种类就是内部类,主要有:ObjectArrayMathBooleanStringRegExpDateNumber 1.内部类分类从使用的方式看:分为动态类和静态类(1) 动态类 使用 var对象 = new 动态类() 对象属性|方法 var newdate = new Date(); //显示当前日期 window.alert(newdate.toLocaleString()); (2) 静态类 使用 类名.属性|方法比如:

javascript小白学习指南0---2

好啦 好啦 ,美女看够了,我们开始继续上一次讲的内容把(上一节的内容) 控制语句: 首先我先给大家总结一下在javascript中一共有 9 种控制语句它们分别是 if 语句 do-while 语句 while 语句 for 语句 for-in 语句 label 语句 break 和 continue 语句 with 语句 switch 语句 下面来分别为这几个控制语句举个例子 var i=10; if(i>15) { alert("i>15") } else if(i&l

JAVASCRIPT基础08-购物车(01)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti

前端之JavaScript基础

前端之JavaScript基础 本节内容 JS概述 JS基础语法 JS循环控制 ECMA对象 BOM对象 DOM对象 1. JS概述 1.1. javascript历史 1992年Nombas开发出C-minus-minus(C-)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本

史上最全、JavaScript基础篇

索宁 Hot summer nights mid July, when you and  I were forever wild. 首页 新随笔 联系 管理 随笔 - 12  文章 - 5  评论 - 19 史上最全.JavaScript基础篇 本章内容: 简介 定义 注释 引入文件 变量 运算符 算术运算符 比较运算符 逻辑运算符 数据类型 数字 字符串 布尔类型 数组 Math 语句 条件语句(if.switch) 循环语句(for.for in.while.do-while) label语