广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >如何用代码实现JavaScript MVC样式框架
  • 530
分享到

如何用代码实现JavaScript MVC样式框架

2024-04-02 19:04:59 530人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关如何用代码实现javascript mvc样式框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Download JavaScr

这篇文章将为大家详细讲解有关如何用代码实现javascript mvc样式框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

Download JavaScript-Mvc.zip - 4.6 KB

  • JavaScript Mvc on GitHub

  • Live Demo

介绍

使用过 JavaScript框架(如 angularjs, Backbone 或者Ember)的人都很熟悉在UI(用户界面,前端)中mvc的工作机理。这些框架实现了MVC,使得在一个单页面中实现根据需要变化视图时更加轻松,而模型-视图-控制器(mvc)的核心概念就是:处理传入请求的控制器、显示信息的视图、表示业务规则和数据访问的模型。

因此,当需要创建这样一个需要在单个页面中实现切换出不同内容的应用时,我们通常选择使用上述框架之一。但是,如果我们仅仅需要一个在一个url中实现视图切换的框架,而不需要额外捆绑的功能的话,就不必使用象Angular和Ember等复杂的框架。本文就是尝试使用简单、有效方法来解决同样的问题。

概念

应用中的代码利用urls中的“#”实现MVC模式的导航。应用以一个缺省的url开始,基于哈希值的代码加载应用视图并且将对象-模型应用于视图模板。

url格式像下面这样:

Http://Domain Name/index.html#/Route Name

视图内容必须以{{Property-Name}}的方式绑定对象模型的值和属性。代码会查找这个专门的模板格式并且代替对象模型中的属性值。

ajax的方式异步加载的视图会被放置于页面的占位符中。视图占位符可以是任何的元素(理想的情况是div),但是它必须有一个专门的属性,代码根据这个专门的属性来定位它,这样同样有助于代码的实现。当url改变时,会重复这个场景,另外一个视图被加载。听起来很简单吧!下面的流程图解释了在这个特定的实现中的消息跳转。

如何用代码实现JavaScript MVC样式框架

写代码

我们以基本的模块设计模式开始,并且最终用门面设计模式的方式将我们的libs曝光于全局范围内。

; (function (w, d, undefined) { //rest of the code })(window, document);

我们需要将视图元素存储到一个变量中,这样就可以多次使用。

var _viewElement = null; //element that will be used to render the view

我们需要一个缺省的路由来应对url中没有路由信息的情况,这样就缺省的视图就可以被加载而不是展示空白页面。

var _defaultRoute = null;

现在我们来创建我们的主要MVC对象的构造方法。我们会把路由信息存储在“_routeMap”中

var jsMvc = function () {      //mapping object for the routes      this._routeMap = {};  }

是时候创建路由对象了,我们会将路由、模板、控制器的信息存储在这个对象中。

var routeObj = function (c, r, t) {      this.controller = c;      this.route = r;      this.template = t;  }

每一个url会有一个专门的路由对象routeObj.所有的这些对象都会被添加到_routeMap对象中,这样我们后续就可以通过key-value的方式获取它们。

为了添加路由信息到MVC libs中,我们需要曝光libs中的一个方法。所以让我们创建一个方法,这个方法可以被各自的控制器用来添加新路由。

jsMvc.prototype.AddRoute = function (controller, route, template) {      this._routeMap[route] = new routeObj(controller, route, template);  }

方法AddRoute接收3个参数:控制器,路由和模板( contoller, route and template)。他们分别是:

controller:控制器的作用就是访问特定的路线。

route:路由的路线。这个就是url中#后面的部分。

template:这是外部的html文件,它作为这个路由的视图被加载。现在我们的libs需要一个切入点来解析url,并且为相关联的html模板页面提供服务。为了完成这个,我们需要一个方法。

Initialize方法做如下的事情:

1)获取视图相关的元素的初始化。代码需要一个具有view属性的元素,这样可以被用来在HTML页面中查找:

2)设置缺省的路由

3)验证视图元素是否合理

4)绑定窗口哈希变更事件,当url不同哈希值发生变更时视图可以被及时更新

5)***,启动mvc

