從has no method 'tmpl'談起
最近做一個相對比較功能專業化的應用系統,其中今天Leader提出的功能修改需求有點smart table的意思,其中有個界面修改由於用Dom操作太麻煩了,於是想用用很久之前在學習jQuery API中看到的js模板,這個東東好像目前在一些JS MVC實現中很流行。
1、第一次看到"has no method ‘tmpl‘"這個提示,G了一下,結果第一個結果英文帖子說tmpl不屬於jquery的核心內容,屬於插件,需要另外下載jquery-tmpl插件,據說這是微軟貢獻的開源插件,host在github上,下載地址:https://github.com/jquery/jquery-tmpl
2、把上面那個插件的min.js加載上,仍然函數不存在的提示,開始的時候以為是函數的調用方式有問題,於是采用插件文檔中的Demo寫法,仍然提示函數不存在,後來動腦袋想了想,發現了其中問題:由於我目前開發的模塊和網站整體的JS引用存在區別,所以目前模塊的JS引用沒有寫在foot.jsp裏,而是寫在side.jsp裏面,有些mainContent頁面裏面的JS代碼存在對庫的依賴問題,於是在mainContent前面部分,可能會重復地放某些JS庫文件,比如此處的jQuery.min.js,而我的tmpl.min.js由於只在這個頁面內用一下,於是放在mainContent.jsp中jquery.js引用的後面,而我的頁面整體布局采用的固定布局方式,sidebar雖然在mainContent的左面,但是采用負值maring-left的布局方式,side.jsp文件代碼實際頁面中是在mainContent的後面,導致我的tmpl.js實際是在兩個jquery.js的中間,tmpl給$對象添加的tmpl函數,在後面那個jQuery中又被重置了,所以找不到啊。Ok,這個提示的問題就此解決。同時稍微深入談一下JS加載依賴這個問題,其實如果所有JS裏面的函數都暴露在全局,不存在調用某個對象的函數屬性問題的話,前前後後都無所謂,因為是平行的,而且執行都是加載完的事件引發,依賴的是那部分,依賴的其實是那些在函數外面的代碼,也就是那部分在加載的時候就要執行的代碼,這些代碼之間才存在真正的依賴關系:也就是後面執行的代碼要依靠前面代碼的執行結果,這和靜態語言比如C之類的include是有區別的,C的include解決的是語言編譯時的引用依賴,而JS中的依賴實際是執行關系的依賴,說白了:後面的代碼用到了前面代碼的計算結果,而不是僅僅那麽一個引用標記。
3、前面那個問題算是解決了,下面講講其他幾個今天碰到的JS問題,先將講dblclick事件的綁定問題,白天在單位做的,那個時間CSDN博客訪問有問題,晚上回家寫,代碼也不在身邊,可能細節上不太全,有興趣的人湊活看吧,第一次實現的時候,用的就是最基本的方法,用元素on屬性解決的,我在Chrome下做的測試,結果上線以後,IE下基本無效,G了一下,發現IE和其他瀏覽器在這事件上語法不一樣,於是乎用jQuery的dblclick()方法綁定事件函數解決跨瀏覽器兼容問題,結果還發現另外一個問題,由於事件冒泡模型的區別,之前的事件處理函數在某些情況下會出現設定外的意外處理情況,於是乎用event.stopPropagation();解決了這個問題。
4、在後續的另外一個blur事件處理函數中,采用元素on屬性方式下,在IE中,jQuery語法的的event對象好像無效,event.target是個null,由於這個事件函數的target是動態添加的,於是用jQuery的live函數做了事件綁定處理,解決了event無效的問題,後來想了想,可能jQuery的event跨瀏覽器兼容要想生效,可能必須得用它的函數做事件綁定,否則它的闊瀏覽器處理可能插不進來。具體估計得看它的代碼才能確認。
5、button元素的Type屬性的默認值問題,昨天碰到預設的普通button在點擊之後,不但激發了click事件,在事件處理之後還自動提交了表單,好像之前碰到過這個問題,當時只是解決了,沒有思考問題原因,昨天我覺得可能是前面說的問題,但是只是加了明文的type屬性,沒有做確認,今天寫了段代碼試了一下,果然是啊,button元素在IE裏面的默認Type屬性值是button,在Chrome和Firefox裏面的默認屬性值是submit。所以用這個元素的時候,最好還是寫明其Type屬性值。
從has no method 'tmpl'談起