我的前端架构之一--页面作用域

场景

现在页面的内容大都是分块的,常见的如下结构:

<html>
<head></head>
<body>
    <header>
    </header>
    <main>
        <left>
        </left>
        <content>
        </content>
        <right>
        </right>
        <footer>
        </footer>
    </main>
</body>
</html>

其中 left ,right,content,footer 是使用(或部分使用)异步加载的方式来加载远程页面的。

如果left是菜单, content是一个带有选项卡的多页面结构,很多情况下,content下的每个页面需要一个 iframe 来隔离每个页面,避免 A 页面 和 B 页面控件ID和 Js 方法名重复。

加载iframe 1会造成一些性能的浪费,2会增加客户端浏览器的压力,因为Dom结构很庞大,3给各个选项卡页面通信、页面间带来麻烦。

我需要解决的就是不使用 iframe 而加载很多页面,又不会产生冲突。

解决方案

给Dom元素添加作用域,作用域可以看作是页面的Dom大容器,它也是一棵树,根节点是 html。作用域结构是下面的结构:

html
    left
    content
    right
    footer

jv.page(dom) 方法返回 dom元素所在的作用域。为了简化操作,可以在 click 等带有event,可以找到事件触发源的方法里,使用 jv.page() 得到当前作用域。

$(selector, jv.page(dom)) 方法对DOM元素进行选择。

每个页面中定义的方法

普通方法我们这样定义:

function test(){}

这种定义方法是公开到 window 下的。类似于:

window.test = function(){}

如果A页面和B页面都使用同一个 test 方法,则 B页面的 test 方法会覆盖 A页面的 test方法。

我们要改造的效果是:把方法定义到各个作用域上去。

新的定义方法:

this.test = function(){}

this 不是常量,它不一定是 window,它表示该Dom容器做为作用域的 MyPageObject 对象,它和作用域DOM容器是一一对应的,但不是作用域DOM容器。它同样是一棵树。这棵树的根是 window ,子数据在 window.SubPages 中存储

我们在加载远程异步加载页面的时候,需要手动指定 this 对象 。核心代码:

$.extend.LoadView = function (p) {
    //清空当前节点的内容。
    //Ajax获取远程内容。在回调中处理HTML
    //1. 使用过滤器过滤出要显示的部分。
    //2. 把 Js 分为两部分: 最先执行的JS,和 最后执行的JS ,中间填充 DOM对象(包含Css)
    //3. 运行最先执行的JS,(如果 script 标签有 data-init 属性,则认为它是需要最先加载执行的JS ) 使用 call 或 apply 改变 Js 的 this当前上下文。
    //4. 填充DOM
    //5. 运行最后执行的JS,使用 call 或 apply 改变 Js 的 this 当前上下文。
}

这样定义的页面,这个页面可以独立运行,也可以被LoadView多次加载运行。

在页面中使用定义的方法

如果在页面上使用 this.test = function(){} 定义了方法,如何使用呢。如下:

<script>
    this.test = function(){
        var doer = jv.getDoer();
        alert(doer.innerHTML);    //显示确定
    }
</script>
<body>
    <button onclick="jv.me(event).test(event)">确定</button>
</body>

其中 jv.me(event) 方法找出 作用域的 MyPageObject 对象,即方法中定义的 this 对象。 传入 event 对于浏览器兼容性来说,是有必要的。

jv.getDoer(event) 方法会递归查找方法参数中的 event 对象,找出触发事件的源。所以在调用方法时,参数最后要传递 event

自定义页面的生命周期

作用域的 MyPageObject 对象 简称 me 对象,因为它是通过 jv.me() 得到的。

每个页面的最后,都会调用一个Js方法:jv.myOnInit(); 来实现页面的自动化和执行页面生命周期的各个方法。

jv.myOnInit 会依次执行以下方法

1. 执行 me.Page_PreInit

2. 执行 jv.MyInitOn_PreFith ,系统脚本给最初的容器计算高度