//Initialize the Mvc manager object to start functioning  jsMvc.prototype.Initialize = function () {      var startMvcDelegate = startMvc.bind(this);         //get the html element that will be used to render the view        _viewElement = d.querySelector('[view]');              if (!_viewElement) return; //do nothing if view element is not found             //Set the default route      _defaultRoute = this._routeMap[Object.getOwnPropertyNames(this._routeMap)[0]];             //start the Mvc manager      w.onhashchange = startMvcDelegate;      startMvcDelegate();  }

在上面的代码中,我们从startMvc 方法中创建了一个代理方法startMvcDelegate 。当哈希值变化时,这个代理都会被调用。下面就是当哈希值变化时我们做的操作的先后顺序:

1)获取哈希值

2)从哈希中获取路由值

3)从路由map对象_routeMap中获取路由对象routeObj

4)如果url中没有路由信息,需要获取缺省的路由对象

5)***,调用跟这个路由有关的控制器并且为这个视图元素的视图提供服务

上面的所有步骤都被下面的startMvc方法所实现

//function to start the mvc support  function startMvc() {      var pageHash = w.location.hash.replace('#', ''),          routeName = null,          routeObj = null;                                 routeName = pageHash.replace('/', ''); //get the name of the route from the hash              routeObj = this._routeMap[routeName]; //get the route object             //Set to default route object if no route found      if (!routeObj)          routeObj = _defaultRoute;             loadTemplate(routeObj, _viewElement, pageHash); //fetch and set the view of the route  }

下一步,我们需要使用XML HTTP请求异步加载合适的视图。为此,我们会传递路由对象的值和视图元素给方法loadTemplate。

//Function to load external html data  function loadTemplate(routeObject, view) {      var xmlhttp;      if (window.XMLHttpRequest) {          // code for IE7+, Firefox, Chrome, Opera, Safari          xmlhttp = new XMLHttpRequest();      }      else {          // code for IE6, IE5          xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');      }      xmlhttp.onreadystatechange = function () {          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {              loadView(routeObject, view, xmlhttp.responseText);          }      }      xmlhttp.open('GET', routeObject.template, true);      xmlhttp.send();  }

当前只剩加载视图和将对象模型与视图模板绑定了。我们会创建一个空的模型对象,然后传递与方法相关的模型来唤醒路由控制器。更新后的模型对象会与先前已经加载的XHR调用中的HTML模板绑定。

loadView 方法被用于调用控制器方法,以及准备模型对象。

replaceToken方法被用于与HTML模板一起绑定模型

//Function to load the view with the template  function loadView(routeObject, viewElement, viewHtml) {      var model = {};          //get the resultant model from the controller of the current route        routeObject.controller(model);          //bind the model with the view          viewHtml = replaceToken(viewHtml, model);              //load the view into the view element      viewElement.innerHTML = viewHtml;   }     function replaceToken(viewHtml, model) {      var modelProps = Object.getOwnPropertyNames(model),                 modelProps.forEach(function (element, index, array) {          viewHtml = viewHtml.replace('{{' + element + '}}', model[element]);      });      return viewHtml;  }

***,我们将插件曝光于js全局范围外

//attach the mvc object to the window  w['jsMvc'] = new jsMvc();

现在,是时候在我们单页应用中使用这个MVC插件。在下一个代码段中,下面这些会实现:

1)在WEB页面中引入这个代码

2)用控制器添加路由信息和视图模板信息

3)创建控制器功能

4)***,初始化lib。

除了上面我们需要的链接让我们导航到不同的路径外,一个容器元素的视图属性包含着视图模板html。

<!DOCTYPE html> <html> <head>     <title>JavaScript Mvc</title>     <script src="jsMvc.js"></script>     <!--[if lt IE 9]> <script src="jsMvc-ie8.js"></script> <![endif]-->            <style type="text/CSS">         .NavLinkContainer {              padding: 5px;              background-color: lightyellow;          }             .NavLink {              background-color:black;              color: white;              font-weight:800;              text-decoration:none;              padding:5px;              border-radius:4px;          }              .NavLink:hover {                  background-color:gray;              }      </style> </head> <body>     <h4>Navigation Links</h4>     <div class="NavLinkContainer">         <a class="NavLink" href="index.html#/home">Home</a>                 <a class="NavLink" href="index.html#/contact">Contact</a>              <a class="NavLink" href="index.html#/admin">Admin</a>                 </div>     <br />     <br />     <h4>View</h4>     <div view></div>     <script>         jsMvc.AddRoute(HomeController, &apos;home&apos;, &apos;Views/home.html&apos;);          jsMvc.AddRoute(ContactController, &apos;contact&apos;, &apos;Views/contact.html&apos;);          jsMvc.AddRoute(AdminController, &apos;admin&apos;, &apos;Views/admin.html&apos;);          jsMvc.Initialize();             function HomeController(model) {              model.Message = &apos;Hello World&apos;;          }             function ContactController(model) {              model.FirstName = "John";              model.LastName = "Doe";              model.Phone = &apos;555-123456&apos;;          }             function AdminController(model) {              model.UserName = "John";              model.PassWord = "MyPassword";          }      </script> </body> </html>

