同上一篇开发air小技巧一起, 我想写一篇开发website的小技巧

其实对于as3来说, website开发既简单, 又复杂. 你可以用最简单的方式来处理, 也可以像我一样写个简单的小架构, 当然调试和发布也是要分开的

简单方式就是loadmovie

很多ui设计师不会复杂的程序, 于是就产生了简单的laodmovie, 你不用去想如何去卸载, 什么时候加载完毕

设计师想卸载完全可以在这个容器基础上加载个空影片

简单的架构:

我习惯于给网站或者应用写个简单的架构

它需要如下特点:

1.耦合性不高

2.层次分明

3.开发快速

对于第一点有几方面要说, 先从event事件开始, 首先, 你不可能保证你互相传递信息的对象都是在彼此冒泡级序列上, 也不可能保证直接去调对象去完成事件侦听或者直接对对象进行处理, 因为这样耦合性很低, 网站或程序开发动向改变会直接影响到大部分代码的修改以及各种问题

这里我根据xcode和cocos2d结构写了个NotificationCenter通知类, 这个类很简单, 就是一个单例, 并控制事件的集合任何运行周期, nc类都是只存在一个对象, 所以十分安全, 即便局部开发也不影响, 而且即便是更改结构, 也不影响nc传递, 顶多没有对象发事件或者没有对象接收事件而已

在同一个ide内的不同元素, 通过nc事件将他们分割开, 每个按钮或者面板都是独立的内容, 且继承movieclip类, 这样也十分灵活, 美工删除或者添加都不会造成问题, 而这是之前as2时代所具有的特色

一般我会用到fd开发网站或者应用, 主要是因为编译速度快, 轻量级, 提示方便

而整个网站如果全部用fd开发, 那太庞大了, 我一般这样的结构

loader  ---  fd开发

其他swf  ---  ide开发

fd很方便的可以直接调用ide编译(f6), 自编译(f5), 这样就能分别处理不同的fla文档

fd中将会包含只针对fla的代码和只针对fd的代码, 因为ide直接输出swf, 所以需要部分fd代码参与, 其中nc就是重中之重

而开发ide代码只需要在绑定对象的类中直接声明public var对象元素就可以方便在fd中编译, 而且不会报错

同时强调如果是通过ide输出结构(位置界面等信息)的swc, 则可能只能得到简单的对象结构, 而不含开发代码

层次分明

用loader对分层加载进行管理

一般层次划分是这样的:

警告提示层 --- 1

弹出框  2

菜单/logo层 3

二级内容 4

一级内容 5

背景层 6

其中 4,5,6可以使一个层

结构是这样, 因为其他层都很简单, k数也小, 基本不做loading显示

一般只对主层进行加载loading展示

所谓开发简单,速度快,不仅是前期, 后期也是一样, 很多情况下你需要和美工一起来解决问题, 而客户的所有问题又不针对技术, 这样会导致效率低下, 美工改一次你就要改一次, 而如果不需要动loading来讲的话, 美工可以自行生成fla, 不需要技术再进行修改, 这样也降低了耦合性

网站改版或者修改十分频繁, 所以以这样一个思路来制作, 是十分有必要的

下面贴出来nc的类, 希望大家可以借鉴, 其实还有很多敲门, 比如AutoCount这样的静态类, 别看只是自加, 但是可以实现类似c++中枚举的效果, 十分方便