3. 执行 jv.MyInitOn 字典里的 value 部分。这是系统脚本注册的自动化部分。

4. 执行 me.Page_Init

5. 执行 me.Page_Render 字典里的 value 部分,这是页面脚本自己的自动化部分。

6. 执行 jv.MyInitOn_Fithed,系统脚本在脚本最后,计算容器高度。

7. 执行 me.Page_Inited

其中2,3,6 是系统自动执行的脚本。除去2,3,6,其余的部分,就是页面能控制的生命周期。

1. Page_PreInit

2. Page_Init, 最常用

3. Page_Render 这是字典结构。

4. Page_Inited

自动化脚本示例:

1. 自动化初始化时间选择控件。

引用的第三方时间选择控件的Api,一般是显式进行定义,像这样: $("#id").时间控件方法(格式);如 My97:

$("#date").click(function () { WdatePicker({ $dpPath: jv.Root + "R/My97/", dateFmt: "yyyy-MM-dd" }); });

利用页面最后会执行 jv.myOnInit 中的 jv.MyInitOn 字典的数据,进行自动化初始化。

    jv.MyInitOn["MyDate"] = function (container) {
        jv.loadJsCss("js", jv.Root + "R/My97/wdatepicker.js");

        container = container || jv.page();

        $(".MyDate", container).each(function () {
            var $self = $(this);
            var format = $self.attr("dtFormat") || ‘yyyy-MM-dd‘;
            $self.click(function () { WdatePicker({ $dpPath: jv.Root + "R/My97/", dateFmt: format }); });
            if (!$self.val()) return;

            $self.val($self.val().getDate().toString(format));
        })
  });

这样,所有包含 MyDate 的类元素,都会自动注册 click 事件,显示时间控件。只需要这样:

<input class="MyDate"/>

2. 改造默认的Ajax,在请求出错时,自动弹出信息框。

    jv.MyInitOn["InitJQueryAjax"] = function () {

        $.ajaxSetup({
            //请求成功后触发
            success: function (data) {

            },
            //请求失败遇到异常触发
            error: function (xhr, status, e) {
                //弹框报错。
            },
            //完成请求后触发。即在success或error触发后触发
            complete: function (xhr, status) {
                $(document.body).css("cursor", "default");
            },
            //发送请求前触发
            beforeSend: function (xhr, opt) {
                $(document.body).css("cursor", "wait");
            }
        });
    };

项目部署教程:

http://www.cnblogs.com/newsea/p/4530864.html

时间: 2024-12-27 08:45:27

我的前端架构之一--页面作用域的相关文章

Web前端架构杂谈:单页面应用和服务器模板系统

单页Web应用程序: 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术,更大有吹捧者. 这种技术近几年随着移动端的大热也渐渐升温,BackBone,Angular等前端框架兴起,结合NodeJs,使得前后端语言同一,前端开发可以兼容后端开发等等,并有替代前几年一统天下的jQuery趋势. jQuery的缺点其实非常明显,臃肿和维

基于AngularJS的企业软件前端架构[转载]

这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/S企业软件前端开发模式大体上与桌面软件类似,都是偏重量级的,在前端可能会有较多的业务逻辑,这些业务逻辑如何被合理模块化,与界面分离,以便测试,成为这个领域的一个重要挑战.另一方面,由于企业应用的界面相对规整,偏重的是数据存取,没有太多花哨的东西,所以常见的界面控件也是可枚举的,如何让开发界面的工作能

使用模块化思维和模板引擎搭建前端架构(require+underscore)

require.js 介绍: 是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的RequireJS压缩后只有14K,堪称非常轻量. 官网:http://www.requirejs.cn/    (PS:如果没接触过,刚开始看都是一头蒙蔽的,建议看下菜鸟教程) 新手教程:http://www.runoob.com/w3cnote/requirejs-tutorial-1.html 优点:可完成团队协作.模块复用.单元测试等等一系列复杂的需求 undersco

WEB前端开发电商网站前端架构

