精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于Dojo實現MVC模式下的Ajax應用

開發 前端
Dojo是一個用JavaScript語言實現的開源DHTML工具包。Dojo能夠讓你更容易使Web頁面具有動態能力,或者在任何能夠穩定支持JavaScript語言的環境中發揮作用。本文即是在Dojo基礎上實現MVC模式下的Ajax應用。

本人要實現項目中的一項應用是控制服務端返回來的音頻、文字在客戶端播放時的同步,相信都看到過baidu的歌曲試聽吧,聲文同步且支持拖放同步,此次實現多它一個功能,那就是點哪一句就播哪一句(當然我不是為了播放歌曲).簡要說我在和服務器的交互中使用JSON(javascript object notation)傳輸數據,服務端用Newtonsoft的.Net組件處理JSON數據序列化,至于具體的JSON格式那就你自己定義了,例如(最簡單的):

{ 
      Media : [{
      text : "......",
      start : "...",
            end : "...."
         },  ....]
         }

至于js下的MVC實現,或許許多人這樣認為“js僅僅是個腳本而已”,大概應是Ajax的出現改觀了許多人對js的看法,其實用js可以寫出完全面向對象的程序,因為js支持面向對象語言的幾大重要特性,應是一直以來大家所見到的js腳本給大家造成了不好的印象,js原本就是面向對象的語言(我們見到許多由它寫成的結構化的程序).看一下這篇文章,我的實現也是受它啟發,延伸一點的就是引用Dojo的事件訂閱、發布機制.

說一下上述陳述功能的具體的實現,在model方面實現首先實現一個容器型的model,解析JSON數據并擁有當前句信息、所有句信息(數組)、設定當前句方法:

ContainerModel:

dojo.lang.declare('ContainerModel',null,{
    initializer : function(jsonData)
    {
        var jsonObj=dojo.json.evalJson(jsonData);
        var sentences=new Array();
        for(var key in jsonObj.Sentences)
        {
            var sentenceObj=new SentenceModel(key,jsonObj.Sentences[key]);
            sentences.push(sentenceObj);
        }
        this._sentences=sentences;
        this._url=jsonObj.MediaUrl;
        this._selectedSentence = sentences[0]
    },
    
    getSentences : function () {
        return [].concat(this._sentences);
    },

    addItem : function (sentence) {
        this._sentences.push(sentence);
    },    

    setSelected : function (sentence) {
        this._selectedSentence = sentence;
    },
    
    reset : function (){
        this._selectedSentence = this._sentences[0];
    }
});

ItemModel:

dojo.lang.declare('ItemModel',null,{
    initializer : function(id,sentence)
    {
        this._id=id;
        this._jsonSentence=sentence;
       
        dojo.event.topic.subscribe("/PositionChange", this, this.invokeActive);
    },
   
    invokeActive : function(currentPos){
        //if curPos between this.startTime and this.endTime pulish:
        if(this._jsonSentence.StartTime<=currentPos && this._jsonSentence.EndTime>currentPos)
            dojo.event.topic.publish("/MeInvoked", this);
    },
   
    clickActive : function(){
        dojo.event.topic.publish("/MeClicked",this);
    }
});

另一個model代表上述的一句的信息,包含text、startTime、endTime,并且訂閱“/positionChange”事件(后面據mediaplayer定時發布),同時定義兩方法(此處會于View中用dojo.event的connect將其連于特定的用戶事件)用于發布當前對象被激活的事件,于view中同時會為controller訂閱此對象激活所發布的事件,controller處理時會刷新container model的當前項同時更新view的表現(如添加樣式),其中view對象除了為其他對象進行一些事件連接、訂閱外,其render方法負責將container model的所有項render成特定的html元素(如span),其中決定model的顯示形式:

Viewer - Controller:

/**
 * a container view class to render on the webpage
 */