上面的代码有一段包含一个为IE的条件注释。

<!--[if lt IE 9]> <script src="jsMvc-ie8.js"></script> <![endif]-->

如果IE的版本低于9,那么function.bind,Object.getOwnPropertyNames和Array.forEach属性将不会被支持。因此我们要通过判断浏览器是否低于IE9来反馈代码是否支持。

其中的内容有home.html, contact.html 和 admin.html 请看下面:

home.html:

{{Message}}

如何用代码实现JavaScript MVC样式框架

contact.html:

{{FirstName}} {{LastName}}  <br /> {{Phone}}

如何用代码实现JavaScript MVC样式框架

admin.html:

<div style="padding:2px;margin:2px;text-align:left;">     <label for="txtUserName">User Name</label>     <input type="text" id="txtUserName" value="{{UserName}}" /> </div> <div style="padding:2px;margin:2px;text-align:left;">     <label for="txtPassword">Password</label>     <input type="password" id="txtPassword" value="{{Password}}" /> </div>

如何用代码实现JavaScript MVC样式框架

完整的代码可以从给定的下载链接中得到。

如何运行代码

运行该代码比较简单,需要在你喜欢的Web服务器上创建一个Web应用,下面以IIS为例来说明。

首先在默认站点中新增一个Web应用.

如何用代码实现JavaScript MVC样式框架

然后设置必填信息:别名,物理路径,应用池,用户认证信息,点击OK。

如何用代码实现JavaScript MVC样式框架

***定位到Web应用的内容目录,浏览你想打开的HTML页面即可。

如何用代码实现JavaScript MVC样式框架

跑在服务器里是必要的,因为代码加载从存储于外部文件中的视图,浏览器不会允许我们的代码在非宿主服务器环境下执行。当然如果你使用Visual Studio那么直接在目标html文件上右键,选择&lsquo;View In Browser&rsquo;即可。

浏览器支持

大部分的现代浏览器都支持本代码。针对IE8及以下的浏览器,有一份单独的代码来支持,但很不幸,这份代码远多于100行。因此这代码不是百分百跨浏览器兼容的,所以当你决定在项目中使用时需要对代码进行微调。

关于如何用代码实现JavaScript MVC样式框架就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何用代码实现JavaScript MVC样式框架

