摘要:Resolving MasterPage ClientId Issue in jQuery
前言:
因為之前開發EIP,用到了許多jQuery,在目前開發上也沿用了一些之前開發的概念,而碰到了一個重要的問題,所有放在ContentPlaceHolder(MasterPage內的保留區塊)內的Control,其Control.ClientID都被加了料(請大家平心靜氣的跟我一起高喊:我X你X的微軟偉哉!微軟),jQuery的操作幾乎都是靠className或著ControlID來下指令,這樣子被加了料jQuery等於被廢了一隻手,於是花了一些時間找了些資料,與大家分享目前專案執行可能的可行方法,也請大家有其他想法也不吝指教。
參考資料
l 黑暗執行緒:
黑大在該部落格提到的做法,主要精神是:在Page_Load的時候,將目前頁面內的Controls利用遞迴的方式,逐一找出並註冊在Dictionary內,接著再逐一替各個Control建立一個Class,或改變Control在jQuery中的selector,來達到效果。
我自己測試的結果是不行的,如果在Page註冊的話他只找到UpdatePanel這層就不往下找了(應該是跟動態載入有關?),如果在UserControl內註冊的話,在jQuery還是找不到該UserControl內的控制項。試了很久還是沒結果就先放棄這個做法。
l 微軟討論區:
http://forums.asp.net/p/1466103/3382755.aspx
裡面提出用類似在ASP的做法,使用$("<%=ddlGroups.ClientID %>") or $("<%=ddlSubGroups.ClientID%>"),但是測試還是不行。
l 某位程式設計師的部落格
http://bibby.be/2008/03/masterpage-clientid.html
這位作者的想法就是在後端塞一個label並自行指定id,接著在後端註冊一個JavaScript function,其內容就是利用動態加入的label的clientID的取得被加料的字串,並加上原來的ControlID組成正確的ClientID。經測試有個問題,就是他是將方法註冊在Page上,而我們目前使用JavaScript都是寫在各自的js檔內,而js內的function叫用不到後端註冊的function。
l 藍色小舖
使用$("*[id$=_controlID]")或$("[id$=_controlID]"),經測試是可行的。
結論:
目前先請悅君採用第四個方法,先改jQuery的id的方式修改,若是本來用className做為selector的就不需要修改了。
補充:
在找資料的同時,也查到微軟將在.NET 4.0改善這種情況。
http://www.codeproject.com/KB/aspnet/ASP_NET4_0ClientIDFeature.aspx
就請大家敬請期待吧。