亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

ASP.NET 無法確保在注冊的 JavaScript 內不存在重復定義

2019-11-18 16:41:50
字體:
來源:轉載
供稿:網友

asp.net 2.0中,我們使用Page.ClientScript屬性(也就是一個ClientScriptManager對象)的一些名字以Register開頭的方法注冊客戶端腳本,這是大家都知道的。

理論上應該如何避免沖突
先說說為什么要這樣注冊腳本,而不用Response.Write直接輸出。舉個例子,你用3個DropDownList做了一個輸入日期的區域,分別代表年/月/日,然后你為了防止用戶輸入2007/02/31,所以你決定把這3個DropDownList做成級聯的,也就是隨著年和月的輸入改變,日的可選項跟著改變。這時候你可以通過寫一些javaScript來實現級聯,例如定義一個名為updateDateRange()的Javascript函數負責更新DropDownList,然后直接把這些JavaScript放到C#的字符串里,并且使用Response.Write輸出。這些代碼用起來會很正常,直到有一次你的頁面需要輸入兩個日期。

在需要輸入兩個日期的那個頁面上,你把3個DropDownList復制粘貼了一遍,也把輸出的JavaScript的那段代碼復制粘貼了一遍,接著根據兩處ID的不同做了相應的修改,結果有一組級聯無法正常運行起來。你查看服務器端輸出的HTML,接著恍然大悟——原來有兩個updateDateRange()函數。于是你把updateDateRange()改為updateDateRange(yearControlClientId, monthControlClientId, dateControlClientId),同時把JavaScript刪減為僅輸出一遍,這時候無論哪組級聯都使用同一個函數,它們根據調用時輸入的DropDownList.ClientID來區分。

又有一天,你決定把這組級聯封裝為一個UserControl,做起來當然還是復制粘貼大法,也就是把3個DropDownList和JavaScript復制進UserControl,然后把UserControl的引用復制回原本的調用處。忙完之后,發現那個有兩個日期輸入的頁面又出錯了,原來updateDateRange(yearControlClientId, monthControlClientId, dateControlClientId)又被重復輸出了,因為頁面上放入了兩個UserControl所以JavaScript被輸出了兩遍,并且沒辦法減少輸出次數。
'http://www.49028c.com
這時候你可以使用Page.ClientScript.RegisterClientScriptBlock解決問題,它通過type和key這兩個參數確定腳本是否被重復注冊,而被重復注冊的腳本僅會輸出一次。為什么要type和key兩個參數呢?以前ASP.NET 1.x的同類函數只有key一個參數,這帶來的問題是可能兩個不同的控件設計時都使用了同一個key來注冊自己的腳本,結果其中一個控件腳本的成功輸出必然會抑制另一個控件腳本的輸出。加上了type參數,各控件都用自己的類型作為標識,這樣就能有效避免注冊時沖突。

為何無法真正避免沖突
關于這個問題,我們先看看ASP.NET內部定義的JavaScript是以什么方式命名的。通常,PRivate的全局函數或變量,命名都以雙下劃線開頭,例如大家熟悉的__doPostBack,或者是WebPartManager在客戶端使用的__wpm。而public或protected的全局函數或變量,一般就好像C#那樣使用Pascal命名法。具體的例子,大家可以用Reflector看看System.Web.UI的資源中的那些js文件。

我們暫時就假設這種命名法是正確的,然后模仿著去在自己開發的控件中實踐。事實上很多控件開發者也確實這樣做了,比較多的專業控件中你都能看到雙下劃線開頭命名的函數或變量,這至少可以避免和控件使用者在頁面上注冊的函數或變量沖突,因為在頁面上注冊的函數或變量通常都采用比較簡單的命名法。

假如現在我們要做一個浮動上下文菜單,也就是當你的鼠標移動到某個HTML元素上時該浮動菜單自動出現,當鼠標離開元素并且也不在菜單上時,菜單自動消失。為了方便用戶操作,我們允許用戶鼠標移動過程中稍微離開菜單區域,所以定義當鼠標離開菜單區域若干時間后才讓菜單消失,而這個時間在客戶端保存在__disappearAfter變量中。這個控件看起來什么問題都沒有,直到你把它和ASP.NET 2.0自帶的Menu控件放在同一個頁面上,因為Menu控件也有類似的功能,而且和我們的控件一樣Menu控件選擇了將時間變量保存在一個名為__disappearAfter的變量中。

現然,作為ASP.NET框架的使用者,框架沒有聲明這個變量的名字不允許使用,我用了有問題當然就可以認為是框架的錯。Brad Abrams寫了一本《.NET設計規范/Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries》,里面卻完全沒有提及JavaScript和CSS的規范,好像在ASP.NET中使用到的JavaScript與CSS都是瑣碎的不能在瑣碎的事情,所以完全不值得一提。

