從零開始學_JavaScript_系列(21)——dojo(8)(手把手教你封裝一個widget)

(73)封裝一個widget

醒目:必須在web環境下使用,無論是pythonweb.py或者是通過http訪問網站環境,都可以,但純本地是不可行的。

?

首先,什么是widget?

簡單來說,就是一個dom結點,比如像這樣:

<div>這是一個dom結點
</div>

?

為什么需要widget呢?

很簡單,比如,我們想在這樣一個地方:

<div class="nodes"></div>

?

添加很多個上面那個dom結點,比如像這樣。

<div class="nodes"><div>這是一個dom結點</div><div>這是一個dom結點</div>
</div>

?

或者在很多地方添加這一個dom結點。

?

解決辦法①:

我們可以這么直接把他寫在HTML里;

?

優點:

①復制粘貼到所有需要他的地方,非常簡單

?

缺點:

①假如這個結點非常的復雜,可能還有一些事件(比如點擊后彈一個彈窗什么的),我們要ctrl + c、ctrl + v很多次;

②假如產品經理突然說,讓我們把這個改一下吧,因此我們可能需要在很多地方進行修改(但也有可能忘記把某個地方的改掉);

?

解決辦法②:

封裝一個widget

?

優點:

①上面的缺點都不是問題了;

?

缺點:

①假如這個結點很簡單(比如就上面一行),那么這么寫反而復雜了。

?

?

封裝方法:

①基礎是上面的類的繼承,我們需要繼承一個類,這個類就是widget的基礎類;

類:"dijit/_WidgetBase"

?

②其次,我們需要一個模板類,這個模板做什么用的呢,很簡單,是幫我們省去重復工作的,我們使用這個類,于是就可以省去重復寫創建dom結點的工作了,只需要修改模板內的東西即可。

?

③為了說的更簡單點,我給一個基礎類聲明,其創建方式是類的封裝(具體見之前的71);

代碼如下:

define(["dojo/_base/declare","dijit/_WidgetBase","dijit/_TemplatedMixin","dojo/text!template.html"], function (declare, _WidgetBase, _TemplatedMixin, template) {return declare('template', [_WidgetBase, _TemplatedMixin], {name: "這是一個模板的文件",? //替換模板內的${name}位置baseClass: "templateClass",? //模板的根div的css類templateString: template,?? //這個template就是模板的內容,通常這么寫就沒錯了postCreate: function () {?? //渲染模板,還有給他加事件就放在這一步了this.inherited(arguments); }});
});

?

define引入的第一個插件是聲明類;

第二個插件是widget;

第三個插件是模板類;

第四個是模板(指向一個html);

第五個是on,用于綁定觸發事件的

?

同樣,為了簡單說明,有以下前提:

新建的文件和dojo文件夾、dijit文件夾等在同一個根目錄下,包括:

《1》調用類的html文件;

《2》類的聲明的js文件;

《3》類的模板文件;

?

④首先創建一個test.html文件,這個html文件是調用類的html文件;

我們還需要創建一個類文件test.js,這個js文件聲明一個類;

我們最后創建一個模板文件template.html,這個文件作為模板;

?

⑤首先給出模板文件的html內容:

<div><div data-dojo-attach-point="node" class="node">${name}</div>
</div>

?

其中:

data-dojo-attach-point:可以通過這個屬性找到該結點,可以理解為id一樣的東西,同一個模板文件內不能重復;

class就是其類,就像正常的div的class屬性一樣;

${name}:在js文件里,可以通過某個變量來控制他,可以理解為,那個變量的值就是${name}顯示的東西

?

⑥接下來給出js文件:

define(["dojo/_base/declare","dijit/_WidgetBase","dijit/_TemplatedMixin","dojo/text!template.html","dojo/on"], function (declare, _WidgetBase, _TemplatedMixin, template, on) {return declare('template', [_WidgetBase, _TemplatedMixin], {name: "這是一個模板的文件",? //替換模板內的${name}位置baseClass: "templateClass",? //模板的根div的css類templateString: template,?? //這個template就是模板的內容,通常這么寫就沒錯了postCreate: function () {?? //渲染模板,還有給他加事件就放在這一步了this.inherited(arguments);this.aEvent();},aEvent: function () {var self = this;on(this.node, "click", function () {self.node.innerHTML += "<br>——添加了一些內容";})}});
});

?

我簡單解釋一下這個js文件:

《1》aEvent是這個widget綁定的一個方法,凡是使用這個widget的地方,都會自動綁定這個事件。之所以能自動綁定,是通過postCreate這個方法調用的原因。

?

《2》postCreate是創建widget必然會被執行的函數,不需要我們手動調用,這個函數是通過遞歸被執行的(總之知道他肯定會被執行就是了);

他是創建widget被執行的一系列的函數之一,準確的說是倒數第二個,倒數第一個是startup,一般是被手動調用的;

?

《3》這個widget展現出來的作用是。掛載某一個html的dom結點之上,然后點擊文字部分的時候,會觸發一個事件,而這個事件的效果是增加一行文字,文字內容就是innerHTML里面添加的內容。這個事件可以被無限次觸發;

?

⑦最后給出test.html文件的內容:

<!DOCTYPE html>
<html>
<head><meta charset="utf-8">
</head>
<script>var dojoConfig = {async: true}</script>
<script src="dojo/dojo.js"></script>
<script>require(["test"], function (test) {var te = new test({}, "base");})
</script>
<style>.node {border: 1px solid #ccc;}
</style>
<body>
<div id="base"></div>
</body>
</html>

?

我調用這個widget的方法很簡單,require一個test(實際是test.js那個文件),然后在回調函數傳參給他,然后new一個test(就是創建一個widget),但這個widget放在哪里呢?很簡單,test的第二個參數就是widget被放置的地方(因為id="base"是相符的)。

?

?

最后:

因為某些人可能沒法創建web環境,因此給一個示例地址:

http://www.jianwangsan.cn/test.html

ps:這是我的個人網站,理論上來說,應該是沒有毒的吧。。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284583.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284583.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284583.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉]面向對象(1、三大特征;2、六大原則)

目錄 一、面向對象的概述&#xff1a; 二、封裝&#xff1a; 1、封裝概述 2、封裝原則 3、封裝好處 4、封裝壞處 5、封裝代碼展示 三、繼承&#xff1a; 1、概念&#xff1a; 2、實現格式&#xff1a; 3、特點&#xff1a; 4、好處&#xff1a; 5、弊端&#xff1…

Python的MySQLdb模塊安裝

在配置Django時&#xff0c;選擇的是mysql數據庫&#xff0c;要安裝MySQLdb模塊&#xff0c;不過安裝過程中&#xff0c;遇到了很多errors&#xff0c;記錄一下。 系統:ubuntu 11.10 mysql:直接apt-get安裝的&#xff0c;version:5.1.62 到官方下載MySQL for Python 然后解壓&a…

【測繪程序設計】C#將度分秒(° ‘ “)轉換度(°)程序實現(附源碼)

在實際工作中,無論是ArcGIS中,還是CASS中,作圖時需要將GPS實測的經緯度度分秒( ’ ")坐標轉換為度(),在前面的文章中介紹了Excel中將度分秒轉為度的轉換程序,本文講解在Visual Studio中,采用C#語言實現快速度分秒( ’ ")轉換度(),提高工作效率。 案例…

Spotlight監控工具使用

Spotlight on unix監控linux服務器 1.下載安裝&#xff0c;工具包下載地址&#xff1a; 注&#xff1a;安裝之后需要破解注冊碼 2.由于spotlight不能默認使用root用戶登錄&#xff0c;所以必須先創建一個具有root權限的用戶 注&#xff1a;密碼最好不要設置的過于簡單化 [rootm…

Grpc MagicOnion庫 之 客戶端和服務端 (案例版)

之前通過自己寫動態代理和用現成的動態代理庫等實現過RPC功能&#xff0c;今天&#xff0c;就寫一下如何直接引用GRPC的庫來實現業務邏輯。gRPC的介紹&#xff0c;之前我也說了這個g的含義太多&#xff0c;也包含谷歌的意思了。可以看這個gRPC的文檔介紹 : https://grpc.io/doc…

Windows11右下角出現評估副本水印如何去除?

Universal Watermark Disabler是一款十分好用的桌面工具&#xff0c;這款工具可以幫助用戶輕松的去除Windows11 版本的操作系統右下角的水印。 使用方法 1、打開Universal Watermark Disabler軟件&#xff0c;顯示出當前系統的版本與水印狀態。 2、Status中顯示Ready for insta…

redhat配置centos的yum源

redhat默認不支持第三方的yum源&#xff0c;要求有rhn賬號&#xff0c;下面就rhel5和rhel6改為centos源一、rhel5.5 X86_64更改為centos的yum源查看系統自帶的yum相關的rpm包rpm -qa|grep yum刪掉系統自帶的yum相關的包rpm -e --nodeps yum-updatesd-0 rpm -e --nodeps yum-sec…

【GlobalMapper精品教程】001:GlobalMapper23+24 Pro-x64中文安裝教程(附軟件包下載)

Global Mapper 23是一款非常專業的地圖繪制軟件&#xff0c;功能非常的豐富&#xff0c;內置距離和面積計算&#xff0c;包括光柵混合、對比度調節、海拔高度查詢、視線計算以及一些高級功能&#xff0c;可輕松實現圖像校正、通過地表數據進行輪廓生成、通過地表數據觀察分水嶺…

JIL 編譯與 AOT 編譯

JIT&#xff1a;Just-in-time compilation&#xff0c;即時編譯&#xff1b;AOT&#xff1a;Ahead-of-time compilation&#xff0c;事前編譯。 JVM即時編譯&#xff08;JIT&#xff09; 1. 動態編譯與靜態編譯 動態編譯&#xff08;dynamic compilation&#xff09;指的是“在…

中臺基礎指標列表

便于大家進行更方便的指標圈定&#xff0c;這里我將前面提到的通用指標進行一次拓展&#xff0c;為大家整理了一份完整的數據中臺基礎指標列表&#xff0c;方便大家在搭建指標體系時進行速查。 &#xff08;1&#xff09;App類產品分析指標 &#xff08;2&#xff09;網站類產…

期末作品檢查

1、學期個人總結 在這個學期在杜老師的帶領下學習了Python語言&#xff0c;這是一門相對于Java語言來說是比較簡單的語言&#xff0c;用處也十分的廣大。python是一種面向對象的解釋型計算機程序設計語言&#xff0c;語法簡潔清晰&#xff0c;目前已超越java成為最熱門的編程語…

C# 通過不安全代碼看內存加載

&#xff08;注&#xff1a;本篇用點長&#xff0c;有點繞&#xff0c;耐心瀏覽&#xff09;C#中類型分為值類型和引用類型&#xff0c;值類型存儲在堆棧中&#xff0c;是棧結構&#xff0c;先進后出&#xff0c;引用類型存儲在托管堆中。接下來用不安全代碼的地址&#xff0c;…

ArcGIS實驗教程——實驗四十五:坐標直接轉點、線、面案例教程(Create Features From Text File)

外業實測坐標(X、Y、Z)在ArcGIS中可以方便的生成點、點自動連成線、線轉面。本實驗講解ArcGIS中從數據文件創建要素工具(Create Features From Text File)生成點、線、面。 文章目錄 一、工具快速入門1. 工具添加2. 工具用法二、工具使用方法1. 創建點(Point)2. 創建多點…

湖北省軟件行業協會會員單位全名錄(2014年的信息)

理事長單位 1.烽火通信科技股份有限公司 副理事長單位&#xff08;排名不分先后&#xff09; 2.武漢大學計算機學院 3.武漢天喻信息產業股份有限公司 4.武漢開目信息技術有限責任公司 5.武漢鋼鐵工程技術集團自動化有限責任公司 6.武漢菲旺軟件技術有限責任公司 7.立得空間信息…

靜態html引入js添加隨機數后綴防止緩存

在web項目開發中&#xff0c;頁面引入js被修改時&#xff0c;為避免瀏覽器緩存引起的問題&#xff0c;在引入js時&#xff0c;給js名后面加上隨機數&#xff0c;以保證每次都發送新的請求。 在jsp中&#xff0c;一般通過后臺取隨機數即可&#xff0c;代碼如下: <script src&…

[轉]SDK與API區別

轉載&#xff1a;https://www.zhihu.com/question/21691705/answer/149935191 SDK&#xff08;software development kit&#xff09;&#xff0c;中文可譯為“軟件開發工具包”。 一般都是一些被軟件工程師用于為特定的軟件包、軟件架構、硬件平臺、操作系統等建立應用軟件的開…

詳談如何定制自己的博客園皮膚【轉】

轉自&#xff1a;http://www.cnblogs.com/jingmoxukong/p/7826982.html 目錄 前言Quickstart定制博客園 CSS 的原理頁面定制CSS代碼博客側邊欄公告頁首Html代碼頁腳Html代碼定制細節獨立控件小老鼠游戲動畫動畫時鐘百度分享欄Github 角標簽云背景動畫動態標題文章內容樣式定制帶…

【ArcGIS微課1000例】0025:ArcGIS Online當前未連接到在線資源終極解決辦法

ArcGIS Online在線資源列表: World Imagery: 底圖服務: 中國地圖彩色版: 打開ArcGIS時,系統托盤提示“ArcGIS Online當前未連接到在線資源”,如下圖所示,如果無法連接到ArcGIS Online,則就無法添加在線資源,如World Imagery等。 關于該問題,網上有多種解決辦法,然而…

學習.NET ,提升.NET技能,這些公眾號得關注

時逢七月&#xff0c;白云在天&#xff0c;綠水環山&#xff0c;甚是悠閑。可是&#xff0c;學路上的我們卻四處彷徨。學海無涯&#xff0c;我仍苦尋渡口&#xff1b;學路漫漫&#xff0c;我卻愁無舟楫。我不禁四下掃視&#xff0c;自語問天&#xff0c;學須有成&#xff0c;可…

Excel表格從指定部分重新分頁打印的兩種方法

Excel表格現在已經成為了一個極其重要的辦公工具&#xff0c;尤其是在數據處理方面&#xff0c;它可以進行各種數據的處理、統計分析和輔助決策操作&#xff0c;但是在日常工作中我們經常對一些功能無從下手&#xff0c;例如在進行表格內容打印時&#xff0c;需要將其中內容從某…