package Zszen.Nothing.core.notify {import flash.utils.Dictionary;/*** ...* @author Zszen John*/public class NotificationCenter {private static var _instance:NotificationCenter;private static var _suffix_prepare:String="_suffix_prepare"private static var _suffix_after:String="_suffix_after"public static var isDebug:Boolean = true;private var pool:Dictionary = new Dictionary();public static function defaultCenter():NotificationCenter {if (_instance == null) {if(isDebug)trace("[notify center]:inited")_instance = new NotificationCenter(new Single)}return _instance;}public static function Notify_Prepare(name:String):String {return name+_suffix_prepare}public static function Notify_After(name:String):String {return name+_suffix_after}public function NotificationCenter(single:Single) {}/public function postNotification(name:String, object:Object, userInfo:Object = null):void {if (pool[name]==null) {trace("[notify center]:rejected " + name)return;}var poolSub:Dictionary;var key:Object;var notify:Notification;//preparepoolSub = pool[name + _suffix_prepare];if (poolSub != null) {if(isDebug)trace("[notify center]:posted "+name+_suffix_prepare)for (key in poolSub) {notify = Notification(key)notify.objectPoster = objectnotify.userInfo = userInfo;notify.runAndClearPoster();}}//doingpoolSub = pool[name];if(isDebug)trace("[notify center]:posted "+name)for (key in poolSub) {notify = Notification(key)notify.objectPoster = objectnotify.userInfo = userInfo;notify.runAndClearPoster();}//afterpoolSub = pool[name + _suffix_after];if (poolSub!=null) {if(isDebug)trace("[notify center]:posted "+name+_suffix_after)for (key in poolSub) {notify = Notification(key)notify.objectPoster = objectnotify.userInfo = userInfo;notify.runAndClearPoster();}}}public function addObserverPrepare(name:String, object:Object, selector:Function):void {addObserver(name + _suffix_prepare, object, selector);}public function addObserverAfter(name:String, object:Object, selector:Function):void {addObserver(name + _suffix_after, object, selector);}public function addObserver(name:String, object:Object, selector:Function):void {if (hasSameObserver(name, object)) {if(isDebug)trace("[notify center]:addObserver same ",name,object)return;}if (pool[name]==null) {pool[name]=new Dictionary()}if (selector.length!=1) {throw "[notify center]:addObserver selector arguments length must be one and Notification Class"}var notify:Notification = new Notification(name, object, selector);pool[name][notify] = true;}private function hasSameObserver(name:String, object:Object):Boolean {var selector:Function = nullvar poolSub:Dictionary = pool[name];for (var key:Object in poolSub) {var notify:Notification = Notification(key)if (notify.object == object) {if (selector != null) {if (notify.selector == selector) {return true;break;}}else {return true;break;}}}return false;}public function hasObserver(object:Object):Boolean {if(isDebug)trace("[notify center]:check "+object)outloop:for (var name:String in pool) {var poolSub:Dictionary = pool[name];for (var key:Object in poolSub) {var notify:Notification = Notification(key)if (notify.object == object) {return true;}}}return false;}private function removeObserverWithSelector(object:Object, selector:Function = null):void {outloop:for (var name:String in pool) {var poolSub:Dictionary = pool[name];for (var key:Object in poolSub) {var notify:Notification = Notification(key)if (notify.object == object) {if (selector!=null) {if (notify.selector==selector) {trace("[notify center]:remove "+object)notify.clear()poolSub[notify] = null;delete poolSub[notify];break outloop;}}else {trace("[notify center]:remove "+object)notify.clear()poolSub[notify] = null;delete poolSub[notify];break outloop;}}}}}public function removeObserver(object:Object):void {removeObserverWithSelector(object,null)}public function removeAllObserver():void {if(isDebug)trace("[notify center]:remove all")for (var name:String in pool) {var poolSub:Dictionary = pool[name];for (var key:Object in poolSub) {var notify:Notification = Notification(key)notify.clear()poolSub[notify] = null;delete poolSub[notify];}pool[name] = null;delete pool[name];}}public function toString():String {var arr:Array = [];for (var name:String in pool) {var poolSub:Dictionary = pool[name];for (var key:Object in poolSub) {var notify:Notification = Notification(key)arr.push(notify)}}return arr.join("\n");}}}
class Single{}

使用方法也很简单:

发出通知: (notifyinfo只是一个自定义的静态字符串集而已, 第二个参数传递发送事件的对象, 也就是自身, 也可以是其他对象, 第三个参数是发送的参数, obj发送十分方便

NotificationCenter.defaultCenter().postNotification(NotifyInfo.XML_LOAD_COM,this,{data:data,path:xl.url})

接收通知:(结构类似, 第二个参数是接收对象, 第三个是接收的方法)

NotificationCenter.defaultCenter().addObserver(NotifyInfo.XML_LOAD_COM, this, onN)

处理通知: (这里会接收到nc的原子类 notification, 他存储着接收者, 通知名称, 发送者, 发送参数, 如果需要做复杂处理, 可以判断接受者和发送者)

private function onN(n:Notification):void {switch (n.name) {case NotifyInfo.<span style="font-family: Arial, Helvetica, sans-serif;">XML_LOAD_COM</span><span style="font-family: Arial, Helvetica, sans-serif;">:</span>
<span style="white-space:pre">      </span>//deal<span style="white-space:pre">  </span>break;
<span style="white-space:pre">  </span>}
}

整体这样用了很久, 稳定性肯定是没有问题的, 如果存在什么隐含问题, 请热心给我留言

fd开发website小技巧相关推荐

  1. delphi开发的小技巧----------------http://www.cto360.com/a/5000086716.shtml

    delphi开发的小技巧----------------http://www.cto360.com/a/5000086716.shtml http://www.cto360.com/a/5000086 ...

  2. 日常开发CSS小技巧整理

    日常开发CSS小技巧整理 1.解决inline-block元素设置overflow:hidden属性导致相邻行内元素向下偏移 .wrap {display: inline-block;overflow ...

  3. [译]15个关于Chrome的开发必备小技巧

    谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...

  4. Android开发的小技巧总结

    1.Ecplise中函数调用先后观看方法 a.在函数体内增加System.out.println("sdfds"); b.运行程序,在DDMS界面下,选择输出LogCat小界面(图 ...

  5. 提升嵌入式开发效率小技巧——开发环境配置

    起因:发现自己在嵌入式开发是,主机.虚拟机.开发板相互不能ping通,代码文件拖来拖去,利用cutftp,拖文件还得改目录,开发效率极低,加上bug找不到,代码写不出,使心情更加烦躁,进而磨灭自己的热 ...

  6. 谷歌浏览器开发调试小技巧

    1.在控制台获取上次操作返回的值 在控制台可以通过 $_ 获取上次执行返回的值,通过这个方法调试代码会方便很多 2.在控制台打印当前选中的dom元素 鼠标点中需要打印的dom元素,在控制台输入 $0  ...

  7. Android 开发实用小技巧

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/75647437 本文出自[赵彦军的博客] Android Studio 实用插件传送 ...

  8. ORACLE EBS FORM 二次开发常用小技巧

    1.锁住当前行 Set_Item_Instance_Property('main.import_flag', CURRENT_RECORD, UPDATE_ALLOWED, PROPERTY_OFF) ...

  9. Android开发实用小技巧九——内嵌WebView的使用(内置浏览器)

    文章目录 前言 一.效果展示 二.代码 1.样式布局 2.活动页面 总结 前言 内嵌WebView的使用(内置浏览器). 一.效果展示 二.代码 1.样式布局 res/layout/activity_ ...

  10. react vue开发赋值小技巧-短路

    当我们在回显数据的时候,后端返回的值可能是null undefined 或者"(js 6个为false 的值):这时采用下面的写法,巧妙用短路逻辑, 让代码看起来更简洁. 含义为:如果有值 ...

最新文章

  1. 设计稿生成代码与 Serverless 的前世今生与未来!
  2. 算法题题目集合一,欢迎评论留言
  3. intellij导入文件夹后各种红色cannot resolve symbol
  4. 锡安赞歌 mp3下载
  5. C++基础11-类和对象之操作符重载1
  6. 第十一节:JavaScript有了一种全新的数据类型:Symbol
  7. Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
  8. 如何合理地建立 Mysql 索引
  9. IIS配置文件上传大小限制
  10. windows下7z文件解压
  11. 周记---学会推迟满足感 享受长远的趣味
  12. 当英文遇上汉语 就知道汉语有多强大了
  13. 用8266学习单片机-13-HC-SR04超声波模块测距示例-Ultrasonic-US-015
  14. 三相有功无功电流检测方法
  15. 【JS】1067- 一个神奇的交叉观察 API Intersection Observer
  16. 女人拉屎故事_一个敏锐的女性下午的故事
  17. VC中调用cmd命令的四种方式
  18. Python爬虫项目整理
  19. Java Web 开发实战经典 基础篇(1)
  20. 基于模型的设计及其嵌入式实现(无水印).pdf_DeepMind打造最强表示学习模型BigBiGAN,Goodfellow点赞!...

热门文章

  1. html爱心特效代码教程
  2. Maximum Clique最大团问题
  3. c语言点阵输出字母,单片机C语言程序设计:8X8LED 点阵显示数字
  4. 【FXCG】多头陷阱知多少
  5. WPS参考文献编号及超链接
  6. html bottom没有效果,css 设置margin-top或margin-bottom失效不取作用的解决方法
  7. Istio 南北向流量管理
  8. wav 文件头 删除_Yate for mac(音频文件标记和管理工具)
  9. mac brew 启动服务时报错“Bootstrap failed: 5: Input/output error”
  10. 计算机无法连上网怎么办,电脑显示已连接上但是无法上网怎么办