事實上,既然ASP.NET允許一個頁面上不同的控件設計者引入不同的JavaScript和CSS,就必須提供一種方法去管理潛在的命名沖突。如果是JavaScript,我們可以考慮使用ASP.NET Ajax的namespace來避免沖突,下一代代號為Orcas的Visual Studio和ASP.NET將內置ASP.NET AJAX支持,所以其內置控件所使用的JavaScript應該也會有namespace,這樣就有有效降低沖突概率。至于CSS命名沖突,暫時沒有好的解決放案,只能依賴控件設計者的習慣了,你可以考慮為你的控件根元素附上一個namespace以示區分,這樣也算是降低沖突概率的一個辦法。
http://www.49028c.com/cathsfz/archive/2007/01/28/632288.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久电影免费观看完整版| 久久久免费观看| 国产一区二区三区中文| 九九九久久久久久| 日韩欧美精品网站| 日韩欧美在线网址| 69影院欧美专区视频| 在线性视频日韩欧美| 一本色道久久综合亚洲精品小说| 欧美一乱一性一交一视频| 欧美精品性视频| 欧美激情极品视频| 中文字幕日本精品| 亚洲国产成人精品电影| 91极品视频在线| 欧美性jizz18性欧美| 一区二区三区精品99久久| 久久精品色欧美aⅴ一区二区| 免费99精品国产自在在线| 97国产精品视频人人做人人爱| 欧美理论电影网| 午夜精品一区二区三区av| 欧美精品videos另类日本| 国产xxx69麻豆国语对白| 国产v综合ⅴ日韩v欧美大片| 亚洲成人久久久久| 国产精品观看在线亚洲人成网| 欧日韩不卡在线视频| 国产在线不卡精品| 亚洲欧美日韩国产中文| 国产精品久久久久久久久粉嫩av| 久久视频在线播放| 欧美精品在线第一页| 国产精品海角社区在线观看| 欧美精品video| 国产亚洲人成网站在线观看| 久久久精品电影| 国产又爽又黄的激情精品视频| 国产精品99蜜臀久久不卡二区| 亚洲美女av网站| 日韩精品免费综合视频在线播放| 国产亚洲精品成人av久久ww| 性欧美在线看片a免费观看| 欧美国产日本在线| 超在线视频97| 久久久久久久久久久免费精品| 97av在线视频| 久久伊人精品视频| 国产精品一香蕉国产线看观看| 欧美成人手机在线| 日韩性生活视频| 国产精品日韩电影| 亚洲精品久久久一区二区三区| 亚洲欧美激情精品一区二区| 成人啪啪免费看| 亚洲视频电影图片偷拍一区| 国产玖玖精品视频| 在线看片第一页欧美| 91国自产精品中文字幕亚洲| 日韩中文av在线| 亚洲综合成人婷婷小说| 国产精品久久久久久久av大片| 亚洲免费一在线| 欧美日韩国产精品一区二区三区四区| 欧美巨大黑人极品精男| 日韩av免费观影| 成人xxxx视频| 国产成人在线亚洲欧美| 国产精品成人aaaaa网站| 久久夜色精品国产欧美乱| 欧美一区二区色| 国产精品一区二区久久国产| 欧美日韩激情小视频| 亚洲精品永久免费精品| 韩国v欧美v日本v亚洲| 亚洲少妇激情视频| 97国产精品免费视频| 久久亚洲电影天堂| 欧洲成人午夜免费大片| 欧美精品在线免费| 国产精品日韩在线播放| 亚洲人成电影在线观看天堂色| 欧美黑人狂野猛交老妇| 精品国产老师黑色丝袜高跟鞋| 黑人极品videos精品欧美裸| 中文字幕亚洲欧美在线| 欧美国产日韩视频| 日韩欧美亚洲一二三区| 国产精品视频男人的天堂| 国产精品久久久久久久天堂| 国产69精品久久久久99| 国产a级全部精品| 国产91精品久久久久久| 北条麻妃在线一区二区| 国产精品美女在线观看| 动漫精品一区二区| 欧美日韩在线视频观看| 国产精品福利久久久| 欧美在线www| 美女久久久久久久久久久| 黑人极品videos精品欧美裸| 亚洲福利在线视频| 欧美xxxwww| 亚洲美女av电影| 日韩av电影中文字幕| 欧美一性一乱一交一视频| 欧美丰满少妇xxxxx| 亚洲国产91精品在线观看| 日韩在线视频免费观看高清中文| 91国内在线视频| 性欧美xxxx交| 久久久久久久久网站| 久久国产天堂福利天堂| 国产精品成人播放| 亚洲系列中文字幕| 亚洲黄色有码视频| 亚洲精品久久7777777| 精品女同一区二区三区在线播放| 性色av一区二区咪爱| 在线精品国产欧美| 4438全国亚洲精品在线观看视频| 欧美一区二区三区精品电影| 亚洲欧美国产精品va在线观看| 久久久www成人免费精品| 欧美高清在线播放| 欧美一级淫片播放口| 国产精品成人av性教育| 国产免费一区二区三区在线能观看| 中文字幕日韩av电影| 久久久999精品免费| 91tv亚洲精品香蕉国产一区7ujn| 中文字幕亚洲综合久久筱田步美| 亚洲第一精品自拍| 亚洲精品日韩欧美| 97国产suv精品一区二区62| 伊人久久久久久久久久| 亚洲欧美在线看| 亚洲美腿欧美激情另类| 国产精品日韩在线| 日韩不卡中文字幕| 91网在线免费观看| 亚洲а∨天堂久久精品喷水| 日本精品一区二区三区在线| 成人淫片在线看| 国产91精品青草社区| 国产视频亚洲精品| 成人福利网站在线观看11| 欧美又大又硬又粗bbbbb| 久久久www成人免费精品张筱雨| 国产精品网址在线| 91最新国产视频| 性夜试看影院91社区| 中日韩午夜理伦电影免费| 国内精品一区二区三区四区| 国产成人精品网站| 国产精品日韩欧美综合| 日韩精品在线观看一区二区| 蜜臀久久99精品久久久无需会员| 国产99久久精品一区二区 夜夜躁日日躁| 17婷婷久久www| 狠狠色香婷婷久久亚洲精品| 丁香五六月婷婷久久激情| 久久激情五月丁香伊人| 久久久久国产精品www|