也是好久不寫博客了,確實懶了;想想應該把node.js的東西寫完整比較好,在抽時間吧;
這幾天在做阿里巴巴的一個頁面展示,里面設計到了一些js的問題,中途也遇到了一些幼稚的問題,
算是簡單記錄一下,以備查看
一、jquery 插件
里面涉及到了 滾動條的拖動以及圖片左右切換時的聯動問題,用到了jquey ui的簡單操作以及slidesJS插件;
為什么最終用到了jquery ui 和 slidesJS,因為個人覺得里面提供的api方法和事件,比較不錯,例如:
jquery ui 關於slider:
1 $( "#slider" ).slider({ 2 animate: false, 3 orientation: "horizontal", 4 range: false, 5 step:10, 6 min:0, 7 max:100, 8 value: 20, 9 start:function(event,ui){ 10 // console.log(ui.value); 11 }, 12 stop:function(event,ui){ 13 // console.log(ui.value); 14 }, 15 change:function(event,ui){ 16 //console.log(ui.value); 17 18 }, 19 20 });
slidesJS
1 $('#slides').slidesjs({ 2 width: 940, 3 height: 528, 4 start:1, 5 navigation: true, 6 callback: { 7 loaded: function(number) { 8 // Use your browser console to view log 9 console.log('SlidesJS: Loaded with slide #' + number); 10 11 // Show start slide in log 12 $('#slidesjs-log .slidesjs-slide-number').text(number); 13 }, 14 start: function(number) { 15 // Use your browser console to view log 16 console.log('SlidesJS: Start Animation on slide #' + number); 17 }, 18 complete: function(number) { 19 // Use your browser console to view log 20 console.log('SlidesJS: Animation Complete. Current slide is #' + number); 21 22 // Change slide number on animation complete 23 $('#slidesjs-log .slidesjs-slide-number').text(number); 24 } 25 } 26 });
這里就不詳細介紹了,具體可參考官網api說明
http://www.slidesjs.com/
http://api.jqueryui.com/slider/
當然,對於滑動條和左右按鈕實現聯動,是用了jquery ui slider中的change事件,
當觸發change事件時,實現左右按鈕的觸發,可是怎么判斷到底是左按鈕還是右按鈕呢,
后面想了想,其實是沒有辦法判斷當change的時候,觸發的是左還是右,
但是,用sliderJS的時候,它會生成一個類似幻燈片張數的數字,點擊第幾張跳轉到第幾張的東西(當然可以設置不顯示)
所以,當滑動條滑動change的時候,根據當前的value值,進行相應判斷觸動第幾張按鈕的事件,
從而實現了滑動條和左右按鈕的聯動
二、js函數的默認值以及event.target的兼容
也遇到了js function 參數默認值的問題,記得以前也遇到過此類問題,所以這次小小記錄一下
1 function foo(option1,option2){ 2 // todo 3 } 4 5 function foo(option1='foo',option1){ 6 //todo 7 } // 此種定義參數默認值的方式錯誤 8 9 function foo(option1,option2,...){ 10 option1=arguments[0] ? arguments[0] : 'foo'; 11 option2=arguments[1] ? arguments[1] : 'foo1'; 12 ... 13 } 14 15 function foo(option1,option2,...){ 16 option1=arguments[0] || 'foo'; 17 option2=arguments[1] || 'foo1'; 18 ... 19 } 20 21 function foo(){ 22 option1=arguments[0] ? arguments[0] : 'foo'; 23 option2=arguments[1] ? arguments[1] : 'foo1'; 24 ... 25 } 26 27 function foo(){ 28 option1=arguments[0] || 'foo'; 29 option2=arguments[1] || 'foo1'; 30 ... 31 }
所以,js中默認有個arguments的數組來保持參數的一一對應,當然函數中,不加參數也是正確的,
arguments會自動檢測傳遞過來的參數,所以后兩者方法也是正確的
關於event.target,其實自己以前也知道,只是這次也沒有太多的解決
event.target 的firefox等標准瀏覽器支持的,而IE瀏覽器相對應的是event.srcElement
所以好的兼容寫法是
1 var obj=event.srcElement ? event.srcElement : event.target; 2 3 //event.target以及event.srcElement還有很多可用屬性 4 5 event.target.id 6 event.target.text 7 event.target.name 8 event.target.parentNode.id 9 event.target.ChildNode[i].id 10 11 event.srcElement.id 12 event.srcElement.tagName 13 event.srcElement.type 14 event.srcElement.value 15 event.srcElement.name 16 event.srcElement.className 17 event.srcElement.parentElement.id 18 event.srcElement.getattribute 19 event.srcElement.firstChild 20 event.srcElement.firstChild 21 event.srcElement.children[i] 22 event.srcElement.ChildNode[i]
三、ajax的一些問題以及jquery1.9 live替代方法on
其實,最頭疼的問題,還是ajax的問題;
本來對方已經提供了得到數據的接口,
可是ajax請求過去就會涉及到跨域問題(本地不在接口域名下,也未提供相應的測試host配置等),但接口的結果返回,並未考慮跨域
所以只能想了一個,默認ajax得到了數據,然后根據數據的格式進行js代碼的邏輯實現;
實現完畢后,恢復ajax的代碼,交付客戶,運行,大體上還行,都可以正常運行,但是在IE瀏覽器中,就是不行,提供未定義;
因為ajax success后,把結果賦值給變量,現在提示變量未定義,而且只有IE是這樣,這就郁悶了,因為在本地無任何問題;
而且調試也很麻煩,必須改動代碼,服務器上讓對方替換文件,再看效果
對於這種 服務器上有問題,本地不能復現,不能本地調試,服務器無權限的問題,最是糾結了
后面經過和兄弟討論,覺得是否是js全局變量的問題,而且還提供了一種想法 - 代理實現 ,這樣就可以實現了和服務器一樣的環境,也方便了調試
其實代理就是:本地域名后台寫個請求,請求對方接口地址,得到數據,然后本地ajax請求本地后台文件得到數據,這樣就沒有了跨域的問題;
果真,試過之后,就可以實現了真實的服務器環境,方便了調試;
但是問題還是沒有解決,優化代碼后,服務器上還是相同的問題,這就納悶了,
本地經過代理得到數據沒有問題,可不經過代理,在正式環境,就得不到數據,
一時想不明白這兩點不同在哪里,自己本地只是實現了一個代理轉發的功能,其他都是一樣的
於是,就是一下午的糾結。。。
終於,在對方接口編寫者無意說到一個編碼的問題,因為我們也在溝通,剛開始我沒注意,后面終於明白了怎么回事
為什么其他瀏覽器都能得到數據,在IE瀏覽器中,就是undefined呢(也已經到success了,只是undefined)
我看到了這樣一篇文章,http://www.cnblogs.com/aNd1coder/archive/2012/12/22/2829172.html
終於明白了,是原始接口返回數據的編碼和ajax 請求參數過去的參數編碼不一致,導致了在IE中就是undefined的結果,
而經過一個本地的代理,代理的文件編碼以及數據、參數的編碼是一致的,所以本地是沒有問題的
1 $.ajax({ 2 url:'xxx', 3 type:'GET', 4 cache:false, 5 contentType:'text/html; charset=utf-8;', //統一前后端編碼為utf-8防止ie下返回undefined 6 success:function (result) {} 7 }); 8 9 //contentType,發送信息至服務器時內容編碼類型。默認值適合大多數情況。 10 //不用設置contentType也行,確保請求url的編碼一致也行
這真是一個大大的坑。。。
最后,關於jquery1.9之后,就廢棄了live方法,代替的是on方法
1 $("#div a").live('click',function(){ 2 3 }) 4 5 //替代成 6 7 $("#div").on('click','a',function(){ 8 9 }) 10 11 //或者 12 13 $(document).on('click','#div a',function(){ 14 15 })
具體可參考http://jquery.com/upgrade-guide/1.9/#live-removed