课程介绍通过一个垂直电子商务网站,介绍前端架构搭建和实现的步骤和方法,以及在这个过程中我们需要做什么才能帮助项目最终从设计走向实现.课程提纲第1章 前端架构知识准备认识前端架构,了解前端架构技术.产品设计和发布.数据分析和优化的基础第2章 前端架构设计了解前端架构的组织方式.页面层次的架构组织.架构设计和组件化方案等.第3章 前端架构实施了解架构的实施.优化思路,如何实施自动化.通过蛋糕电商网站讲解,分析案例.如何图解设计和交互图.如何从目录入手搭建基本架构.如何从页面层次进行架构搭建和最后项目

web富客户端应用下,前端架构问题。

前言: 以前的工作大部分都是,前端做页面 稍微写几个js效果就算是 有复杂的效果 也没有涉及到 需要去调用后端数据的层面.总体来说,以前的页面逻辑会相对简单后端会做更多的事. 而现在,这些任务都抛给前端来做了..  前端的业务逻辑变得很复杂 有的时候甚至 比后端的更复杂.(当然这个也跟写接口的人水平有关...) 在这样的背景下面,如果还是以前那套 页面里面写js 或者哪里有效果写哪里的话.无论是实现,还是后面的维护都是一个很大的问题.. 所以,我觉得富客户端web应用,很有必要组建一个自己的前端

没有最好,选择最适合自己的前端架构

前端框架不断推新,众多IT企业都面临着"如何选择框架","是否需要再造轮子"的抉择.去哪儿网前端架构师司徒正美分析了各主流行框架优劣点.适用场景,并针对不同规模的公司.项目给出了相应的前端技术选择方案. 最近几年,前端技术迅猛发展,差不多每年都会冒出一款主流的框架. 每次新开业务线或启动新项目时,首先第一件事就是纠结:使用什么框架,重造什么轮子?我很高兴应CSDN的邀请谈我的看法. RequireJS,前端技术发展分水岭 在五六年前,移动端还没有兴起,我们没有什么选

用“MEAN”技术栈开发web应用(一)AngularJs前端架构

前言 不知何时突然冒出“MEAN技术栈”这个新词,听起来很牛逼的样子,其实就是我们已经熟悉了的近两年在前端比较流行的技术,mongodb.express.angularjs.nodejs,由于这几项技术涵盖了从前端到后端再到数据库,可以用他们完整的开发一个web应用了,所以成了一个非常牛逼的组合,颇有当年LAMP的气势.前端要从切图仔迈向全栈的路上,这几门技术必须得有所涉猎.本系列文章利用自己虚构的一个小项目为例,对“使用MEAN技术栈开发web应用”做一个入门级的介绍. AngularJs的争

前端架构浅谈

前端架构浅谈 0.前注 鉴于作者本人的能力有限(非常有限),并且依然在学习中,因此本文的高度和深度必然有所欠缺. 欢迎(并且非常欢迎)大家来批评指正,如果能详细的说明问题在哪里,如何解决和改正,那么就太感谢了!!! 我最喜欢听有理有据的批评了!! 本人QQ:20004604,邮箱:[email protected],期待你的交流. 1.为什么要有一个好的架构 首先明确一点,架构是为需求服务的. 前端架构存在的目的,就我个人理解来说,有以下几点: 1.提高代码的可读性. 一个好的架构,代码的可读性

好的前端架构

p{text-indent:2em;}前端开发whqet,csdn,王海庆,whqet,前端开发专家 翻译自:www.sitepoint.com 翻译人员:前端开发whqet,意译为主,不当之处欢迎大家指正. 译者说:临近期末,大部分的基础教学内容已经讲解完毕,在进行比较大型的项目训练之前,如果能让学生了解甚至遵循一些前端开发的编码规范将会是一件非常有意义的事情.因此,本博客准备于近期整理一个编码规范与最佳实践的系列文章,包括html.css.javascript.jquery.php等,希望能