3.1_表單特效和程式架構
透過點選關閉按鈕,來關閉表單視窗的應用,來了解,點選按鈕時觸發事件的on、設定按鈕位置的css樣式、call()來指定this、config指定特效參數的應用。

透過點選關閉按鈕,來關閉表單視窗的應用,來了解,點選按鈕時觸發事件的on、設定按鈕位置的css樣式、call()來指定this、config指定特效參數的應用。


完成的範例效果

解說範例:點選按鈕,切換畫面,附加特效

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.00.32.71.jpg

透過init()來傳送指定的特效和速度

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.01.05.71.jpg

運行結果,緩慢淡入淡出的效果

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.01.12.71.jpg

看完完成的效果後,刪除寫好的javascript,一步步開始重做

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.01.23.71.jpg

有無開啟js,來做不同的樣式設定

在<html>中加入類別-js(用來區分使用者 的流覽器有無啟用javascript,以做不同程式判斷)

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.02.32.71.jpg

在google develper tool中檢測<html class="js">//只有有開啟javascript功能的流灠器會最用到此class,以區分有無開啟javascript,以做不同程式判斷

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.02.39.71.jpg

沒有開啟javascript的流覽器,樣式為#contact,有開啟的則為.js #content

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.02.53.71.jpg

物件init()設定

插入一個按鈕於第一個<article>的後面

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.05.06.71.jpg

運行結果,成功插入一個按鈕在第一個<article>後面

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.05.11.71.jpg

this.show的this指定的是contactForm這個物件

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.06.53.71.jpg

測式點按功能是否可運行

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.07.01.46.jpg

運行結果,戰選contactMe按鈕,成功console出showing的字串

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.07.05.50.jpg

解說為何寫成on('click',thos.show)而非
on('click',this.show())//因為希望點按後才執行show的函式,而非init時就立即執行

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.07.08.71.jpg

this的區分

這兒作者故意寫錯,是要你了解,this指的其實是執行click的<button>,而不是contactForm
//(注意)show()指的是jQuery的內建函式,而不是剛才自己寫的函式show

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.07.59.33.jpg

運行結果,錯誤訊息-Uncaught TypeError:Cannot call method 'show' of undefined//我們誤以為this指的是contactForm,所以出錯了

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.08.04.71.jpg

將this.container.show()改為contactForm.container.show();

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.08.52.33.jpg

運行結果,點選按鈕後,成功執行contactForm.container.show(),成功使隱藏的視窗出現

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.08.58.71.jpg

欄位的關閉(close())與顯示(show())

接下來新增一個函式-close(),用來插入一個關閉用的<span>X</span>。讓使用者點選時,可關閉#contact(那一個用來輸入使用者意見的那個視窗)

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.10.48.75.jpg

如果這樣寫的話,close()所用的this會是contactForm,而非contactForm.container,這不是我們要的效果

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.11.10.71.jpg

指定close()的this為contactForm.container,才會使close()呼叫指定的this為contactForm.container

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.11.46.58.jpg

運行結果,成功插入<span>X</span>

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.12.01.71.jpg

設定關閉用的按鈕的樣式

設定<span>X</span>的樣式,位置、大小、游標等

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.12.09.71.jpg

運行結果,點按<span>X</span>,就可關閉contact Me的視窗

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.12.25.71.jpg

自訂config設定特效

新增config物件,提供給使用者,設定要用何種特效的參數

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.13.01.71.jpg

舉例說明,可用的特效參數有,slideDown,slideUp,slideToggle,fadeIn,fadeOut,fadeToggle

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.13.28.71.jpg

解說變數contactForm.container,也可表達為contactForm['container']

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.14.09.71.jpg

contactForm.container.show()改為用特效顯示,可改為
contactForm.container.slideToggle()

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.14.26.54.jpg

套用config的變數,可寫成contactForm.container[contactForm.config.effect](500)//等同於
contactForm.container.slideToggle(500)

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.14.57.71.jpg

運行結果,點選按鈕Contact Me,畫面淡入淡出效果

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.15.01.21.jpg

on('click',function(){$this.hide();改為
.on('click',function(){$this[contactform.config.effect](500)

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.15.22.38.jpg

運行結果,點選<spanX</span>成功淡出畫面的效果

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.15.28.04.jpg

init()接收動畫和速度參數的config

提供給使用者輸入參數,供選擇動畫和速度

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.15.58.71.jpg

init:function(config){//接受參數供程式運作

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.16.03.71.jpg

解說$.extend的用法

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.16.34.71.jpg

運行結果,新增$.extend功能後,效果成功運作

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.17.16.71.jpg

將固定的參數改為config的可變變數

修改
contactForm.container[contactForm.config.effect](500);改為 contactForm.container[contactForm.config.effect](contactForm.config.speed);

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.17.58.71.jpg

運行結果,慢速特效成功運行

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.18.07.71.jpg

設定完成後,日後只要在此設定特效和速度即可

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.18.29.71.jpg

運行結果,成功運行特效

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.18.32.71.jpg

每次都要寫這麼長,contactForm.container太麻煩了,新增一變數cf來作為contactForm的簡寫。

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.19.26.71.jpg

運行結果,變數改短後,效果正常運行

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.19.31.71.jpg

判斷該tag的顯示狀況,來執行不同動作

要判斷container是否隱藏,以便判斷是否執行後續動作

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.20.28.71.jpg

運行結果,判斷功能正常運行

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.20.31.71.jpg

目前的問題是,每點選一次<span>X</span>便會多插入一次<span>

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.20.52.71.jpg

//新增判斷span.class是否存在
if($this.find('span.close').length) return;

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.22.04.17.jpg

運行結果,在develper tool中檢測,現在不會一直增加<span>了

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.22.13.71.jpg

call()、init()、$.extend()的應用

總結,此章學會了以下功能,如,設定參設定外部參數config,$.extend,運用call()來指定this

/images/coding-note/javascript/jQuery-30day/08.Effects-and-Structure/08.Effects-and-Structure-0.23.04.71.jpg