dojo.lang.declare('MainView',null,{
    initializer : function(model,controller,elements){
        this._model=model;
        this._controller=controller;
        this._elements=elements;
       
        dojo.event.topic.subscribe("/MeInvoked", this._controller, this._controller.proccessInvoke);
        dojo.event.topic.subscribe("/MeClicked", this._controller, this._controller.proccessClick);
    },
   
    render : function(){
        var div = this._elements.div;
        //remove children
        for(var i=0;i<div.childNodes.length;i++)
        {
            div.removeChild(div.childNodes[i]);
        }
        div.innerHTML="";
        div.innerText="";
       
        var items = this._model.getSentences();
        for (var key in items) {
            var span = document.createElement("span");
            span.id=items[key]._id;
            span.appendChild(document.createTextNode(items[key]._jsonSentence.Sentence));
            span.appendChild(document.createElement("br"));
            div.appendChild(span);
           
            if(key==0)
                dojo.html.addClass(document.getElementById(this._model._selectedSentence._id),"selected");
           
            dojo.event.connect(span, 'onclick', items[key], 'clickActive');
        }
    }
   
});

/**
 * a common controller class,
 * execute some utilities operations.
 */
dojo.lang.declare('MainController',null,{
    initializer : function(model){
        this._model=model;
    },
   
    displaySentence : function(){       
        //actual method
        dojo.event.topic.publish("/DisplaySentence",this._model._selectedSentence._jsonSentence);
    },
   
    proccessInvoke : function(sentence){
        //proccess details
        this.proccessRightShow(sentence);       
    },
   
    proccessClick : function(sentence){
        //proccess details
        this.proccessRightShow(sentence);       
        //set player pos(start,end)
        setPlayerPos(sentence._jsonSentence.StartTime);
    },
   
    proccessRightShow : function(sentence){
        //lighten sentence and show sentence on the right
       
        if(this._model._sentences[0]==sentence || this._model._selectedSentence!=sentence)
        {
            //change origin selectedSentence's css
            dojo.html.removeClass(document.getElementById(this._model._selectedSentence._id),"selected");
            this._model.setSelected(sentence);
            //change new current selectedSentence's css
            dojo.html.addClass(document.getElementById(this._model._selectedSentence._id),"selected");
            document.getElementById(parseInt(this._model._selectedSentence._id/1.2)).scrollIntoView(true);
            //pass sentence to show in right in another func
            this.displaySentence();
        }
    }
});

大概模式如下:

圖中對象初始化會subscribe合適的事件以待事件publish時進行處理,其中虛線表示一次用戶點擊處理,而自由線表示隨播放進行處理文本同步(如加亮當前項)的過程,此過程在播放過程中持續進行。其實,事件發布并非圖中所示指向特定對象(圖中為了容易理解),是誰訂閱誰處理,有AOP的意味!

相信有了這些,讓這個模型運行起來是沒問題了吧,忙中抽閑和大家分享,另外dojo的require不要忘了

dojo.require('dojo.lang.*');
dojo.require("dojo.event.*");
dojo.require("dojo.event.topic");
dojo.require("dojo.html.*");
dojo.require("dojo.json");
dojo.require("dojo.io.*");

腳本的開發還是比較困難的,從開發環境、或從其控制來講,正如Pragmatic Programmer中所說的,“不***的系統、荒謬的時間標度、可笑的工具、還有不可能實現的需求--在這樣一個世界上,讓我們安全‘駕駛’”!

【編輯推薦】

  1. AJAX和XmlHttpRequest下的Web開發
  2. 淺談Ajax在ASP.Net中的使用
  3. 使用AJAX擴展器自定義控件
責任編輯:楊鵬飛 來源: 博客園
相關推薦

2009-03-09 09:45:07

MVCAjax.Net

2009-09-22 12:22:54

ibmdwLotus

2009-01-03 14:39:04

ibmdwDojoMVC

2011-01-24 13:12:01

AjaxDojojavascript

2009-01-03 16:29:45

AJAXASP.NET.NET

2017-11-23 17:21:31

Yii框架IntelYii框架深度剖析

2009-11-24 14:22:03

基于PHP的AJAX技

2012-11-12 10:34:50

IBMdw

2012-09-28 10:18:53

IBMdw

2011-08-01 16:43:51

ibmdwHTML5Dojo

2012-08-13 10:23:33

IBMdW

2012-12-18 10:03:22

JavaScriptWebJS

2012-12-18 13:32:45

IBMdW

2009-07-30 13:45:40

ASP.NET開發模式MVC模式

2009-06-01 09:13:52

ASP.NET MVCMVC應用ASP.NET MVC

2011-09-08 09:38:46

HTML5 WidgeDojo

2009-03-31 13:12:05