本文链接: https://www.lsjlt.com/news/86192.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何用代码实现JavaScript MVC样式框架
    这篇文章将为大家详细讲解有关如何用代码实现JavaScript MVC样式框架,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Download JavaScr...
    99+
    2022-10-19
  • 如何用PHP实现简易的MVC框架
    这篇文章主要介绍了如何用PHP实现简易的MVC框架的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何用PHP实现简易的MVC框架文章都会有所收获,下面我们一起来看看吧。一、前言MVC的全名是Model View...
    99+
    2023-06-30
  • 如何用JavaScript代码实现简单Tip提示框效果
    本篇内容介绍了“如何用JavaScript代码实现简单Tip提示框效果”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!具体代码如下://&nb...
    99+
    2023-07-04
  • 如何实现阶梯样式CSS边框
    这篇文章给大家分享的是有关如何实现阶梯样式CSS边框的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。阶梯样式CSS边框你是否曾经尝试在div周围添加3d样式边框在我们的元素中添加一些多色深度是非常容易的,我们只需要...
    99+
    2023-06-27
  • CSS代码如何实现提示框
    这篇“CSS代码如何实现提示框”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“CSS代码如何实现提示框”文章吧。需求:有时加载...
    99+
    2023-07-04
  • JavaScript如何实现代码整洁
    这篇文章主要介绍JavaScript如何实现代码整洁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述一张幽默的图片:软件质量通过你在阅读代码的时候有多少报怨来进行评估Robert ...
    99+
    2022-10-19
  • 如何在Spring框架中实现动态代理
    这篇文章给大家介绍如何在Spring框架中实现动态代理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。动态代理,是一种通过运行时操作字节码,以达到增强类的功能的技术,也是Spring AOP操作的基础,关于AOP的内容,...
    99+
    2023-05-31
    spring 动态代理
  • ASP 框架中如何使用 JavaScript 创建二维码?
    ASP框架中如何使用JavaScript创建二维码? 随着互联网技术的发展,二维码作为一种方便快捷的信息传递工具,被广泛应用于各个领域。在ASP框架中,如何使用JavaScript创建二维码呢?本文将为大家详细介绍。 一、什么是二维码? 二...
    99+
    2023-09-05
    框架 javascript 二维码
  • ASP path 面试:如何在框架中实现优秀的代码设计?
    ASP是一种广泛使用的Web应用程序框架,许多公司和组织都在使用它来创建自己的Web应用程序。因此,ASP的编程技能变得越来越重要。在ASP的编程过程中,优秀的代码设计是非常必要的,它可以帮助我们更好地组织和管理代码,从而使应用程序更加健壮...
    99+
    2023-11-04
    path 面试 框架
  • Flask框架运用Ajax实现数据交互的示例代码
    目录前后端发送字符串前后端发送JSON数据发送数据并携带token收发JSON格式字符串使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载刷新整个页面,这使得...
    99+
    2022-11-13
    Flask Ajax数据交互 Flask Ajax数据 Flask 数据交互 Flask Ajax
  • Java如何使用junit框架进行代码测试
    这篇文章主要介绍了Java如何使用junit框架进行代码测试的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java如何使用junit框架进行代码测试文章都会有所收获,下面我们一起来看看吧。我写了一个时间工具类 ...
    99+
    2023-07-05
  • 如何使用css实现文字边框虚线样式
    这篇文章主要为大家展示了“如何使用css实现文字边框虚线样式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用css实现文字边框虚线样式”这篇文章吧。  ...
    99+
    2022-10-19
  • HTML+CSS如何实现单选框、复选框美观的样式
    小编给大家分享一下HTML+CSS如何实现单选框、复选框美观的样式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.背景图html<div cla...
    99+
    2023-06-08
  • 如何使用CSS3实现input多选框自定义样式
    小编给大家分享一下如何使用CSS3实现input多选框自定义样式,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!原理:首先把input元素隐藏掉,然后用CSS设置label元素(其他元素也可以)的样式,选中时的样式使用inp...
    99+
    2023-06-08
  • CSS3如何实现提交意见输入框样式
    这篇文章主要介绍了CSS3如何实现提交意见输入框样式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 做了个输入...
    99+
    2022-10-19
  • 如何实现J2EE分布式系统框架设计
    今天就跟大家聊聊有关如何实现J2EE分布式系统框架设计,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一,导言框架设计(Framework Design)是系统设计的重要组成部分,一个...
    99+
    2023-06-03
  • Flex如何实现代码格式化
    这篇文章将为大家详细讲解有关Flex如何实现代码格式化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Flex代码格式化在做Flex编码的时候,调整编码格式非常让人头疼,特别是有时候从其它文档中复制代码进来...
    99+
    2023-06-17
  • Javascript如何在Spring框架下实现快速开发API?
    随着互联网的快速发展,开发API成为了一个非常重要的环节。而JavaScript是当前最流行的编程语言之一,因此,如何在Spring框架下使用JavaScript来快速开发API是我们非常关心的问题。 在本文中,我们将介绍如何使用Spri...
    99+
    2023-08-10
    spring api javascript
  • 如何用javascript实现提示框
    这篇文章主要介绍“如何用javascript实现提示框”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用javascript实现提示框”文章能帮助大家解决问题。 ...
    99+
    2022-10-19
  • javascript如何实现容错处理代码
    这篇文章主要介绍了javascript如何实现容错处理代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。第一种:编程网在用的 <SCR...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作