ASP.NETMVC表單驗證

2011-05-18 13:28:46

jQueryPHPAJAX

2017-11-22 14:08:23

OVSVLAN虛擬化網

2009-07-22 18:07:55

論壇應用程序ASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

97精品久久人人爽人人爽| 男人搞女人网站| 午夜精品久久久久久久第一页按摩| 99久久夜色精品国产亚洲狼| 3atv一区二区三区| 无码人妻精品一区二区三区99v| 一区二区美女视频| 中文字幕一区二区三区在线视频| 欧美大胆一级视频| 国产午夜伦鲁鲁| 成人免费在线观看| 国产一区在线不卡| 国内精品久久久久| 好吊一区二区三区视频| 亚洲黄色免费看| 久久精品综合网| 成人免费福利视频| 人人干人人干人人干| 精品理论电影| 欧美mv日韩mv国产网站app| 人妻久久久一区二区三区| 国产裸舞福利在线视频合集| 狠狠久久亚洲欧美| 97视频在线观看免费高清完整版在线观看| 少妇精品一区二区| 成人亚洲精品| 精品美女永久免费视频| 亚洲欧洲三级| 99热这里只有精品9| 亚洲精品看片| 色妞色视频一区二区三区四区| 国产大尺度视频| 成人18视频在线观看| 亚洲精品v日韩精品| 91亚洲精品久久久久久久久久久久| 国产成人精品一区二三区| 久久国产成人午夜av影院宅| 欧美videofree性高清杂交| 看欧美ab黄色大片视频免费| 青春草免费在线视频| 国产日本亚洲高清| 精品久久久久久一区| 无码一区二区三区在线观看| 亚洲国产精品久久久久蝴蝶传媒| 亚洲全黄一级网站| 熟妇女人妻丰满少妇中文字幕| 不卡av播放| 亚洲一区二区免费视频| 欧美精品亚洲| 丰满肉肉bbwwbbww| 麻豆国产91在线播放| 日本久久久久久久久久久| 国产十六处破外女视频| 成人激情免费视频| 亚洲欧美在线一区| 91pony九色| 国产第一精品| 色视频一区二区| 国产v片免费观看| 牛牛电影国产一区二区| 亚洲乱码中文字幕| 在线码字幕一区| 在线观看av黄网站永久| 久久这里只有精品视频网| 产国精品偷在线| www.日本在线观看| 国产精品一二三四区| 成人性生交xxxxx网站| 在线观看国产小视频| 日韩高清中文字幕一区| 日韩av电影免费观看高清| 国产黄色片免费看| 国产精品久久久久毛片大屁完整版 | 97国产精东麻豆人妻电影| 伊人春色在线观看| 亚洲激情第一区| 日韩欧美视频免费在线观看| 免费av在线| 1024成人网| 最新国产精品久久| 国产在线高清视频| 亚洲精品videosex极品| 国产免费黄色一级片| av资源在线播放| 一二三四社区欧美黄| 亚洲色欲久久久综合网东京热| 国产理论电影在线| 精品久久久久久| 国产成人av影视| 亚洲欧洲日韩精品在线| 日韩一区二区在线看| 在线观看日本一区二区| 伊人久久国产| 在线视频一区二区三区| 日本一二区免费| 日韩高清一区| 亚洲精品一区在线观看香蕉| 日本成人午夜影院| 亚洲精品久久久| 久久久999精品| 日本中文字幕免费观看| 久久精选视频| 91免费在线视频网站| 日韩有码第一页| 久久午夜免费电影| 一区精品视频| 国产精品69xx| 色综合色综合色综合色综合色综合| www.欧美日本| 一区二区三区亚洲变态调教大结局| 日韩风俗一区 二区| 蜜臀久久99精品久久久久久| 羞羞答答成人影院www| 久久久中精品2020中文| 成人一二三四区| 国产精品中文字幕日韩精品 | 国产第一页在线视频| 97se亚洲国产综合自在线不卡| 日本一区二区三区在线视频| 香蕉成人app免费看片| 日韩人在线观看| 久久精品久久99| 北条麻妃一区二区三区在线| 亚洲性生活视频| 久久成人在线观看| 免费高清视频精品| 国产在线精品二区| 视频在线观看你懂的| 成人欧美一区二区三区小说| 四虎永久免费网站| 91精品xxx在线观看| 精品捆绑美女sm三区| 中文字幕精品亚洲| 国产精品免费看| 亚洲xxx视频| 欧美日韩视频精品二区| 一区二区三区在线视频播放| 粉嫩虎白女毛片人体| 日韩一级淫片| 日韩中文字幕在线观看| 日本免费在线观看视频| 激情av综合网| 色综合电影网| 成人女同在线观看| 69堂成人精品免费视频| 国产精品高清无码在线观看| 亚洲国产一成人久久精品| 国产精品旅馆在线| 你懂的在线视频| 午夜精品久久久久久久| 波多野吉衣在线视频| 你懂的国产精品永久在线| 国产精品狼人色视频一区| 内射后入在线观看一区| 一区二区日韩电影| 手机精品视频在线| 亚洲精品国产首次亮相| 国产精品自在线| aaa在线观看| 91传媒视频在线播放| 免费看污片网站| 久久精品五月| 日本不卡久久| 美女av在线免费看| 日韩www在线| 日韩欧美大片在线观看| 国产一区二区免费在线| 手机成人av在线| 国内精品视频| 精品中文字幕乱| 不卡视频在线播放| 一级日本不卡的影视| 美女扒开腿免费视频| 手机福利小视频在线播放| 中文字幕五月欧美| 日本中文字幕精品—区二区| 欧美疯狂party性派对| 国产欧美精品一区二区三区-老狼| 在线观看a视频| 欧美日韩mp4| 91狠狠综合久久久| 久久se这里有精品| 公共露出暴露狂另类av| 国产视频一区二| 欧美激情一区二区三区久久久| 亚洲国产精品欧美久久| 精品人伦一区二区三区蜜桃免费| 人妻精品久久久久中文字幕| 日本不卡的三区四区五区| 亚洲欧洲久久| 久久青草视频| 精品国产依人香蕉在线精品| 国产成人av免费看| 调教+趴+乳夹+国产+精品| 免费成人深夜夜行p站| 日韩电影免费一区| 干日本少妇视频| 天天躁日日躁成人字幕aⅴ| 日韩美女中文字幕| 国产黄网站在线观看| 精品国产麻豆免费人成网站| 久久久久久久黄色片| 国产精品拍天天在线| 国模大尺度视频| 另类激情亚洲| 一级黄色片播放| 色狠狠久久av综合| 国产美女扒开尿口久久久| 国产白丝在线观看| 中文字幕亚洲欧美一区二区三区| 精品久久在线观看| 欧美日韩一区二区免费视频| av黄色在线免费观看| 国产精品一区二区91| 日批视频在线免费看| 婷婷另类小说| 欧美一区二区高清在线观看| 日韩视频在线直播| 国产精品视频网| 欧美xxxhd| 久久影视电视剧免费网站| 亚洲爱情岛论坛永久| 91福利区一区二区三区| 欧美日韩成人免费观看| 国产精品婷婷午夜在线观看| xfplay5566色资源网站| 精品一区二区三区蜜桃| 欧美精品一区免费| 午夜欧美精品| 日韩亚洲不卡在线| 国产精品色呦| 亚洲影院色无极综合| 欧美xnxx| 欧美一区二三区| 国产黄色大片在线观看| 久久精品一偷一偷国产| 国产日本在线| 日韩成人中文字幕| 亚洲AV无码精品色毛片浪潮| 欧美无乱码久久久免费午夜一区| 日韩a级片在线观看| 日本一区二区视频在线观看| 日本japanese极品少妇| 成人性色生活片| 在线a免费观看| 国产综合久久久久影院| 中文字幕国产传媒| 久久精品伊人| 久久精品国产精品亚洲色婷婷| 小小影院久久| 亚洲一区二区四区| 国产影视精品一区二区三区| 精品视频高清无人区区二区三区| 玖玖玖视频精品| 91在线播放国产| 欧美暴力调教| 国产成人精品久久二区二区| 色戒汤唯在线| 久久久久久国产免费| 午夜dj在线观看高清视频完整版| 中文字幕亚洲自拍| h视频在线观看免费| 亚洲国产天堂久久综合网| 国产白浆在线观看| 欧美精品三级日韩久久| 91麻豆视频在线观看| 欧美视频在线一区二区三区 | 亚洲精品国产一区二区三区四区在线| 国产真人做爰视频免费| 91香蕉国产在线观看软件| 国产伦精品一区三区精东| 国产不卡视频在线播放| 91porn在线| 成a人片国产精品| 中文字幕日韩三级片| 久久综合视频网| 精品无码人妻一区二区免费蜜桃| 久久丝袜美腿综合| 艳妇乳肉亭妇荡乳av| wwwwww.欧美系列| 午夜精产品一区二区在线观看的| 久久精品人人做人人爽人人| 成人激情五月天| 亚洲天堂2016| 国产真实乱人偷精品视频| 欧美日韩午夜激情| 亚洲天堂视频网站| 欧美午夜一区二区三区免费大片| 亚洲一级黄色大片| 日韩免费电影网站| 欧美天堂在线视频| 国产亚洲精品久久久久久777| 日韩黄色影院| 久久久久久久一| 无人区在线高清完整免费版 一区二| 国产欧美日韩视频| 亚洲欧洲国产精品一区| 久久精品日韩| 欧美大片aaaa| 欧美变态另类刺激| 男人的天堂久久精品| 亚洲女人在线观看| 91小视频在线| 男人的午夜天堂| 午夜久久福利影院| 中文字幕有码无码人妻av蜜桃| 日韩视频免费观看高清完整版在线观看| 国产精品亚洲lv粉色| 亚洲国产精品网站| 日本成人在线播放| 91av在线影院| 成人豆花视频| 国产伦精品一区二区三区在线| 国内黄色精品| 中文字幕色一区二区| av不卡免费看| 国产视频一区二区三区在线播放 | a级片一区二区| 日韩av在线发布| 国产chinese中国hdxxxx| 国产精品色眯眯| 97超碰人人干| 欧美一区二区三区日韩视频| 神马午夜精品95| 久久精品福利视频| 黑人巨大精品| 国产精品9999久久久久仙踪林| 日韩精品免费| 91动漫在线看| 久久er99精品| 久久久久久久久久久国产精品| 亚洲欧洲制服丝袜| 日韩欧美国产另类| 日韩av网址在线| 自拍亚洲图区| 成人女保姆的销魂服务| 国产欧美日韩精品一区二区免费| 涩涩涩999| 亚洲欧美春色| 91久久免费视频| 色综合久久99| 毛片免费在线| 日韩美女在线观看一区| 国产精品免费大片| 免费日韩视频在线观看| 久久人人爽爽爽人久久久| 尤物视频在线观看国产| 日韩精品极品在线观看| 亚洲精品日产| 日本不卡一区二区三区在线观看 | 538国产精品一区二区免费视频| 国产精品jk白丝蜜臀av小说| 极品粉嫩国产18尤物| eeuss鲁片一区二区三区在线观看 eeuss影院一区二区三区 | 欧美a级大片在线| 成人污网站在线观看| 国产.精品.日韩.另类.中文.在线.播放| 男女羞羞免费视频| 精品乱码亚洲一区二区不卡| 国产一二三在线| 免费在线观看91| 久久99久国产精品黄毛片色诱| 欧美黄色aaa| 精品久久久久av影院| 成人黄色动漫| 日韩亚洲视频在线| 麻豆精品新av中文字幕| 看片网站在线观看| 亚洲国产精彩中文乱码av在线播放| 乡村艳史在线观看| 亚洲 日韩 国产第一区| 国产乱码精品一区二区三区忘忧草| 国产真实夫妇交换视频| 亚洲天堂色网站| 精品国产亚洲日本| 霍思燕三级露全乳照| 国产欧美一区二区精品婷婷| 97人妻一区二区精品免费视频 | 一区二区三区三区在线| 国产成人av电影免费在线观看| 91九色丨porny丨肉丝| 亚洲欧美中文字幕| 精品成人18| 黄色片视频在线播放| 亚洲日本一区二区三区| 视频一区二区免费| 91精品免费久久久久久久久| 影音先锋在线一区| 手机免费观看av| 亚洲第一黄色网| 精品乱码一区二区三区四区| 日韩欧美不卡在线| 久久久精品综合| www.国产欧美| 国产精品美女免费视频| 欧美视频在线观看| 久久久视频6r| 日韩av最新在线观看| 精品国产欧美| 亚洲欧美久久久久|