Professional Documents
Culture Documents
Ajax شروعی بر برنامه نویسی
Ajax شروعی بر برنامه نویسی
ﺗﺎﺑﺴﺘﺎن 1386
ﺗﺎﻟﻴﻒ و ﺗﺮﺟﻤﻪ:
M.Tavakoli.h@Gmail.com
ﻣﺤﻤﺪﻫﺎدي ﻗﻮﻣﻨﺠﺎﻧﻲ
HadiGhomanjani@Gmail.com
ﻓﺼﻞ اول :ﻣﻘﺪﻣﻪ اي ﺑﺮ 1.............................................................................................................. Ajax
راه ﺣﻞ 1 ................................................................................................................................................................................
دﻳﺪﮔﺎه ﻛﺎرﺑﺮان 2 ..................................................................................................................................................................
دﻳﺪﮔﺎه ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن 3 .......................................................................................................................................................
ﻧﮕﺎﻫﻲ ﻛﻠﻲ ﺑﻪ ﻣﺮاﺣﻞ اﺳﺘﻔﺎده از Ajaxدر ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب 5 ......................................................................
ﭼﻪ ﻛﺎرﻫﺎي را ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ Ajaxاﻧﺠﺎم دﻫﻴﺪ 6..........................................................................................................
ﻣﺰاﻳﺎي 9 ................................................................................................................................................................... Ajax
ﭼﺎﻟﺶ ﻫﺎي ﻓﻦ آوري 10 ...................................................................................................................................... Ajax
زﻣﺎﻧﻴﻜﻪ ﻧﺮم اﻓﺰارﻫﺎي ﺗﺤﺖ وب ) (Web Applicationsﺑﻪ دﻧﻴﺎي ﻧﺮم اﻓﺰار وارد ﺷﺪﻧﺪ ،ﻣﻮﺟﺐ ﻧﮕﺮﺷﻲ
ﺟﺪﻳﺪ در ﺗﻮﻟﻴﺪ ﻧﺮم اﻓﺰار ﺷﺪ .وﻳﮋﮔﻲ ﻫﺎي ﻛﻪ ﻣﻮﺟﺐ اﻳﺠﺎد اﻳﻦ روﻳﻜﺮد ﺟﺪﻳﺪ ﺷﺪ ﻋﺒﺎرﺗﻨﺪ از:
-ﻧﺮم اﻓﺰارﻫﺎي ﺗﺤﺖ وب ﺑﺮاي اﺟﺮا ﻧﻴﺎز ﺑﻪ ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﺧﺎﺻﻲ ﻧﺪارﻧﺪ.
ﺗﺎ آن روز اﺟﺮاي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﻋﺎﻣﻞ ﻫﺎي ﻣﺘﻔﺎوت ﻣﺴﺎﻟﻪ ﺑﺰرﮔﻲ ﺑﻮد وﻟﻲ ﻧﺮم اﻓﺰارﻫﺎي ﺗﺤﺖ وب
اﻳﻦ ﻣﺸﻜﻞ را ﻧﺪاﺷﺘﻨﺪ.
-ﻧﻴﺎز ﺑﻪ ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮي ﺑﺮاي اﺟﺮا ﻧﺪارﻧﺪ ،ﺗﻨﻬﺎ ﺑﺎ ﻳﻚ ﻣﺮورﮔﺮ ﺻﻔﺤﺎت وب ﻣﻲ ﺗﻮان از ﻧﺮم اﻓﺰار ،ﺑﺮ
روي ﻫﺮ ﺳﻴﺴﺘﻤﻲ اﺳﺘﻔﺎده ﻛﺮد.
-ﻧﻴﺎز ﺑﻪ اﻣﻜﺎﻧﺎت ﺧﺎص ﺳﺨﺖ اﻓﺰاري ﻧﺪارﻧﺪ و ﻓﻀﺎﻳﻲ از ﺳﻴﺴﺘﻢ ﻛﺎرﺑﺮان را ﻧﻴﺰ اﺷﻐﺎل ﻧﻤﻲ ﻛﻨﻨﺪ.
-ﺑﺮاﺣﺘﻲ ﺑﺮ روي اﻧﻮاع ﺷﺒﻜﻪ ﻫﺎي ﻣﺤﻠﻲ و ﺷﺒﻜﻪ اﻳﻨﺘﺮﻧﺖ ﻗﺎﺑﻞ اﺟﺮا ﻫﺴﺘﻨﺪ.
اﻣﺎ ﺑﺎ اﻳﻦ وﺟﻮد ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب)(Web Applicationsﻧﺘﻮاﻧﺴﺘﻨﺪ اﻳﻦ ﺟﺎﻳﮕﺎه را اﺳﺘﺤﻜﺎم ﺑﺨﺸﻨﺪ ،اﻣﺎ ﭼﺮا
...؟
ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻨﻜﻪ ﻣﺎﻫﻴﺖ اﻳﻨﺘﺮﻧﺖ ﺑﺼﻮرت synchronous request / responseﻣﻲ ﺑﺎﺷﺪ
ﻣﺤﺘﻮاي ﺻﻔﺤﺎت وب داﺋﻤﺎ در ﺣﺎل ﺗﻐﻴﻴﺮ ) (refreshﻣﻲ ﺑﺎﺷﺪ ،در واﻗﻊ ﻣﺤﻴﻂ ﻛﺎر ﻛﺎرﺑﺮ در ﺣﺎل ﺗﻐﻴﻴﺮ
اﺳﺖ در ﻧﺘﻴﺠﻪ ﻛﺎرﺑﺮان ﺗﻤﺎﻳﻠﻲ ﺑﻪ اﻳﻦ ﮔﻮﻧﻪ از ﻧﺮم اﻓﺰارﻫﺎ ﻧﺪارﻧﺪ.
ﻣﻌﻤﻮﻻ ﻛﺎرﺑﺮان ﻧﺮم اﻓﺰارﻫﺎ ،ﻋﻼﻗﻪ ي ﻧﺪارﻧﺪ ﻛﻪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﻳﻚ دﻛﻤﻪ زﻣﺎن اﻧﺘﻈﺎرﺷﺎن ﺑﺮاي اﻧﺠﺎم ﻋﻤﻠﻴﺎﺗﻲ
زﻳﺎد ﺑﺎﺷﺪ .اﻳﻦ ﻣﺴﺎﻟﻪ در ﻧﺮم اﻓﺰارﻫﺎي ﺗﺤﺖ وب ﻧﻤﻮد ﺑﻴﺸﺘﺮي دارد .زﻣﺎﻧﻴﻜﻪ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ
اﺣﺘﻤﺎﻻ اﻳﻦ ﻣﺴﺎﻟﻪ ﺑﺮاي ﺷﻤﺎ ﺧﺴﺘﻪ ﻛﻨﻨﺪه اﺳﺖ ﻛﻪ ﺑﺎ ﻫﺮ ﻛﻠﻴﻚ در ﺻﻔﺤﻪ ﺷﻤﺎ ﺑﺎﻳﺪ ﻣﻨﺘﻈﺮ ﻧﻤﺎﻳﺶ ﺻﻔﺤﻪ ي دﻳﮕﺮ
ﻳﺎ ﻧﻤﺎﻳﺶ ﻣﺠﺪد ﻫﻤﺎن ﺻﻔﺤﻪ ﺑﺎ ﺗﻐﻴﻴﺮاﺗﻲ ﺷﻮﻳﺪ .اﻳﻦ ﻣﺴﺎﻟﻪ ﻣﻬﻤﺘﺮﻳﻦ ﻣﻮﺿﻮﻋﻲ ﺑﻮد ﻛﻪ ﻣﻮﺟﺐ ﻛﻢ ﻓﺮوﻏﻲ Web
ﻣﻲ ﺷﺪ .از آن زﻣﺎن ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب Applicationدر ﺑﺮاﺑﺮ Desktop Application
ﻣﻌﺮوف ﺑﻪ word wide waitﺷﺪﻧﺪ.
راه ﺣﻞ
ﻳﻚ راه ﺣﻞ ﺳﺎده ﺑﺮاي اﻳﻦ ﻣﺴﺎﻟﻪ اﻳﻦ اﺳﺖ ﻛﻪ اﻓﺮاد در ﻳﻚ ﺻﻔﺤﻪ ﺑﺎﺷﻨﺪ و ﺑﺘﻮاﻧﻨﺪ ﻋﻤﻠﻴﺎت ﻣﻮرد ﻧﻈﺮ ﺧﻮد را در
ﻫﻤﺎن ﺻﻔﺤﻪ اﻧﺠﺎم دﻫﻨﺪ .ﺑﻄﻮر ﻣﺜﺎل در ﻳﻚ وب ﺳﺎﻳﺖ ﺧﺮﻳﺪ ﺑﺘﻮان ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي ﻫﺮ ﻳﻚ از ﻛﺎﻻﻫﺎي
ﻣﻮرد ﻧﻈﺮ آن را ﺑﻪ ﺳﺒﺪ ﺧﺮﻳﺪ ﺧﻮد اﺿﺎﻓﻪ ﻛﺮد ،ﺑﺪون اﻳﻨﻜﻪ ﻧﻴﺎز ﺑﻪ refreshﺷﺪن ﺻﻔﺤﻪ ﺑﺎﺷﺪ.
اﻳﻦ اﻳﺪه ﻫﻤﺎن ﭼﻴﺰي اﺳﺖ ﻛﻪ ﺑﻌﻨﻮان Ajaxﺷﻨﺎﺧﺘﻪ ﺷﺪه اﺳﺖ.
Ajaxﺗﻜﻨﻮﻟﻮژي اﺳﺖ ﻛﻪ اﻳﻦ اﻣﻜﺎن را ﻓﺮاﻫﻢ ﻣﻲ آورد ﻛﻪ Web Applicationﻣﺎﻧﻨﺪ Desktop
Applicationﻋﻤﻞ ﻛﻨﺪ .ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ ،اﻳﻨﻜﻪ ﻛﺎرﺑﺮ ،ﺑﺎر ﺷﺪن ) (loadﺻﻔﺤﻪ ﺟﺪﻳﺪ را در
ﻣﻘﺪﻣﻪ اي ﺑﺮ Ajax 2ﻓﺼﻞ 1
ﻣﺮورﮔﺮ ﺧﻮد ﻣﻲ ﺑﻴﻨﺪ ﻣﺸﻜﻞ ﺑﺰرﮔﻲ در ﺻﻔﺤﺎت وب اﺳﺖ Ajax ،ﺗﻮاﻧﺎﻳﻲ درﻳﺎﻓﺖ اﻃﻼﻋﺎت از ﺳﻤﺖ ﺳﺮور
را ﺑﺪون ﻧﻴﺎز ﺑﻪ ﺑﺎر ﺷﺪن ﻣﺠﺪد ) (reloadﺻﻔﺤﻪ ﻳﺎ ﺑﺎرﺷﺪن ﺻﻔﺤﻪ ﺟﺪﻳﺪ را داراﺳﺖ.
ﺑﺎ Ajaxﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب ﺑﺮاي ﻛﺎرﺑﺮان ﻣﺎﻧﻨﺪ ﻧﺮم اﻓﺰارﻫﺎي دﻳﮕﺮ ﻣﻲ ﺑﺎﺷﻨﺪ Ajax .اﻳﻦ ﺗﻮاﻧﺎﻳﻲ را ﺑﻪ
ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﻣﻲ دﻫﺪ ﻛﻪ ﻋﻤﻠﻴﺎت ارﺳﺎل اﻃﻼﻋﺎت و درﻳﺎﻓﺖ ﻧﺘﺎﻳﺞ را در ﭘﺸﺖ ﺻﺤﻨﻪ اﻧﺠﺎم دﻫﺪ ،اﻃﻼﻋﺎﺗﻲ ﻛﻪ
ﻧﻴﺎز دارد را از ﺳﻤﺖ ﺳﺮور درﻳﺎﻓﺖ و اﻃﻼﻋﺎت ﻣﺪ ﻧﻈﺮ را ﻧﻤﺎﻳﺶ دﻫﺪ.
ﺑﺮاي درك ﺑﻬﺘﺮي از ﭼﮕﻮﻧﮕﻲ ﻛﺎرﻛﺮد ،Ajaxآن را از دو دﻳﺪﮔﺎه ﺑﺮرﺳﻲ ﻣﻲ ﻛﻨﻴﻢ:
. 1دﻳﺪﮔﺎه ﻛﺎرﺑﺮان
.2دﻳﺪﮔﺎه ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن
دﻳﺪﮔﺎه ﻛﺎرﺑﺮان
ﺑﺮاي اﻳﻨﻜﻪ ﺑﻬﺘﺮ ﺑﺪاﻧﻴﺪ ﭼﮕﻮﻧﻪ Ajaxﻣﻮﺟﺐ ﻣﻲ ﺷﻮد ﻳﻚ Web Applicationﻣﺎﻧﻨﺪ ﻳﻚ Desktop
Applicationﻋﻤﻞ ﻛﻨﺪ ،اﻳﻦ ﻗﺴﻤﺖ را ﺑﺎ ﻳﻚ ﻣﺜﺎل ﺗﻮﺿﻴﺢ ﻣﻲ دﻫﻴﻢ.
ﻳﻚ وب ﺳﺎﻳﺖ ﺟﺴﺘﺠﻮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ .اﻳﻦ وب ﺳﺎﻳﺖ داراي ﻳﻚ textboxﺑﺮاي ﺗﺎﻳﭗ ﻛﺮدن ﻋﺒﺎرت
ﻣﻮرد ﻧﻈﺮ ﻛﺎرﺑﺮ و ﻳﻚ دﻛﻤﻪ ﺑﺮاي آﻏﺎز ﻋﻤﻠﻴﺎت ﺟﺴﺘﺠﻮ ﻣﻲ ﺑﺎﺷﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻳﻚ ﻋﺒﺎرﺗﻲ را ﻧﻮﺷﺘﻪ و
دﻛﻤﻪ ﺟﺴﺘﺠﻮ را ﻛﻠﻴﻚ ﻣﻲ ﻛﻨﺪ ﺻﻔﺤﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ reloadﻣﻲ ﺷﻮد ،اﻳﻦ در ﺣﺎﻟﻲ اﺳﺖ ﻛﻪ
در ﺑﺮﻧﺎﻣﻪ ﻫﺎي Desktop Applicationsﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ در ﻫﻤﺎن ﻓﺮم ﺟﺴﺘﺠﻮ ،ﺑﺪون ﺗﻐﻴﻴﺮ ﻓﺮم و ﺑﺎ
ﻛﻠﻴﻚ دﻛﻤﻪ ﺟﺴﺘﺠﻮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﺣﺎل ﺑﺎ ﺗﻜﻨﻮﻟﻮژي Ajaxﻣﻲ ﺗﻮان ﺻﻔﺤﻪ ﺟﺴﺘﺠﻮي وب ﺳﺎﻳﺖ را ﺑﻪ ﮔﻮﻧﻪ اي ﻃﺮاﺣﻲ ﻛﺮد ﺗﺎ ﻫﻨﮕﺎﻣﻲ ﻛﻪ
ﻋﺒﺎرت ﻣﻮرد ﻧﻈﺮ ﻧﻮﺷﺘﻪ و دﻛﻤﻪ ﺟﺴﺘﺠﻮ ﻛﻠﻴﻚ ﺷﻮد ﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ در ﻫﻤﺎن ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد) .ﻣﺎﻧﻨﺪ ﻳﻚ
ﻓﺮم ﺟﺴﺘﺠﻮ در ( Desktop Application
ﺑﺮاي ﻧﻤﻮﻧﻪ ﻣﻲ ﺗﻮان وب ﺳﺎﻳﺖ ﺟﺴﺘﺠﻮي http://www.A9.comرا ﻣﺜﺎل زد.
اﻳﻦ ﺳﺎﻳﺖ ﺟﺴﺘﺠﻮ ﻣﺘﻌﻠﻖ ﺑﻪ ﺳﺎﻳﺖ Amazon.comﻣﻲ ﺑﺎﺷﺪ .از وﻳﮋﮔﻲ ﻫﺎي اﻳﻦ ﺳﺎﻳﺖ ﻣﻲ ﺗﻮان ،ﺟﺴﺘﺠﻮ ﺑﺎ
ﺗﻜﻨﻮﻟﻮژي Ajaxو ﻗﺎﺑﻠﻴﺖ ﺟﺴﺘﺠﻮي ﻫﻤﺰﻣﺎن زﻣﻴﻨﻪ ﻫﺎي ﻣﺨﺘﻠﻒ ،را ﻧﺎم ﺑﺮد.
ﻓﺼﻞ 3 1 ﻣﻘﺪﻣﻪ اي ﺑﺮ Ajax
DOMﻳﻚ ﻣﺪل ﻛﻪ ﻧﺸﺎن دﻫﻨﺪه اﻳﻦ اﺳﺖ ﻛﻪ ﻳﻚ ﺻﻔﺤﻪ وب ﻣﺎﻧﻨﺪ ﻳﻚ ﻣﺠﻤﻮﻋﻪ از اﺷﻴﺎ ﺑﻪ ﻫﻢ ﻣﺮﺗﺒﻂ ﻣﻲ ﺑﺎﺷﺪ
ﻛﻪ اﻳﻦ اﺷﻴﺎ ﺑﻄﻮر ﭘﻮﻳﺎ ﻗﺎﺑﻞ ﺗﻐﻴﻴﺮ ﻣﻲ ﺑﺎﺷﻨﺪ ﺣﺘﻲ اﮔﺮ آن ﺻﻔﺤﻪ ﺗﻮﺳﻂ ﻛﺎرﺑﺮ داﻧﻠﻮد ﺷﺪه ﺑﺎﺷﺪ.
ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺷﻜﻞ 1-3ﻣﺸﺎﻫﺪه ﻣﻲ ﻧﻤﺎﻳﺪ ﻫﺮ زﻣﺎن ﻛﻪ درﺧﻮاﺳﺘﻲ از ﺳﻤﺖ ﻛﺎرﺑﺮ ﺻﻮرت ﭘﺬﻳﺮد اﻃﻼﻋﺎت
درﺧﻮاﺳﺖ ،ﺑﺼﻮرت ﻣﺴﻘﻴﻢ ﺑﻪ ﺳﻤﺖ ﺳﺮور ارﺳﺎل و در آن ﺟﺎ ﺑﻌﺪ از ﭘﺮدازش و درﺻﻮرت ﻧﻴﺎز ،ارﺗﺒﺎط ﺑﺎ ﺑﺎﻧﻚ
اﻃﻼﻋﺎﺗﻲ در ﻗﺎﻟﺐ ﻫﺎي Html/CSS/Image/JavaScriptﺑﻪ ﺳﻤﺖ ﻛﻼﻳﻨﺖ ارﺳﺎل ﻣﻲ ﺷﻮد.
ﻫﻤﺎن ﻃﻮر ﻛﻪ در ﺷﻜﻞ 1-5ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ در ﻫﻨﮕﺎم اﺗﺼﺎل ﺑﻪ ﺳﺮور در ﺳﻤﺖ ﺳﺮور ﻳﻚ sessionﺑﺮاي
ﻛﺎرﺑﺮ اﻳﺠﺎد ﺷﺪه و ﺗﺎ زﻣﺎن ﻗﻄﻊ ارﺗﺒﺎط ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ .زﻣﺎﻧﻴﻜﻪ ﻛﺎرﺑﺮ درﺧﻮاﺳﺖ ﺟﺪﻳﺪي را ﺑﻪ ﺳﻤﺖ ﺳﺮور
ارﺳﺎل ﻣﻲ ﻛﻨﺪ ﻳﻚ وﻗﻔﻪ ي در ﻛﺎر ﻛﺎرﺑﺮ رخ ﻣﻲ دﻫﺪ و ﻛﺎرﺑﺮ ﺑﺎﻳﺪ ﻣﻨﺘﻈﺮ ﺑﻤﺎﻧﺪ ﺗﺎ ﺻﻔﺤﻪ دﻳﮕﺮ از ﺳﻤﺖ ﺳﺮور
ارﺳﺎل ﺷﻮد.
در ﺷﻜﻞ ،1-6ﻫﺮ زﻣﺎن ﻛﺎرﺑﺮ درﺧﻮاﺳﺘﻲ را ﺑﻪ ﺳﻤﺖ ﺳﺮور ارﺳﺎل ﻣﻲ ﻛﻨﺪ ،در ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﺪه ﻫﻴﭻ ﺧﻠﻠﻲ اﻳﺠﺎد
ﻧﻤﻲ ﺷﻮد وﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﻫﻤﺰﻣﺎن از ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﺪه اﺳﺘﻔﺎده ﻧﻤﺎﻳﺪ.
ﺑﺨﺶ ﻫﺎي از Ajaxﻛﻪ ﻣﻄﺮح ﺷﺪ ،ﻗﺴﻤﺖ ﻫﺎي ﻫﺴﺘﻨﺪ ﻛﻪ در ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﻗﺮار دارﻧﺪ اﻣﺎ ﻳﻚ ﻗﺴﻤﺖ ﻣﻬﻢ
در Ajaxوﺟﻮد دارد ﻛﻪ در ﺳﻤﺖ ﺳﺮور ﻣﻲ ﺑﺎﺷﺪ .ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ داده ﻫﺎ در ﺳﺮور ﻧﻴﺎز ﺑﻪ ﻛﺪﻫﺎي در ﺳﻤﺖ
ﺳﺮور ﻣﻲ ﺑﺎﺷﺪ ﻣﺎﻧﻨﺪ ASP ،PHPو ...اﻟﺒﺘﻪ اﻳﻦ ﺑﺨﺶ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﻣﻌﻤﻮل وب ﻧﻴﺰ ﻻزم اﺳﺖ.
Chat-3
ﺑﻪ دﻟﻴﻞ اﻳﻨﻜﻪ Ajaxﻧﺴﺒﺖ ﺑﻪ ﺻﻔﺤﺎت وﺑﻲ ﻛﻪ refreshﻣﻲ ﺷﻮﻧﺪ ﺑﺮﺗﺮي دارد ،اﻧﺘﺨﺎب ﻣﻨﺎﺳﺒﻲ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ
ﻫﺎي ﭘﻴﺎم رﺳﺎﻧﻲ ﻓﻮري ) (Chatوب ﻣﻲ ﺑﺎﺷﺪ.
ﻣﺜﺎﻟﻲ از اﻳﻦ را در ﺳﺎﻳﺖ زﻳﺮ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ.
www.plasticshore.com/project/chat
در اﻳﻦ ﮔﻮﻧﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﺷﻤﺎ ﻣﺘﻦ ﺧﻮد را ﺗﺎﻳﭗ ﻛﺮده و دﻛﻤﻪ ارﺳﺎل را ﻛﻠﻴﻚ ﻣﻲ ﻛﻨﻴﺪ ،ﭘﻴﺎم ﺑﻪ ﺳﺮور ارﺳﺎل
ﻣﻲ ﺷﻮد و ﺑﻌﺪ ﺑﺮاي ﻣﺨﺎﻃﺐ ارﺳﺎل ﻣﻲ ﺷﻮد ﺑﺪون اﻳﻨﻜﻪ ﺻﻔﺤﻪ ﺷﻤﺎ و ﻣﺨﺎﻃﺐ refreshﺷﻮد.
ﻣﺜﺎﻟﻲ دﻳﮕﺮ را ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺳﺎﻳﺖ زﻳﺮ ﻣﺸﺎﻫﺪه ﻧﻤﺎﻳﺪ.
http://treehouse.ofb.net/chat/?long=en
ﻫﻤﭽﻨﻴﻦ radiusIMﻳﻚ ﻧﻤﻮﻧﻪ دﻳﮕﺮ از ﺳﺎﻳﺖ ﻫﺎي chatاﺳﺖ ﻛﻪ درﻃﺮاﺣﻲ آن از google Mapﻧﻴﺰ
اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ.
-5ﺑﺎزي ﺑﺎ Ajax
ﻳﻚ ﺑﺎزي ﻣﺎﻧﻨﺪ ﺷﻄﺮﻧﺞ را در ﺻﻔﺤﻪ وب در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ،اﮔﺮ ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺷﻤﺎ ﻣﻬﺮه ي را ﺣﺮﻛﺖ ﻣﻲ دﻫﻴﺪ
ﺻﻔﺤﻪ ﺑﺮاي ارﺳﺎل ﻣﻮﻗﻌﻴﺖ ﺟﺪﻳﺪ ﻣﻬﺮه ﺑﻪ ﺳﺮور دوﺑﺎر ﺑﺎرﮔﺬاري ﺷﻮد اﻳﻦ ﺑﺎزي ﺧﻴﻠﻲ ﺧﺴﺘﻪ ﻛﻨﻨﺪه ﻣﻲ ﺷﻮد.
ﺣﺎل اﮔﺮ اﻳﻦ ﺑﺎزي ﺑﺎ Ajaxﺑﺎﺷﺪ ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺎ ﺳﺮور ﺑﺮاﺣﺘﻲ و ﺑﺪون ﺑﺎرﮔﺬاري ﻣﺠﺪد ﺻﻔﺤﻪ ،ﺑﺎزي ﻛﻨﻴﺪ.
ﻓﺼﻞ 9 1 ﻣﻘﺪﻣﻪ اي ﺑﺮ Ajax
ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajaxﺑﻪ ﻋﻠﺖ ﺗﺒﺎدل ﺣﺠﻢ داده ﻛﻢ ﺑﻴﻦ ﺳﺮور و ﻛﻼﻳﻨﺖ ﺗﺮاﻓﻴﻚ ﺷﺒﻜﻪ را ﻛﺎﻫﺶ ﻣﻲ دﻫﻨﺪ و
ﺳﺮﻋﺖ اﺟﺮا را ﺑﺎﻻ ﻣﻲ ﺑﺮدﻧﺪ.
ﻧﻜﺘﻪ ﻣﻬﻢ دﻳﮕﺮ اﻳﻦ اﺳﺖ ﻛﻪ در ﻣﻮرد Ajaxﺷﻤﺎ ﻧﻴﺎز ﺑﻪ ﻳﺎدﮔﻴﺮي زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺟﺪﻳﺪي ﻧﻴﺴﺘﻴﺪ.
ﭼﺎﻟﺶ ﻫﺎي ﻓﻦ آوري Ajax
ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺻﻔﺤﺎت ﺑﻪ ﺳﺒﻚ Ajaxداراي ﭼﺎﻟﺶ ﻫﺎي ﻣﺘﻌﺪدي اﺳﺖ :
-ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد در ﺻﻔﺤﺎت وب ﻣﻲ ﺑﺎﻳﺴﺖ ﻣﺘﻨﺎﺳﺐ ﺑﺎ ﺷﺮاﻳﻂ ﻫﺮ ﻣﺮورﮔﺮ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﮔﺮدﻧﺪ ،ﭼﺮاﻛﻪ ﻫﺮ
ﻣﺮورﮔﺮ ﻳﻚ ﻧﺴﺨﻪ ﻣﺘﻔﺎوت از DOMو DHTMLرا اراﺋﻪ ﻣﻲ ﻧﻤﺎﻳﻨﺪ)ﻫﺮ ﭼﻨﺪ اﻳﻦ ﺗﻔﺎوت ﻫﺎ اﻧﺪك ﺑﺎﺷﺪ( .
-ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﺻﺮﻓﺎ ﺑﺎ اﺳﺘﻔﺎده از ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﻧﺠﺎم ﻣﻲ ﺷﻮد .ﭘﻴﺎده ﺳﺎزي ﺑﺮﺧﻲ از ﺑﺨﺶ ﻫﺎي
Ajaxﻣﻲ ﺗﻮاﻧﺪ ﺑﺮاي ﭘﻴﺎده ﻛﻨﻨﺪﮔﺎن ﺑﺴﻴﺎر ﭘﻴﭽﻴﺪه ﺑﺎﺷﺪ و ﻧﻴﺎزﻣﻨﺪ داﻧﺶ ﺑﺎﻻﺋﻲ در ﺧﺼﻮص اﺳﺘﻔﺎده از
ﺟﺎوااﺳﻜﺮﻳﺖ ﺑﺎﺷﺪ.
-ﺟﺎوا اﺳﻜﺮﻳﭙﺖ ،وﻳﮋﮔﻲ ﻫﺎ و اﻣﻜﺎﻧﺎت ﻣﻮرد ﻧﻴﺎز ﭘﻴﺎده ﻛﻨﻨﺪﮔﺎن ﺑﺮﻧﺎﻣﻪ ﻫﺎي دات ﻧﺖ را ﺗﺎﻣﻴﻦ ﻧﻤﻲ ﻧﻤﺎﻳﺪ ) ﻧﻈﻴﺮ
ﻳﻚ روﻳﻜﺮد ﺷﻲ ﮔﺮاء ﻛﺎﻣﻞ ( .ﻋﻼوه ﺑﺮ اﻳﻦ ،در اﻳﻦ ﻓﻦ آوري از ﻛﺘﺎﺑﺨﺎﻧﻪ اي ﻧﻈﻴﺮ آﻧﭽﻪ در ﭘﻠﺖ ﻓﺮم دات ﻧﺖ
اراﺋﻪ ﺷﺪه اﺳﺖ ،اﺳﺘﻔﺎده ﻧﻤﻲ ﮔﺮدد و ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﻣﻲ ﺑﺎﻳﺴﺖ ﺗﻤﺎﻣﻲ ﺑﺮﻧﺎﻣﻪ را از اﺑﺘﺪا ﻛﺪ ﻧﻤﺎﻳﻨﺪ.
-ﺟﺎوااﺳﻜﺮﻳﭙﺖ و ﭘﻴﺎده ﺳﺎزي ﺳﻤﺖ ﻛﻼﻳﻨﺖ ،ﻋﻤﻮﻣﺎ ﺑﺨﻮﺑﻲ در ﻣﺤﻴﻂ ﻫﺎي ﻳﻜﭙﺎرﭼﻪ ﺗﻮﺳﻌﻪ) (IDEsﺣﻤﺎﻳﺖ
ﻧﻤﻲ ﮔﺮدﻧﺪ.
ﺑﻌﻨﻮان ﺳﺨﻦ آﺧﺮ Ajax:ﺗﻜﻨﻮﻟﻮژي ﻧﻴﺴﺖ ﻛﻪ ﺟﺪﻳﺪ ﻛﺸﻒ ﺷﺪه ﺑﺎﺷﺪ ،ﺷﻲ XMLHttpRequestاز زﻣﺎن
IE5ﻋﺮﺿﻪ ﺷﺪه ﺑﻮد وﻟﻲ ﭼﻮن دﻳﮕﺮ ﻣﺮورﮔﺮﻫﺎ از آن ﭘﺸﺘﻴﺒﺎﻧﻲ ﻧﻤﻲ ﻛﺮدﻧﺪ Ajax ،ﻧﺎﺷﻨﺎﺧﺘﻪ ﻣﺎﻧﺪه ﺑﻮد.
ﻓﺼﻞ 11 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
در اواﻳﻞ ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﺑﻴﺸﺘﺮ ﺟﻬﺖ ﻧﻤﺎﻳﺶ و اراﺋﻪ ﻣﻄﺎﻟﺐ ﺑﻮدﻧﺪ اﻣﺎ ﺑﻌﺪ از ﮔﺴﺘﺮش وب ﻃﺮاﺣـﺎن ﻣـﻲ ﺧﻮاﺳـﺘﻨﺪ
ﺑﺘﻮاﻧﻨﺪ ﺑﺮ روي ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﻣﺎﻧﻨﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﻛﻨﺘﺮل داﺷﺘﻪ ﺑﺎﺷﻨﺪ .اﻣﺎ ﻳﻚ ﻣﺸﻜﻞ وﺟﻮد داﺷـﺖ و آن ﻫـﻢ
اﻳﻦ ﻛﻪ در زﺑﺎن Htmlدﺳﺘﻮرات ﻛﻨﺘﺮﻟﻲ و ﺣﻠﻘﻪ ﻫﺎي ﺗﻜﺮار وﺟﻮد ﻧﺪاﺷﺖ .ﺑﺮاي ﺣﻞ اﻳـﻦ ﻣـﺸﻜﻞ زﺑـﺎﻧﻲ ﺑـﻪ ﻧـﺎم
JavaScriptﻋﺮﺿﻪ ﺷﺪ.
SunوNetscape زﺑـــﺎن JavaScriptﻣﺤـــﺼﻮﻟﻲ ﻣـــﺸﺘﺮك از دو ﺷـــﺮﻛﺖ Microsystem
Communicationsﻣﻲ ﺑﺎﺷﺪ .ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻳﻚ زﺑﺎن ﻣﻔﺴﺮي اﺳﺖ و ﻣﻔﺴﺮﻫﺎي دﺳﺘﻮري آن ﻣﺮورﮔﺮﻫـﺎي
وﺑﻲ ﻫﺴﺘﻨﺪ ﻛﻪ از ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ) .ﻣﻔﺴﺮ ﺑﺮﻧﺎﻣﻪ ي اﺳﺖ ﻛﻪ ﻛـﺪﻫﺎي ﻧﻮﺷـﺘﻪ ﺷـﺪه ﺗﻮﺳـﻂ ﺑﺮﻧﺎﻣـﻪ
ﻧﻮﻳﺲ را ﺑﺮاﺳﺎس ﮔﺮاﻣﺮ ﻫﻤﺎن زﺑﺎن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺗﺮﺟﻤﻪ ﻛﺮده و دﺳﺘﻮرات را اﺟﺮا ﻣﻲ ﻛﻨﺪ (.ﻳﻌﻨﻲ وﻗﺘـﻲ ﻛـﺪﻫﺎي
ﻧﻮﺷﺘﻪ ﺷﺪه ﺗﻮﺳﻂ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺗﻮﺳﻂ ﻣﺮورﮔﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد ،اﻳﻦ ﻛﺪﻫﺎ ﺗﻮﺳﻂ ﻣﻔـﺴﺮ ﺟﺎوااﺳـﻜﺮﻳﭙﺘﻲ ﻛـﻪ در
آن ﺗﻌﺒﻴﻪ ﺷﺪه ،ﺗﺮﺟﻤﻪ ﻣﻲ ﮔﺮدد و ﺣﺎﺻﻞ اﻳﻦ ﺗﺮﺟﻤﻪ ﺑﻪ ﻛﺎرﺑﺮ اراﺋﻪ ﻣﻲ ﺷﻮد.
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻫﻤﺎن ﻃﻮرﻛﻪ از ﻧﺎﻣﺶ ﭘﻴﺪاﺳﺖ ﻳﻚ زﺑﺎن اﺳﻜﺮﻳﭙﺘﻲ اﺳﺖ .ﻳﻌﻨﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﻲ ﻛﻪ ﺗﻮﺳـﻂ آن ﻧﻮﺷـﺘﻪ
ﻣﻲ ﺷﻮﻧﺪ ﻣﺘﻦ ﺳﺎده ﻫﺴﺘﻨﺪ ) ( text only documentsو ﺗﻮﺳﻂ ﻫـﺮ وﻳﺮاﻳـﺸﮕﺮي ﻛـﻪ ﺑﺘﻮاﻧـﺪ ﻣـﺘﻦ ﺳـﺎده
اﻳﺠﺎد ﻛﻨﺪ ﻗﺎﺑﻞ وﻳﺮاﻳﺶ و ﻣﺸﺎﻫﺪه ﻫﺴﺘﻨﺪ .ﻣﺘﺪاول ﺗﺮﻳﻦ و ﺳﺎده ﺗﺮﻳﻦ آن ﻫﺎ ،وﻳﺮاﻳﺸﮕﺮ NotePadاﺳـﺖ ﻛـﻪ در
ﺗﻤﺎﻣﻲ ﻧﺴﺨﻪ ﻫﺎي وﻳﻨﺪوز وﺟﻮد دارد.
ﺟﺎوااﺳﻜﺮﻳﭙﺖ داراي دو ﺑﺨﺶ اﺳﺎﺳﻲ ﻣﻲ ﺑﺎﺷﺪ:
-ﻛﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ در ﺳﻤﺖ ﺳﺮور.
-ﻛﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ در ﺳﻤﺖ ﻛﻼﻳﻨﺖ.
ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ در ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﺑﻴﺸﺘﺮ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ اﻣﺎ ﭼﺮا...؟
ﺷﻤﺎ ﺑﺎ ﻛﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺮاﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ روي ﻫﺮ ﺷﻲ داﺧـﻞ ﺻـﻔﺤﻪ وب ﻛﻨﺘـﺮل داﺷـﺘﻪ ﺑﺎﺷـﻴﺪ .ﻣـﻲ ﺗﻮاﻧﻴـﺪ
ﺑﺴﻴﺎري از ﻋﻤﻠﻴﺎت اﺟﺮاﻳﻲ ﺑﺮﻧﺎﻣﻪ ﺧﻮد در ﺳﻤﺖ ﻛﻼﻳﻨﺖ اﺟﺮا ﻛﻨﻴﺪ در اﻳﻦ ﺻﻮرت ﻫﻢ ﺳﺮﻋﺖ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻫـﺎي
وب ﺷﻤﺎ ﺑﻴﺸﺘﺮ ﺷﺪه و ﻫﻢ از ﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﻴﻬﻮده ﻣﺎﺑﻴﻦ ﻛﻼﻳﻨﺖ و ﺳﺮور ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﻴﺪ.
ﺑﻄﻮر ﻣﺜﺎل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮرﺳﻲ ﺻﺤﺖ ﮔﺮاﻣﺮي اﻃﻼﻋﺎﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ ﻣﻲ ﺧﻮاﻫﺪ ﺑﺮاي ﺷﻤﺎ ارﺳﺎل ﻛﻨـﺪ را در ﻛﻼﻳﻨـﺖ
ﭼﻚ ﻛﻨﻴﺪ) .اﮔـﺮ اﻃﻼﻋـﺎت ﻋـﺪدي ﺑﺎﻳـﺪ ارﺳـﺎل ﺷـﻮد دﻳﮕـﺮ اﻃﻼﻋـﺎﺗﻲ ﺑـﺎ ﻓﺮﻣـﺖ رﺷـﺘﻪ ارﺳـﺎل ﻧـﺸﻮد (.ﻗـﺪرت
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﻪ ﻧﮕﺎه روﻳﺪادي) (Eventاﻳﻦ زﺑﺎن اﺳﺖ .اﻳﻦ ﺧﺼﻴﺼﻪ ﻣﻮﺟﺐ ﺗﻌﺎﻣﻞ ﺑﻴﺸﺘﺮ ﺑـﻴﻦ ﺑﺮﻧﺎﻣـﻪ وﻛـﺎرﺑﺮ
ﻣﻲ ﺷﻮد .ﺑﻪ ازاي ﻫﺮ ﻋﻤﻠﻴﺎﺗﻲ ﻛﻪ ﻛﺎرﺑﺮ در ﺑﺮﻧﺎﻣﻪ وب اﻧﺠﺎم دﻫﺪ )ﻓﺸﺮدن دﻛﻤﻪ ،ﺣﺮﻛﺖ ﻣﻮس ،ﺗﺎﻳـﭗ ﻣـﺘﻦ و (....
ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﺗﻮاﻧﺪ ﻋﻜﺲ اﻟﻌﻤﻞ ﻧﺸﺎن دﻫﺪ وﻋﻤﻠﻴﺎت ﺧﺎﺻﻲ را اﺟﺮا ﻛﻨﺪ .ﺑﺮﺧﻲ دﻳﮕﺮ از ﺧﺼﻮﺻﻴﺖ ﻫـﺎي اﻳـﻦ زﺑـﺎن
ﻋﺒﺎرﺗﻨﺪ از:
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 12ﻓﺼﻞ 2
ﺑﺮاي ﻣﻘﺪار javascriptﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﺴﺨﻪ آن را ﻫﻢ ﺗﻌﻴـﻴﻦ ﻛﻨﻴـﺪ .ﺟﺎوااﺳـﻜﺮﻳﭙﺖ ﻣﺎﻧﻨـﺪ HTMLداراي ﻧـﺴﺨﻪ
ﻫﺎي ﻣﺨﺘﻠﻔﻲ اﺳﺖ ﻛﻪ ﻫﺮ ﻛﺪام آن ﻫﺎ ﺑﺎ ﻗﺎﺑﻠﻴﺘﻬﺎي ﺟﺪﻳﺪي در وب ﺗﻮﺳﻌﻪ ﻳﺎﻓﺘﻨﺪ .ﻧﺴﺨﻪ ﻫـﺎي اﻳـﻦ زﺑـﺎن ﻋﺒـﺎرت از
1.4 ،1.3 ،1.2 ،1.1 ،1.0و 1.5اﺳﺖ .ﻣﺮورﮔﺮ IEاز ﻧﺴﺨﻪ ﻫﺎي 1.4و 1.5اﻳﻦ زﺑﺎن ﭘـﺸﺘﻴﺒﺎﻧﻲ ﻧﻤـﻲ
ﻛﻨﺪ.
ﺧﺎﺻﻴﺖ type
ﺗــــﮓ > <scriptﺧﺎﺻــــﻴﺖ typeﻫــــﻢ دارد ﻛــــﻪ ﺑــــﺮاي ﺟﺎوااﺳــــﻜﺮﻳﭙﺖ ﺑﺎﻳــــﺪ آن را ﺑﺮاﺑــــﺮ ﺑــــﺎ
text/javascriptﻗﺮار دﻫﻴﺪ .ﻧﻜﺘﻪ ﻗﺎﺑﻞ ﺗﻮﺟﻪ اﻳﻦ اﺳﺖ ﻛﻪ اﮔـﺮ اﻳـﻦ ﺧﺎﺻـﻴﺖ را ﺑـﻪ ﺗـﮓ><script
اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،ﻣﺮورﮔﺮ اﻳﻨﺘﺮﻧﺖ اﻛﺴﭙﻠﻮرر ﻧﺴﺨﻪ 1.4و 1.5اﻳﻦ زﺑﺎن را اﺟﺮا ﻣﻲ ﻛﻨﺪ .از ﻳﻚ وﻳﺮاﻳﺸﮕﺮ ﻣﺘﻦ ﻣﺎﻧﻨﺪ
ﺑﺮﻧﺎﻣﻪ Notepadاﺳﺘﻔﺎده ﻛﺮده و ﻛﺪ زﻳﺮ را در آن وارد ﻛﻨﻴﺪ:
><html
><head
><title> My JavaScript </title
></head
><body
>"<script language="javascript1.5" type="text/javascript
)"document.write("Hello designers and developers.
></script
ﻓﺼﻞ 13 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
></body
></html
اﻛﻨﻮن اﻳﻦ ﻓﺎﻳﻞ را ﺑﺎ ﭘﺴﻮﻧﺪ htmlذﺧﻴـﺮه ﻛﻨﻴـﺪ و ﺳـﭙﺲ آن را در ﻣﺮورﮔـﺮ اﻳﻨﺘﺮﻧـﺖ اﻛـﺴﭙﻠﻮرر اﺟـﺮا ﻛﻨﻴـﺪ ﻛـﻪ
ﻣﻮﺟﺐ ﻧﻤﺎﻳﺶ ﺟﻤﻠﻪ Hello designers and developers.در ﺻﻔﺤﻪ ﻣﻲ ﺷﻮد .ﺣـﺎل ﺧﺎﺻـﻴﺖ
typeرا ﺣﺬف ﻛﻨﻴﺪ و دوﺑﺎره ﻓﺎﻳﻞ را ذﺧﻴﺮه و ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ،ﻫﻴﭻ ﻣﺘﻨﻲ در ﺻﻔﺤﻪ ﻣﺸﺎﻫﺪه ﻧﻤﻲ ﺷﻮد ﻛﻪ ﺑﺎ ﺗﻐﻴﻴـﺮ
ﻧﺴﺨﻪ 1.5ﺑﻪ 1.3آن ﻣﺘﻦ دوﺑﺎره ﻧﻤﺎﻳﺎن ﺧﻮاﻫﺪ ﺷﺪ .ﻧﻮﺷﺘﻦ ﻧﺴﺨﻪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﺟﺒﺎري ﻧﻴﺴﺖ ﻳﻌﻨﻲ ﻣﻲ ﺗﻮاﻧﻴـﺪ
آن را ﻧﻨﻮﻳﺴﻴﺪ .ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻓﻘﻂ از ﺧﺎﺻﻴﺖ typeاﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺧﺎﺻﻴﺖ languageرا ﻧﻨﻮﻳﺴﻴﺪ.
><html
><head
><title> My JavaScript </title
></head
><body
>"<script language="javascript
)"document.write("Hello designers and developers.
></script
></body
></html
ﺧﺎﺻﻴﺖ src
ﺗﮓ scriptﻳﻚ ﺧﺎﺻﻴﺖ دﻳﮕﺮ ﻫﻢ دارد ﻛـﻪ srcاﺳـﺖ .اﻳـﻦ ﺧﺎﺻـﻴﺖ ﺑـﺮاي آدرس دﻫـﻲ اﺳـﺖ .ﻛـﺪﻫﺎي
ﺟﺎوااﺳﻜﺮﻳﭙﺖ را ﻣﻲ ﺗﻮاﻧﻴﺪ در ﻳﻚ ﻓﺎﻳﻞ ﺟﺪاﮔﺎﻧﻪ ﻧﻮﺷـﺘﻪ و ﺑـﺎ ﭘـﺴﻮﻧﺪ jsذﺧﻴـﺮه ﻛﻨﻴـﺪ ﺳـﭙﺲ ﺑـﺎ ﺧﺎﺻـﻴﺖ src
آدرس آن ﻓﺎﻳﻞ را ﻣﺸﺨﺺ ﻛﻨﻴﺪ .ﺗﻮﺟﻪ داﺷـﺘﻪ ﺑﺎﺷـﻴﺪ ﻛـﻪ در آن ﻓﺎﻳـﻞ ﻧﺒﺎﻳـﺪ دﻳﮕـﺮ ﺗـﮓ scriptرا ﺑﻨﻮﻳـﺴﻴﺪ.
ﻣﻌﻤﻮﻻ در اﻳﻦ ﺣﺎﻟﺖ ﺗـﮓ اﺳـﻜﺮﻳﭙﺖ در ﻗـﺴﻤﺖ headﺻـﻔﺤﻪ ﮔﻨﺠﺎﻧـﺪه ﻣـﻲ ﺷـﻮد ﺗـﺎ ﺑـﺎ ﺷـﺮوع ﺻـﻔﺤﻪ ﻓﺎﻳـﻞ
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد.
><html
><head
>"<script type="text/javascript" src="\example1.js
></script
></head
></html
ﺣﺎل ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﺮرﺳﻲ ﻛﻨﻴﻢ ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ را در ﻛﺪام ﻗﺴﻤﺖ از ﺻﻔﺤﻪ وب ﺑﻨﻮﻳﺴﻴﻢ؟
ﻧﻮﺷﺘﻦ اﺳﻜﺮﻳﭙﺖ در ﻗﺴﻤﺖ head
اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺗﺎ ﻳﻚ ﻛﺪ اﺳﻜﺮﻳﭙﺖ ﻗﺒﻞ از ﺑﺎرﺷﺪن ﺻﻔﺤﻪ اﺟﺮا ﺷﻮد ﻳﺎ ﻛﺪﻫﺎ را ﻫﺮ زﻣـﺎن ﻧﻴـﺎز دارﻳـﺪ ﻓﺮاﺧـﻮاﻧﻲ
ﻛﻨﻴﺪ،آن ﻫﺎ را ﻣﺎﺑﻴﻦ ﺗﮓ headﺑﻨﻮﻳﺴﻴﺪ .ﺑﻄﻮر ﻣﺜﺎل ﺷﻤﺎ ﻧﻴﺎز ﺑﻪ اﻳﻦ دارﻳﺪ ﻛﻪ ﺑﻪ ﻣﺤﺾ ورود ﻛﺎرﺑﺮ ﺑﻪ ﺻـﻔﺤﻪ در
ﻫﻤﺎن اﺑﺘﺪا ﭘﻴﻐﺎﻣﻲ ﻇﺎﻫﺮ ﺷﻮد .ﺑﻪ ﻛﺪﻫﺎي اﻳﻦ ﻣﺜﺎل ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
><html
><head
><title> My JavaScript </title
>"<script type="text/javascript
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 14ﻓﺼﻞ 2
><body> </body
></html
ﻗﺒﻞ از ﺑﺎرﺷﺪن ﻛﺎﻣﻞ ﺻﻔﺤﻪ در ﻣﺮورﮔﺮ ،ﭘﻴﻐﺎﻣﻲ درﻳﻚ ﺟﻌﺒﻪ ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
alert() -ﻳﻚ ﺗﺎﺑﻊ ﻣﻔﻴﺪ در ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﺳﺖ اﻳﻦ ﺗﺎﺑﻊ ﻳـﻚ رﺷـﺘﻪ را ﺑﻌﻨـﻮان ﭘـﺎراﻣﺘﺮ درﻳﺎﻓـﺖ و آن را در
ﻳﻚ ﺟﻌﺒﻪ ﭘﻴﻐﺎم ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
ﻧﻮﺷﺘﻦ اﺳﻜﺮﻳﭙﺖ در ﻗﺴﻤﺖ body
اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺗﺎ ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻫﻨﮕﺎم ﺑﺎر ﺷﺪن ﺻﻔﺤﻪ اﺟﺮا ﺷـﻮﻧﺪ آن ﻫـﺎ را در ﻗـﺴﻤﺖ bodyﺻـﻔﺤﻪ
وارد ﻛﻨﻴﺪ .دﻗﺖ ﻛﻨﻴﺪ ﺷﻤﺎ ﺑﺮاي اﺳﺘﻔﺎده از ﺗﮓ > <scriptدر ﺻﻔﺤﻪ ﻣﺤﺪودﻳﺘﻲ ﻧﺪارﻳﺪ.
><html
><head></head
><body
>"<script type="text/javascript
// javascript codes here
></script
></body
></html
ﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻮﺳﻂ ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻗﺴﻤﺘﻲ از ﻳﻚ ﺻﻔﺤﻪ را اﻳﺠﺎد ﻛﻨﻴﺪ ﻳﻌﻨﻲ ﺑﺎ ﺗﺮﻛﻴﺐ ﺟﺎوااﺳـﻜﺮﻳﭙﺖ
و ﺗﮓ ﻫﺎي htmlدر bodyﻳﻚ ﻋﻨﺼﺮ در ﺻﻔﺤﻪ اﻳﺠﺎد ﻛﻨﻴﺪ.
><html
><head></head
><body
>"<script type="text/javascript
'document.write("<input align='center' type='button
;)">'value='ok
></script
></body
></html
در اﻳﻦ ﻣﺜﺎل ﻫﻨﮕﺎم ﺑﺎرﺷﺪن ﺻﻔﺤﻪ ﻳﻚ دﻛﻤﻪ ي okﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻓﺎﻳﻞ ﺧﺎرﺟﻲ ﺟﺎوااﺳﻜﺮﻳﭙﺖ
ﺑﺮاي ﺟﻠﻮﮔﻴﺮي از ﺗﻜﺮار ﻳﻚ ﻛﺪ اﺳﻜﺮﻳﭙﺖ در ﺻﻔﺤﺎت ﻳﻚ وب ﺳﺎﻳﺖ ،ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ را در ﻳﻚ ﻓﺎﻳﻞ
ﺟﺪاﮔﺎﻧﻪ ﻧﻮﺷﺘﻪ و ﺑﺎ ﭘﺴﻮﻧﺪ jsآن ﻫﺎ را ذﺧﻴﺮه ﻛﻨﻴﺪ ﺳﭙﺲ در ﻫﺮ ﻗﺴﻤﺖ و ﻫﺮ ﺻﻔﺤﻪ اي ﻛـﻪ ﻻزم ﺑـﻮد ،آن ﻫـﺎ را
اﺿﺎﻓﻪ ﻛﻨﻴﺪ .ﺧﻂ زﻳﺮ را ﻧﻮﺷﺘﻪ و آن را در ﻓﺎﻳﻠﻲ ﺑﺎ ﻧﺎم example1.jsذﺧﻴﺮه ﻛﻨﻴﺪ:
;)'alert('my external file
ﺣﺎﻻ در ﻳﻚ ﺻﻔﺤﻪ Htmlﻛﺪﻫﺎي زﻳﺮ را ﺑﻨﻮﻳﺴﻴﺪ.
><html
><head
>"<script type="text/javascript" src="example1.js
ﻓﺼﻞ 15 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
></script
></head
><body></body
></html
دﻗﺖ ﻛﻨﻴﺪ ﻛﻪ اﮔﺮ ﻓﺎﻳﻞ ﺟﺎوااﺳﻜﺮﻳﭙﺖ را در ﭘﻮﺷﻪ اي ﺟﺪا از ﻓﺎﻳﻞ htmlﻗﺮار ﻣﻲ دﻫﻴﺪ ﺣﺘﻤﺎً در ﺧﺎﺻـﻴﺖ src
آدرس دﻗﻴﻖ آن را ﺑﻨﻮﻳﺴﻴﺪ .ﻫﻨﮕﺎم ﻣﺸﺎﻫﺪه ﺻﻔﺤﻪ ﺟﻌﺒﻪ ﭘﻴﻐﺎﻣﻲ ﺑﺎ ﻣﺘﻦ ﻣﺸﺨﺺ ﺷﺪه ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻣﺪﻳﺮﻳﺖ روﻳﺪاد
ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻗﺎﺑﻠﻴﺖ ﻗﺮار ﮔﺮﻓﺘﻦ داﺧﻞ ﺷﻲ ﻫﺎي ،htmlﺑﺮاي ﻣـﺪﻳﺮﻳﺖ روﻳـﺪاد را ﻧﻴـﺰ دارا ﻫـﺴﺘﻨﺪ .در
اﻳﻦ ﺻﻮرت دﻳﮕﺮ ﻧﻴﺎز ﺑﻪ ﻧﻮﺷﺘﻦ ﺗﮓ > <scriptﻧﻤﻲ ﺑﺎﺷﺪ .ﺑﻪ ﻛﺪﻫﺎي زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
><html
><head
></head
><body
'<input type='button' value='send
>';)"onclick='alert("message sent.
></body
></html
در اﻳﻦ ﻣﺜﺎل ﻫﻨﮕﺎم ﻓﺸﺮدن دﻛﻤﻪ ،okﭘﻴﻐﺎﻣﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﺑﻪ ﺑﻴﺎن دﻳﮕﺮ ﺑـﺎ ﻋﻤﻠﻜـﺮدي در ﺻـﻔﺤﻪ ﺗﻮﺳـﻂ
ﻛﺎرﺑﺮ ﻳﻚ ﻋﻜﺲ اﻟﻌﻤﻞ ﺗﻮﺳﻂ ﺑﺮﻧﺎﻣﻪ اﻳﺠﺎد ﻣﻲ ﺷﻮد.
در اﻳﻦ ﺑﺨﺶ ﻟﻴﺴﺘﻲ از روﻳﺪادﻫﺎي ﻛﻪ اﻣﻜﺎن اﺗﻔﺎق اﻓﺘﺎدن ﺑﺮ روي ﻳﻚ ﻣﺮورﮔﺮ را دارﻧﺪ آورده ﺷﺪه اﺳﺖ:
در ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺳﻪ ﻧﻮع داده ي ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ ،ﻧﻮع داده ي ﻋﺪدي ﺑﺮاي ﻛﺎر ﺑﺎ اﻧﻮاع داده ﻫـﺎي از ﻧـﻮع ﻋـﺪد،
ﻧﻮع داده ي رﺷﺘﻪ ا ي ﺑﺮاي ﻛﺎر ﺑﺎ داده ﻫﺎي از ﻧﻮع ﻛﺎراﻛﺘﺮ ،و ﻧـﻮع داده ي ﻣﻨﻄﻘـﻲ) (booleanﺑـﺮاي ﻛـﺎر ﺑـﺎ
داده ﻫﺎي ﺑﺎ ﻣﻘﺪارﻫﺎي ﻣﻨﻄﻘﻲ .True,Falseﻧﻮع ﻣﺘﻐﻴﺮﻫﺎ در ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺮاﺑـﺮ ﺑـﺎ ﻧـﻮع داده اﻧﺘـﺴﺎﺑﻲ ﺑـﻪ آن
ﻣﺘﻐﻴﺮ ﻣﻲ ﺑﺎﺷﺪ.
در ﺷﻤﺎره 1ﻳﻚ ﺗﻌﺮﻳﻒ ﻣﺘﻐﻴﺮ ﺑﺪون ﻣﻘﺪاردﻫﻲ دارﻳﻢ ،ﺷﻤﺎره 2و 3ﻣﺘﻐﻴـﺮ از ﻧـﻮع ﻋـﺪدي 4 ،و 6و 7ﻣﺘﻐﻴـﺮ از ﻧـﻮع
رﺷﺘﻪ ،ﺷﻤﺎره 6ﻣﺘﻐﻴﺮ از ﻧﻮع ﻳﻚ ﻣﺘﻐﻴﺮ دﻳﮕﺮ و ﻣﺘﻐﻴﺮ ﺷﻤﺎره 8از ﻧﻮع booleanاﺳﺖ.
اﺻﻄﻼح varاز ﻛﻠﻤﻪ variableﻣﻲ آﻳﺪ ﻛﻪ ﻧﻮﺷﺘﻦ آن اﺧﺘﻴﺎري ﻣﻲ ﺑﺎﺷـﺪ ،ﻳﻌﻨـﻲ ﻣـﻲ ﺗﻮاﻧﻴـﺪ ﻳـﻚ ﻣﺘﻐﻴـﺮ را
ﺑﺪون ﻧﻮﺷﺘﻦ آن ﻫﻢ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ وﻟﻲ اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﺪﺗﺎن ﺧﻮاﻧﺎﺗﺮ ﺑﺎﺷﺪ ﺑﻬﺘﺮ اﺳﺖ ﻛﻪ از varاﺳـﺘﻔﺎده ﻛﻨﻴـﺪ.
ﻧﺎم ﻳﻚ ﻣﺘﻐﻴﺮ ﻧﻴﺎﻳﺪ از ﻛﻠﻤﺎت رزرو ﺷﺪه زﺑﺎن ﺑﺎﺷﺪ.
ﺑﺮﺳﺪ ﻳﻚ ﻛﺎراﻛﺘﺮ ،ﻳﻚ ﻛﺎراﻛﺘﺮ ﻣﻲ ﺧﻮاﻧﺪ و ﺑﻪ ﻋﺪد ﺗﺒﺪﻳﻞ ﻣﻲ ﻛﻨﺪ ،و زﻣﺎﻧﻲ ﻛﻪ ﺑﻪ ﻛﺎراﻛﺘﺮ ﻏﻴـﺮ ﻋـﺪدي ﺑﺮﺳـﺪ
ﻋﻤﻠﻴﺎت ﻣﺘﻮﻗﻒ ﻣﻲ ﺷﻮد و ﻋﺪد را ﺑﺮ ﻣﻲ ﮔﺮداﻧﺪ.
var iNum1 = ;)'parseInt('1234blue // 1234
var iNum2 = ;)'parseInt('1234 // 1234
var iNum3 = ;)'parseInt('0XA // 10
var iNum4 = ;)'parseInt('22.5 // 22
var iNum5 = ;)'parseInt('blue // NaN
اﻳﻦ ﻣﺘﺪ ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﺪ اﻋﺪاد را ﺑﻪ ﻣﺒﻨﺎي ﻣﺘﻔﺎوت ﺗﺒﺪﻳﻞ ﻛﻨﺪ .ﻛﺎﻓﻴﺴﺖ در ﭘﺎراﻣﺘﺮ دوم اﻳﻦ ﻣﺘﺪ ﻣﺒﻨﺎي ﻣﻮرد ﻧﻈـﺮ
ﻧﻮﺷﺘﻪ ﺷﻮد.
;)var iNum1 = parseInt('AF',16 // 175
;)var iNum2 = parseInt('10',2 // 2
;)var iNum3 = parseInt('10'8 // 8
ﻣﺘﺪ )( parseFloatﺑﺮاي ﺗﺒﺪﻳﻞ ﻧﻮع رﺷﺘﻪ ي ﺑﻪ اﻋﺪاد اﻋﺸﺎري ﻣﻲ ﺑﺎﺷﺪ.
var fNum1 = ;)'parseFloat('1234blue // 1234.0
var fNum2 = ;)'parseFloat('0XA // NaN
var fNum3 = ;)'parseFloat('22.5 // 22.5
var fNum4 = ;)'parseFloat('blue // NaN
ﻋﻤﻠﮕﺮ
ﻋﻤﻠﮕﺮﻫﺎ ) (operatorﻛﺎراﻛﺘﺮي ﺑﺮاي ﻧﺸﺎن دادن ﻳﻚ ﻋﻼﻣﺖ ﻣﺸﺨﺺ ﻫﺴﺘﻨﺪ ﻛﻪ ﻫﺮ ﻛﺪام از آن ﻫﺎ وﻇﻴﻔـﻪ
ﺧﺎﺻﻲ دارﻧﺪ.
اﻧﻮاع ﻋﻤﻠﮕﺮﻫﺎ
ﻋﻤﻠﮕﺮﻫﺎ ﺑﻪ ﭼﻨﺪ دﺳﺘﻪ ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮﻧﺪ:
ﻋﻤﻠﮕﺮﻫﺎي ﻣﺤﺎﺳﺒﺎﺗﻲ )(Operators Arithmetic
اﻳﻦ ﻧﻮع ﻋﻤﻠﮕﺮﻫﺎ ﭼﻬﺎر ﻋﻤﻞ اﺻﻠﻲ ﻣﺤﺎﺳﺒﺎت را اﻧﺠﺎم ﻣﻲ دﻫﻨﺪ .ﻋﻼوه ﺑﺮ آن ﻫﺎ ﻳﻚ ﻋﻤﻠﮕﺮ وﻇﻴﻔﻪ ﻧﻤﺎﻳﺶ ﺑـﺎﻗﻲ
ﻣﺎﻧﺪه ﻳﻚ ﺗﻘﺴﻴﻢ را ﺑﻌﻬﺪه دارد و دو ﻋﻤﻠﮕﺮ دﻳﮕﺮ ﻫﺮ ﻛﺪام ﺑﻪ ﺗﺮﺗﻴﺐ ﻳﻚ واﺣﺪ ﺑـﻪ ﻋﻤﻠﻮﻧـﺪ ﺧـﻮد اﺿـﺎﻓﻪ و ﻳـﻚ
واﺣﺪ از ﻋﻤﻠﻮﻧﺪ ﺧﻮد ﻛﻢ ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ در ﺟﺪول 2-2ﻣﺸﺨﺺ ﺷﺪه اﻧﺪ.
ﻧﺘﻴﺠﻪ ﻣﺜﺎل ﺗﻮﺻﻴﻒ ﻋﻤﻠﮕﺮ
4 x = 2, y = 2 ﺟﻤﻊ +
x+y
2 x = 5 , y = 3 ﺗﻔﺮﻳﻖ -
x - y
20 x = 5 , y = 4 ﺿﺮب *
x * y
5 x = 20 , y = 4 ﺗﻘﺴﻴﻢ /
x / y
3 x = 19 , y = 4 ﺑﺎﻗﻲ ﻣﺎﻧﺪه %
x % y
X=6 x = 5 اﻓﺰاﻳﺶ ++
x++
ﻓﺼﻞ 21 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
اﺳﺖ
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 22ﻓﺼﻞ 2
دﺳﺘﻮر if...else
در اﻳﻦ ﺳﺎﺧﺘﺎر در ﺻﻮرت ﻧﺎدرﺳﺖ ﺑﻮدن ﺷﺮط ،ﻣﺠﻤﻮﻋﻪ دﺳﺘﻮرات داﺧﻞ ﺑﻠﻮك ﺑﻌﺪ از elseاﺟﺮا ﻣﻲ ﺷﻮﻧﺪ.
)(function funAlert
{
) " !alert ( " Hello friends
}
></script
></head
><body
><form
>"<input type="button" onclick="funAlert()" value="Click me
></form
></body
></html
ﻳﻜﻲ از راهﻫﺎي ﻓﺮاﺧﻮاﻧﻲ ﺗﻮاﺑﻊ ،اﺳﺘﻔﺎده از روﻳﺪادﻫﺎﺳﺖ .اﮔﺮ ﻣﻲﺧﻮاﻫﻴﺪ ﻛﺪي ،ﺑﻪ ﻫﻨﮕﺎم ﺑﺎز ﺷﺪن ﺻﻔﺤﻪ ،اﺟـﺮا
ﺷﻮد ،از روﻳﺪاد onLoadاﺳﺘﻔﺎده ﻛﻨﻴﺪ .اﮔﺮ ﻣﻲﺧﻮاﻫﻴﺪ ﺑﺎ ﻛﻠﻴـﻚ ﻛـﺮدن ﺑـﺮ روي ﭼﻴـﺰي ،ﺗـﺎﺑﻌﻲ اﺟـﺮا ﺷـﻮد ،از
onClickاﺳﺘﻔﺎده ﻛﻨﻴﺪ و ﺑﻪ ﻫﻤﻴﻦ ﺗﺮﺗﻴﺐ .در ﻛﺪ ﺑﺎﻻ ﺗﺎﺑﻊ funAlertﺑﻪ ﻫﻨﮕﺎم ﻓـﺸﺮدن دﻛﻤـﻪ ي اﺟـﺮا ﻣـﻲ
ﺷﻮد .ﻫﻤﭽﻨﻴﻦ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ ﺗﺎﺑﻊ ،funAlertﺑﻪ ﻫﻨﮕﺎم ﺑﺎر ﺷﺪن ﺻﻔﺤﻪ اﺟﺮا ﺷﻮد .ﺑﺮاي اﻳﻦ ﻛـﺎر ﺑﺎﻳـﺪ در ﺗـﮓ
Bodyاﻳﻦ ﻛﺪ را اﺿﺎﻓﻪ ﻛﻨﻴﺪ:
>")(<Body onLoad="funAlert
ﭘﺎراﻣﺘﺮﻫﺎي ﺗﺎﺑﻊ
ﭘﺎراﻣﺘﺮﻫﺎ اﻃﻼﻋﺎﺗﻲ ﻫﺴﺘﻨﺪ ﻛﻪ ﻫﻨﮕﺎم ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ،از ﺑﺮﻧﺎﻣﻪ ﻓﺮاﺧﻮان ﺑﻪ آن ارﺳﺎل ﻣـﻲ ﺷـﻮﻧﺪ .ﺑـﻪ ﻋﺒـﺎرت دﻳﮕـﺮ،
ﭘﺎراﻣﺘﺮﻫﺎ وﺳﻴﻠﻪ ي ﺑﺮاي ﺗﺒﺎدل اﻃﻼﻋﺎت ﺑﻴﻦ ﺑﺨﺶ ﻓﺮاﺧﻮان و ﺗﺎﺑﻊ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮﻧﺪه ﻫﺴﺘﻨﺪ .اﮔﺮ ﺗﻌـﺪاد ﭘﺎراﻣﺘﺮﻫـﺎ از
ﻳﻜﻲ ﺑﻴﺸﺘﺮ ﺑﺎﺷﺪ ،ﺑﺎﻳﺪ ﺑﺎ ﻛﺎﻣﺎ از ﻫﻢ ﺟﺪا ﺷﻮﻧﺪ .ﺑﻄﻮرﻛﻠﻲ ﭘﺎراﻣﺘﺮﻫﺎي ﻳﻚ ﺗﺎﺑﻊ ﻣﺘﻐﻴﺮﻫﺎي ﻫﺴﺘﻨﺪ ﻛـﻪ ﺗﻌﺮﻳـﻒ ﺷـﺪه
اﻧﺪ وﻟﻲ ﻣﻘﺪاري ﻧﺪارﻧﺪ .اﻳﻦ ﻣﺘﻐﻴﺮ ﻫﺎ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﻣﻘﺪار ﻣﻲ ﮔﻴﺮﻧﺪ .در ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﺑﻪ ازاي ﻫـﺮ ﭘـﺎراﻣﺘﺮ ﺗـﺎﺑﻊ
ﻳﻚ ﻣﻘﺪار ﺑﻪ ﺗﺎﺑﻊ ارﺳﺎل ﻣﻲ ﺷﻮد.
><html
><head
><title>Shed Planner</title
>"<script language="JavaScript
{ )function shedWalls(front,side
;var numFront=(front * 12 * 2)/8
;var numSide=(side * 12 * 2)/8
;var total=numFront+numSide
var message="You will need " + total + " one by eight-
inch boards for your
"shed walls.
;)document.write(message
}
;)shedWalls(50,40 //The function is called
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 26ﻓﺼﻞ 2
></script
></head
>"<body bgcolor="palegoldenrod
></body
></html
>"<script type="text/javascript
) function total(a,b
{
;x = a * b
;return x
}
></script
></head
><body
>"<script type="text/javascript" type="text/javascript
;) price = total( 4, 15
;) document.write( price
></script
></body
></html
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ دو ﭘﺎراﻣﺘﺮ ﺑﺮاي ﺗﺎﺑﻊ totalﺗﻌﺮﻳﻒ ﺷـﺪه اﺳـﺖ .ﺣﺎﺻﻠـﻀﺮب اﻳـﻦ دو ﭘـﺎراﻣﺘﺮ در
ﻣﺘﻐﻴﺮ xذﺧﻴﺮه ﻣﻲ ﺷﻮد و ﺗﻮﺳﻂ دﺳﺘﻮر returnﻣﻘﺪار ﺟﻮاب ﺑﺮﮔﺸﺖ داده ﻣﻲ ﺷﻮد .در ﻧﻈﺮ داﺷـﺘﻪ ﺑﺎﺷـﻴﺪ ﻛـﻪ
ﺗﻮاﺑﻊ در ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺴﻴﺎر ﻛﺎرﺑﺮد دارﻧﺪ و ﺷﻤﺎ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ اﺳﻜﺮﻳﭙﺖ ﺧﻮد ﭘﻲ ﺑﻪ اﻫﻤﻴﺖ آن ﻫـﺎ ﺧﻮاﻫﻴـﺪ ﺑـﺮد
ﻣﺨﺼﻮﺻﺎً زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺳﺮي ﻛﺪ را ﺑﺨﻮاﻫﻴﺪ در ﻛﻠﻴﻪ ﺻﻔﺤﺎت ﻳﻚ وب ﺳﺎﻳﺖ ﺑﻜﺎر ﺑﺒﺮﻳﺪ ﻣـﻲ ﺗﻮاﻧﻴـﺪ آن ﻫـﺎ را
ﺑﺼﻮرت ﻳﻚ ﺗﺎﺑﻊ در ﻳﻚ ﻓﺎﻳﻞ ﺧﺎرﺟﻲ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ذﺧﻴﺮه ﻛﻨﻴﺪ و ﺳﭙﺲ در ﻫـﺮ ﺻـﻔﺤﻪ آن ﺗـﺎﺑﻊ را ﻓﺮاﺧـﻮاﻧﻲ
ﻛﻨﻴﺪ.
ﻓﺼﻞ 27 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
this.name = pname
this.model = pmodel
this.color = pcolor
}
ﺑﻪ ﻛﻠﻤﻪ thisدﻗﺖ ﻛﻨﻴﺪ ،اﻳﻦ ﻳﻚ ﻛﻠﻤﻪ رزرو ﺷﺪه ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﺳﺖ و ﺑﻪ ﺷـﻲ ﻛـﻪ در ﺣـﺎل ﺗﻌﺮﻳـﻒ اﺳـﺖ،
اﺷﺎره دارد و در ﺣﻘﻴﻘﺖ ﺑﻪ ﻣﻔﺴﺮ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣـﻲ ﮔﻮﻳـﺪ ﻛـﻪ اﻳـﻦ ﺧﺎﺻـﻴﺖ ﺷـﻲ ﺗﻌﺮﻳـﻒ ﺷـﺪه ﺑـﺎ اﻳـﻦ ﻣﻘـﺪار
ﻣﻘﺪاردﻫﻲ ﺷﻮد.
ﺣﺎﻻ ﺑﺎﻳﺪ ﻳﻚ ﻧﻤﻮﻧﻪ از ﺷﻲ ﺟﺪﻳﺪ ﺑﺴﺎزﻳﺪ ﻛﻪ اﻳﻦ ﻧﻤﻮﻧﻪ را در ﻣﺘﻐﻴﺮي ﺑﻨﺎم mycarذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﻢ:
) "mycar = new Car ( "peugeot", "206", "Red
اﻳﻦ ﺧﻂ ﻛﺪ ﺑﻪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻲ ﮔﻮﻳﺪ ﻛﻪ ﻳﻚ ﻧﻤﻮﻧﻪ ﺑﻪ ﻧﺎم mycarداراي ﺧﺎﺻﻴﺖ ﻫﺎي اﺳﻢ ﻛـﻪ peugeot
و ﻣﺪل 206و رﻧﮓ Redﻣﻲ ﺑﺎﺷﺪ .اﻛﻨﻮن ﻣﻲ ﺧﻮاﻫﻴﻢ از ﻧﻤﻮﻧﻪ ،اﺳﻢ ﻣﺎﺷﻴﻦ و رﻧﮓ را در ﺻﻔﺤﻪ ﭼﺎپ ﻛﻨﻴﻢ:
) ">document.write ( mycar.name + "<br /
) document.write ( mycar.color
ﺑﻌﺪ از اﻳﻨﻜﻪ ﺧﺼﻮﺻﻴﺎﺗﻲ ﺑﺮاي ﻳﻚ ﺷﻲ ﺗﻌﺮﻳﻒ ﻛﺮدﻳﺪ ﻧﻮﺑﺖ ﺑﻪ ﻣﺘـﺪﻫﺎي ﺷـﻲ ﺳـﺎﺧﺘﻪ ﺷـﺪه ،ﻣـﻲ رﺳـﺪ .در اﻳﻨﺠـﺎ
ﻣﺘﺪي ﻛﻪ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ ﺑﺮاي ﻛﻠﻴﻪ ﻣﺎﺷﻴﻦ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﻜﺎر ﮔﻴﺮﻳﻢ .اﻟﮕﻮي ﻛﻠﻲ ﺗﻌﺮﻳﻒ ﻳﻚ ﻣﺘﺪ ﺑﻪ ﺷـﺮح زﻳـﺮ
اﺳﺖ:
object.methodname()= function_name
objectﻧــﺎم ﻧﻤﻮﻧــﻪ ي اﺳــﺖ ﻛــﻪ ﺳــﺎﺧﺘﻴﻢ methodname ،ﻧــﺎم ﻣﺘــﺪي اﺳــﺖ ﻛــﻪ در ﻧﻈــﺮ ﻣــﻲ ﮔﻴﺮﻳــﺪ و
function nameاﺳﻢ ﺗﺎﺑﻌﻲ اﺳﺖ ﻛﻪ ﺑﺎﻳﺪ ﻋﻤﻠﻴﺎت ﻣﻮرد ﻧﻈﺮ را اﻧﺠﺎم دﻫﺪ .ﺳﭙﺲ ﻫﺮ ﻛﺠـﺎ ﻛـﻪ ﻻزم ﺑـﻮد از
ﻣﺘﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ اﺑﺘﺪا ﻧﺎم ﻧﻤﻮﻧﻪ و ﺳﭙﺲ ﺑﺎ ﮔﺬاﺷﺘﻦ ﻳﻚ ﻧﻘﻄﻪ ﻣﺘﺪ را ﺑﻪ ﻫﻤﺮاه ﭘﺮاﻧﺘﺰ ﻣﻲ ﻧﻮﻳـﺴﻴﺪ ﻛـﻪ اﮔـﺮ اﻳـﻦ ﻣﺘـﺪ
ﭘﺎراﻣﺘﺮي ﻫﻢ داﺷﺖ ﺑﺎﻳﺪ آن را داﺧﻞ ﭘﺮاﻧﺘﺰ ﻣﺸﺨﺺ ﻛﻨﻴﺪ.
ﻓﺼﻞ 29 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
ﻣﺘﺪي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺮاي ﺷﻲ Carﺑﺴﺎزﻳﺪ را ﺑﺎﻳﺪ اﺑﺘﺪا ﺑﺼﻮرت ﻳﻚ ﺗﺎﺑﻊ ﺗﻌﺮﻳﻒ ﻛﻨﻴﺪ:
{ )(function fdisplaycar
var result = " I like " + this.name + " " + this.model +
"" with " + this.color + " color.
) document.write ( result
}
ﺣﺎﻻ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر thisاﻳﻦ ﺗﺎﺑﻊ را ﺑﻪ ﻋﻨﻮان ﻣﺘﺪ ﺷﻲ Carﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ:
{ ) function Car ( name, model, color
this.name = name
this.model = model
this.color = color
this.displaycar = fdisplaycar
}
ﺑﻌﺪ از ﺗﻌﺮﻳﻒ ﺗﻮاﺑﻊ ،ﻣﺘﺪ را اﺟﺮا ﻣﻲ ﻛﻨﻴﺪ:
)(mycar.displaycar
ﺗﻌﺮﻳﻒ DOM
DOMﻣﺨﻔﻒ ﺳﻪ ﻛﻠﻤﻪ Model Object Documentﻣﻲ ﺑﺎﺷـﺪ .ﻣﺘﻨـﻲ ﻛـﻪ در زﻳـﺮ آﻣـﺪه ﺗﻌﺮﻳـﻒ DOMﺑـﺮ
اﺳﺎس W3Cاﺳﺖ:
" The Document Object Model is a platform- and language -
neutral interface that will allow programs and scripts to
dynamically access and update the content, structure and style
of documents. The document can be further processed and the
results of that processing can be incorporated back into the
"presented page.
DOMﻳﻚ واﺳﻄﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻫﺎ و اﺳﻜﺮﻳﭙﺖ ﻫﺎ اﺟﺎزه دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺤﺘﻮا و ﺳﺎﺧﺘﺎر داﺧﻠﻲ ﭘﻨﺠـﺮه ﻣﺮورﮔـﺮ
را ﻣﻲ دﻫﺪ ﺗﺎ آن ﻫﺎ ﺑﺘﻮاﻧﻨﺪ ﺗﻐﻴﻴﺮاﺗﻲ اﻳﺠﺎد ﻛﻨﻨﺪ ﻛﻪ ﻧﺘﻴﺠﻪ اﻳﻦ ﺗﻐﻴﻴﺮات در ﺻﻔﺤﻪ وب ﻧﻤﺎﻳﺎن ﺷﻮد .در ﻫﻤﻴﻦ راﺑﻄـﻪ
زﺑﺎﻧﻲ ﺑﻪ ﻧﺎم DHTMLﺑﻮﺟﻮد آﻣﺪ ﻛﻪ ﺑﺎ ﺗﺮﻛﻴﺐ ﻛﺮدن ﻋﻨﺎﺻﺮ htmlﺑﺎ cssو اﺳﻜﺮﻳﭙﺖ ﻫـﺎ ﻣـﻲ ﺗﻮاﻧـﺪ ﻣﺤﺘـﻮاي
اﺳﻨﺎد وب را ﺑﺼﻮرت ﻣﺘﺤﺮك و ﭘﻮﻳﺎ درآورد .در اﻳﻨﺠﺎ ﭘﻮﻳﺎ ﺑﻮدن ﻓﻘﻂ ﺑﻪ اﻳﻦ ﻣﻨﻈﻮر ﻧﻴـﺴﺖ ﻛـﻪ ﻣـﺘﻦ ﻫـﺎ ﺣﺮﻛـﺖ
ﻛﻨﻨﺪ و از ﻳﻚ ﻃﺮف وارد ﺑﺸﻮﻧﺪ و از ﻃﺮف دﻳﮕﺮ ﺧﺎرج ،ﻣﻤﻜﻦ اﺳﺖ ﻟﻴﻨﻚ ﻫﺎ ﻫﺮ ﺑﺎر ﺷﻤﺎ را ﺑﻪ ﻳﻚ ﺳﺎﻳﺘﻲ ﭘﻴﻮﻧﺪ
دﻫﻨﺪ و ﻳﺎ ﺗﺼﺎوﻳﺮ ﻣﺮﺗﺐ ﺗﻐﻴﻴﺮ ﻛﻨﻨﺪ ،در ﻣﺠﻤﻮع ﻫﺮ ﺗﻐﻴﻴﺮي ﻛﻪ ﻧﻴﺎز ﺑﻪ ﻛﺪﻧﻮﻳﺴﻲ ﻣﺠﺪد ﺑﺮاي آن ﺻـﻔﺤﻪ را ﻧﺪاﺷـﺘﻪ
ﺑﺎﺷﺪ ،ﻣﻔﻬﻮم ﭘﻮﻳﺎ ﺑﻮدن را ﻣﻲ رﺳﺎﻧﺪ.
BOMﮔﻔﺘﻪ ﻣﻲ ﺷﻮد(Model Object Browser) :ﺷﻲ ﻫﺎﻳﻲ ﻛﻪ ﺑﺎ ﭘﻨﺠﺮه ﻣﺮورﮔﺮ ﻣﻲ ﺗﻮاﻧﻨﺪ ارﺗﺒﺎط ﺑﺮﻗﺮار
ﻛﻨﻨﺪ و دﺳﺘﻪ دوم DOMﻛﻪ ﺑﺎ ﺻﻔﺤﻪ) html (Documentارﺗﺒﺎط دارﻧﺪ .ﺗﻤﺎﻣﻲ اﻳﻦ اﺷﻴﺎ ﺑﺮاﺳﺎس ﻳـﻚ ﺳﻠـﺴﻠﻪ
ﻣﺮاﺗﺐ اﻳﻦ ارﺗﺒﺎط را ﺑﺮﻗﺮار ﻣﻲ ﻛﻨﻨﺪ ﻛﻪ در رأس آن ﻫﺎ ﺷﻲ windowﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺐ در ﺷـﻜﻞ -3
2آورده ﺷﺪه اﺳﺖ.
ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ 2-3ﻣﺸﺎﻫﺪه ﻛﺮدﻳﺪ از ﺷﻲ windowﺗﺎ ﺷﻲ Documentﺟﺰو دﺳـﺘﻪ BOMﻣـﻲ ﺑﺎﺷـﻨﺪ و
اﺷﻴﺎء ﺑﻌﺪ از Documentدر دﺳﺘﻪ DOMﻗـﺮار ﻣـﻲ ﮔﻴﺮﻧـﺪ .در ﺣـﺎل ﺣﺎﺿـﺮ در ﻛـﻞ اﻳـﻦ ﻣﺠﻤﻮﻋـﻪ را DOMﻣـﻲ
ﮔﻮﻳﻨﺪ.
ﺷﻤﺎ ﺑﺎﻳﺪ اﻳﻦ ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺐ را ﺑﺮاي اﺳﺘﻔﺎده اﺷﻴﺎ آن ،رﻋﺎﻳﺖ ﻛﻨﻴﺪ .ﺑـﺮاي اﺳـﺘﻔﺎده از آن ﻫـﺎ ﺑﺎﻳـﺪ اﺑﺘـﺪا اﺳـﻢ ﭘـﺪر و
ﺳﭙﺲ اﺳﻢ ﻓﺮزﻧﺪ را ﻧﻮﺷﺖ و در آﺧﺮ ﻫﻢ ﺧﺎﺻﻴﺖ و ﻳﺎ ﻣﺘﺪ آن ﻓﺮزﻧﺪ ﻛﻪ ﻫﻤﻪ اﻳﻦ ﻫﺎ ﺑﺎ ﻳﻚ ﻧﻘﻄﻪ از ﻫـﻢ ﺑﺎﻳـﺪ ﺟـﺪا
ﺷﻮﻧﺪ .ﺑﻄﻮر ﻣﺜﺎل اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻳﻚ ﻓﺮم را ﺑﻪ ﻧﺎم form1ﺻﺪا ﺑﺰﻧﻴﺪ ﺗﺎ ﺑﺎ آن ارﺗﺒﺎط ﺑﺮﻗﺮار ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﺑـﻪ ﺷـﻜﻞ
زﻳﺮ ﻋﻤﻞ ﺷﻮد:
window.document.form1
ﻣﺎﻧﻨﺪ ﻫﻤﻪ اﺷﻴﺎ در ﺟﺎوااﺳﻜﺮﻳﭙﺖ ،اﻳﻦ ﺷﻲ ﻫﺎ ﻫﻢ داراي ﺧﺎﺻﻴﺖ ﻫﺎ و ﻣﺘﺪﻫﺎﻳﻲ ﻫـﺴﺘﻨﺪ ﻛـﻪ ﺑﻌـﺪ از رﻋﺎﻳـﺖ ﻛـﺮدن
ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺐ ﺑﺎ ﮔﺬاﺷﺘﻦ ﻳﻚ ﻧﻘﻄﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ آن ﻫﺎ را ﺑﻨﻮﻳﺴﻴﺪ .ﻣﺎﻧﻨﺪ:
)window.history.go(-1
اﮔﺮ اﻳﻦ ﺷﻲ را در ﻳﻚ ﻟﻴﻨﻚ ﻗﺮار دﻫﻴﺪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي آن ،ﻛﺎرﺑﺮ ﺑﻪ ﺻﻔﺤﻪ ﻗﺒﻞ ﺑﺎزﮔﺸﺖ داده ﻣﻲ ﺷﻮد.
در ﺟﺪول 2-5ﺷﻲ ﻫﺎي اﺻﻠﻲ اﻳﻦ ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺐ ﻟﻴﺴﺖ ﺷﺪه اﺳﺖ.
اﻳﻦ ﺷﻲ ﻣﺴﺘﻘﻴﻤﺎً ﺑـﺎ ﭘﻨﺠـﺮه ﻣﺮورﮔـﺮ در ارﺗﺒـﺎط اﺳـﺖ ﻛـﻪ window
ﻫﺎ و ﻏﻴﺮه.
ﺷــﺎﻣﻞ اﻃﻼﻋــﺎﺗﻲ در ﻣــﻮرد URLﺻــﻔﺤﻪ اي ﻛــﻪ در ﺣــﺎل location
ﻧﻤﺎﻳﺶ اﺳﺖ.
اﻳﻦ ﺷﻲ داراي اﻃﻼﻋﺎﺗﻲ ﺑﺮاي رﺟﻮع ﻛﺎرﺑﺮ ﺑﻪ ﺻﻔﺤﺎﺗﻲ ﻛﻪ history
ﻫﻤــﻪ ﮔــﺮه ﻫــﺎ ﺑﺠــﺰ ﻧــﻮد documentداراي ﮔــﺮه ﭘــﺪر) (parentﻫــﺴﺘﻨﺪ .در اﻳــﻦ ﻣﺜــﺎل ﭘــﺪر > <headو
> <bodyﮔﺮه > <htmlاﺳﺖ وﻳﺎ ﭘﺪر ﻣﺘﻦ! Hello worldﮔﺮه > <pاﺳﺖ.
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 32ﻓﺼﻞ 2
ﺑﻴﺸﺘﺮ ﮔﺮه ﻫﺎي elementداراي ﻓﺮزﻧﺪ) (childﻣـﻲ ﺑﺎﺷـﻨﺪ .ﮔـﺮه > ،<headﻓﺮزﻧـﺪش ﮔـﺮه ><title
اﺳﺖ و > <titleﻳﻚ ﻓﺮزﻧﺪ دارد ﻛﻪ ﻳﻚ ﮔﺮه ﻣﺘﻨﻲ DOM Tutorialاﺳﺖ.
ﺑﻪ ﮔﺮه ﻫﺎي ﻛﻪ داراي ﻳﻚ ﭘﺪر ﺑﺎﺷﻨﺪ ﮔﺮه ﺑﺮادر ﻳﺎ ﻫﻤﺰاد ﮔﻮﻳﻨﺪ .در اﻳﻦ ﻣﺜﺎل ﮔـﺮه > <h1و > <pﺑـﺎﻫﻢ ﺑﺮادرﻧـﺪ
ﺑﺮاي اﻳﻨﻜﻪ ﭘﺪر ﻫﺮ دو ﮔﺮه > <bodyاﺳﺖ.
ﺑﺎ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺳﺎﺧﺘﺎر ﻳﻚ ﺻﻔﺤﻪ را ﺗﻐﻴﻴﺮ دﻫﻴﺪ .ﺑﺮاي اﻳﻦ ﻛـﺎر ﻧﻴـﺎز ﺑـﻪ دﺳﺘﺮﺳـﻲ ﺑـﻪ ﻋﻨﺎﺻـﺮ ﺻـﻔﺤﻪ
دارﻳـــــﺪ ،اﻳـــــﻦ دﺳﺘﺮﺳـــــﻲ ﺑﻮﺳـــــﻴﻠﻪ ﻣﺘـــــﺪﻫﺎي )(،createElement() ،createTextNode
)( appendChildﺑﺮاي ﻋﻨﺎﺻﺮ Htmlﺻﻔﺤﻪ از ﻃﺮﻳﻖ DOMﻓﺮاﻫﻢ ﻣﻲ ﺷﻮد.
ﺑﺮاي ﻣﺜﺎل ﻛﺪ زﻳﺮ را در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ،ﻣﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ ﻋﺒـﺎرﺗﻲ ﺑـﺼﻮرت ! Hello Worldرا در ﺻـﻔﺤﻪ وب
در ﻳﻚ ﺗﮓ > <pﺑﻪ ﺻﻔﺤﻪ اﺿﺎﻓﻪ ﻛﻨﻴﻢ:
><html
><head
><title>createElement() Example</title
></head
><body
></body
></html
اﺑﺘﺪا ﻳﻚ ﺗﮓ > <pﺑﺎ دﺳﺘﻮر )( createElementاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ:
;)”var oP = document.createElement(“p
ﻣﺮﺣﻠﻪ دوم :ﻳﻚ ﮔﺮه textﺣﺎوي ﻣﺘﻦ ﻣﻮرد اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ:
;)”!var oText = document.createTextNode(“Hello World
ﻣﺮﺣﻠﻪ ﺳﻮم :ﺑﺎﻳﺪ ﮔﺮه textرا ﺑﻌﻨﻮان ﻓﺮزﻧﺪ ﮔﺮه > <pﻣﻌﺮﻓﻲ ﻛﻨﻴﻢ:
;)oP.appendChild(oText
ﻣﺮﺣﻠﻪ ﭼﻬﺎرم :ﺑﺎﻳﺪ ﮔﺮه > <pرا ﺑﻌﻨﻮان ﻓﺮزﻧﺪ ﮔﺮه > <bodyﻣﻌﺮﻓﻲ ﻛﻨﻴﻢ:
;)document.body.appendChild(oP
ﺑﺎ دﺳﺘﻮرات ﺑﺎﻻ ﻳﻚ ﺧﻂ دﺳﺘﻮر Htmlﺑﺼﻮرت > <p>Hello World!</pﺑﻪ ﺻﻔﺤﻪ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد.
دﺳﺘﺮﺳﻲ و ﻳﺎﻓﺘﻦ ﮔﺮه ﻫﺎ
DOMاﻣﻜﺎﻧﺎﺗﻲ را ﻓﺮاﻫﻢ ﻛﺮده اﺳﺖ ﺗﺎ ﺑﺮاﺣﺘـﻲ ﺑﺘﻮاﻧﻴـﺪ ﻫـﺮ ﻋﻨـﺼﺮ از ﺻـﻔﺤﻪ را ﻛـﻪ ﺑـﺮاي ﺗﻐﻴﻴـﺮات ﻧﻴـﺎز دارﻳـﺪ را
ﺟﺴﺘﺠﻮ ﻛﻨﻴﺪ ﺑﺮاي اﻳﻦ ﻛﺎر ﭼﻨﺪﻳﻦ روش وﺟﻮد دارد:
-1اﺳﺘﻔﺎده از ﻣﺘﺪ )( getElementByIdو ﻣﺘﺪ )(. getElementsByTagName
-2ﺑﺎ اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ ﻫﺎي . lastChild ،firstChild ،parentNode
روش اول
ﻣﺘﺪﻫﺎي )( getElementByIdو)( getElementsByTagNameﻫﺮ ﻋﻨﺼﺮي در ﺻـﻔﺤﻪ Htmlرا
ﻣﻲ ﺗﻮاﻧﻨﺪ ﺟﺴﺘﺠﻮ ﻛﻨﻨﺪ .اﻳﻦ ﻣﺘﺪﻫﺎ ﺳﺎﺧﺘﺎر درﺧﺘﻲ ﺻﻔﺤﻪ را ﻧﺎدﻳﺪه ﻣﻲ ﮔﻴﺮﻧﺪ.
ﻓﺼﻞ 33 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻋﻨﺼﺮ > <pرا در ﺻﻔﺤﻪ ﭘﻴﺪا ﻛﻨﻴﺪ ،ﻣﺘﺪ )( getElementsByTagNameﻫﻤﻪ ي آن ﻫﺎ را
ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﺻﺮﻓﻨﻈﺮ از اﻳﻨﻜﻪ > <pدر ﻛﺪام ﺳﻄﺢ درﺧﺖ ﻗﺮار دارد ﻫﻤﭽﻨـﻴﻦ ﻣﺘـﺪ )(getElementById
ﻫﻤﻮاره ﻋﻨﺼﺮ ﻣﻮﺟﻮد در ﺻـﻔﺤﻪ را ﺑﺮﻣـﻲ ﮔﺮداﻧـﺪ اﮔﺮﭼـﻪ آن ﻋﻨـﺼﺮ ﺑـﺼﻮرت ﻣﺨﻔـﻲ ) (hiddenﺑﺎﺷـﺪ.ﻣﺘـﺪ
)( getElementByIdﻳﻚ ﻋﻨﺼﺮ Htmlرا ﺑﺎ IDﻣﺸﺨﺺ ﺑﺮﻣﻲ ﮔﺮداﻧﺪ.
ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ:
;)"document.getElementById("someID
ﻣﺘﺪ )( getElementsByTagNameﺗﻤﺎم ﻋﻨﺎﺻﺮي ﻛﻪ داراي ﻧﺎم ﺗﮓ ﻳﻜﺴﺎﻧﻲ ﻫﺴﺘﻨﺪ را در ﻳﻚ آراﻳـﻪ ﺑـﺮ
ﻣﻲ ﮔﺮداﻧﺪ .اﻳﻦ ﻣﺘﺪ ﺑﺮاي ﺗﻤﺎﻣﻲ ﻋﻨﺎﺻﺮ ﻣﻮﺟﻮد ﺑﺮ روي ﺻﻔﺤﻪ Htmlﻛﺎر ﻣﻲ ﻛﻨﺪ.
ﺷﻜﻞ ﻛﻠﻲ اﻳﻦ ﻣﺘﺪ ﺑﺼﻮرت زﻳﺮ اﺳﺖ:
;)"document.getElementsByTagName("tagname
ﻳﺎ
document.getElementById('someID').getElementsByTagName("tagnam
;)"e
ﺑﻪ ﻣﺜﺎل زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ :در اﻳﻦ ﻣﺜﺎل ﺗﻤﺎم ﺗﮓ ﻫﺎي > <pﺑﺮﮔﺸﺖ داده ﻣﻲ ﺷﻮﻧﺪ.
;)"document.getElementsByTagName("p
در ﻛﺪ زﻳﺮ ﻣﻲ ﺧﻮاﻫﻴﻢ ﺗﻤﺎم ﺗﮓ ﻫﺎي > <pﻛﻪ داراي " ID="maindivﻣﻲ ﺑﺎﺷﻨﺪ را ﺟﺴﺘﺠﻮ ﻛﻨﻴﻢ:
;)"document.getElementById('maindiv').getElementsByTagName("p
آراﻳﻪ ي از ﮔﺮه ﻫﺎ
زﻣﺎﻧﻴﻜﻪ ﺑﺎ ﻳﻚ آراﻳﻪ از ﮔﺮه ﻫﺎ ﻛﺎر ﻣﻲ ﻛﻨﻴﺪ ﺑﺎﻳﺪ از ﻳﻚ ﻣﺘﻐﻴﺮ ﺑﺮاي ﻧﮕﻬﺪاري ﻋﻨﺎﺻﺮ آراﻳﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
;)"var x=document.getElementsByTagName("p
در اﻳﻨﺠﺎ ﻣﺘﻐﻴﺮ xﻳﻚ آراﻳﻪ از ﺗﮓ ﻫﺎي > <pﻣﻮﺟﻮد در ﺻﻔﺤﻪ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻫﺮ ﻛـﺪام از ﺗـﮓ ﻫـﺎ
ﺑﺎﻳﺪ از اﻧﺪﻳﺲ اﺳﺘﻔﺎده ﻛﺮد .اﻧﺪﻳﺲ از ﺻﻔﺮ ﺷﺮوع ﻣﻲ ﺷﻮد .ﺑﻪ ﻛﺪ زﻳﺮ ﺗﻮﺟﻪ ﻛﻨﻴﺪ:
;)"var x=document.getElementsByTagName("p
)for (var i=0;i<x.length;i++
{
// do something with each paragraph
}
ﻣﺜﻼ ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﺳﻮﻣﻴﻦ ﺗﮓ ><p
;]var y=x[2
روش دوم
ﺳﻪ ﺧﺎﺻﻴﺖ firstChild ،parentNodeو lastChildاز ﺳﺎﺧﺘﺎر درﺧﺘﻲ ﺻﻔﺤﻪ ﭘﻴﺮوي ﻣﻲ ﻛﻨﻨﺪ و
اﻣﻜﺎن ﻳﻚ ﺣﺮﻛﺖ ﻛﻮﺗﺎه را در اﻳﻦ درﺧﺖ ﻓﺮاﻫﻢ ﻣﻲ آورﻧﺪ.
ﺑﻪ اﻳﻦ ﻛﺪ Htmlدﻗﺖ ﻛﻨﻴﺪ:
><table
><tr
><td>hadi</td
><td>mohammad</td
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 34ﻓﺼﻞ 2
><td>tavakoli</td
></tr
></table
در اﻳﻦ ﻛﺪ اوﻟﻴﻦ > <tdﺑﻌﻨﻮان firstChildو آﺧﺮﻳﻦ > <tdﺑﻌﻨﻮان lastChildﺑﺮاي ﮔﺮه > <trﻣﻲ
ﺑﺎﺷﺪ <tr> .ﭘﺪر ﻫﻤﻪ ي ﮔﺮه ﻫﺎي > <tdاﺳﺖ.
ﺑﻴﺸﺘﺮﻳﻦ ﻛﺎرﺑﺮد firstChildﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺘﻦ ﻳﻚ ﻋﻨﺼﺮ اﺳﺖ.
;]var x=[a paragraph
;var text=x.firstChild.nodeValue
از ﺧﺎﺻﻴﺖ parentNodeاﻏﻠﺐ ﺑﺮاي ﺗﻐﻴﻴﺮ در ﺳﺎﺧﺘﺎر ﺻﻔﺤﻪ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .ﻣـﺜﻼ ﺑـﺮاي ﺣـﺬف ﮔـﺮه ي ﺑـﺎ
": ID="maindiv
;)"var x=document.getElementById("maindiv
;)x.parentNode.removeChild(x
ﺑﺮاي ﺣﺬف ﻳﻚ ﮔﺮه از ﻣﺘﺪ )( removeChildاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد.
ﮔﺮه رﻳﺸﻪ
ﮔﺮه رﻳﺸﻪ در ﺳﺎﺧﺘﺎر درﺧﺘﻲ ،DOMﮔﺮه documentاﺳﺖ اﻳﻦ ﮔﺮه دو ﺧﺎﺻﻴﺖ ﺧﺎص ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑـﻪ ﺗـﮓ
ﻫﺎ داراﺳﺖ.
- document.documentElement
- document.body
ﺧﺎﺻﻴﺖ اول ﮔﺮه رﻳﺸﻪ ﺻﻔﺤﻪ را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و ﺧﺎﺻﻴﺖ دوم ﺑﺮاي دﺳﺘﺮﺳﻲ ﻣﺴﺘﻘﻴﻢ ﺑﻪ ﺗﮓ > <bodyاﺳﺖ .در
اﻳﻦ ﻣﺜﺎل ﻛﺎرﺑﺮد ﺧﺎﺻﻴﺖ bodyرا ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ.
><html
><head
>"<script type="text/javascript
)(function ChangeColor
{
"document.body.bgColor="yellow
}
></script
></head
>")(<body onclick="ChangeColor
!Click on this document
></body
></html
اﻃﻼﻋﺎت ﮔﺮه
ﺧﺎﺻﻴﺖ ﻫﺎي nodeValue ،nodeNameو nodeTypeﺷﺎﻣﻞ اﻃﻼﻋﺎت ﮔﺮه ﻫﺎ ﻫﺴﺘﻨﺪ.
ﻓﺼﻞ 35 2 ﺟﺎوااﺳﻜﺮﻳﭙﺖ
)document.writeln(exp1,exp2,exp3,....
ﻣﺜﺎل:
;)'document.write('test text
;)">document.write("<h1>Hello World!</h1
<html>
<head>
<script type="text/javascript">
function getValue()
{
var x=document.getElementById("myHeader")
alert(x.innerHTML)
}
</script>
</head>
<body>
<h1 id="myHeader" onclick="getValue()">This is a header</h1>
<p>Click on the header to alert its value</p>
</body>
</html>
Html اﺳﺘﻔﺎده ﺷﺪ ﺗﺎ اﻃﻼﻋﺎت ﺑـﻪ ﻓﺮﻣـﺖinnerHtml در اﻳﻦ ﻣﺜﺎل ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﺤﺘﻮاي ﻣﺘﻦ از ﺧﺎﺻﻴﺖ
.ﻧﻴﺰ درﻳﺎﻓﺖ ﺷﻮد
<html>
<head>
<script type="text/javascript">
function getElements()
{
var x=document.getElementsByName("myInput");
alert(x.length);
}
</script>
</head>
<body>
<input name="myInput" type="text" size="20" /><br />
<input name="myInput" type="text" size="20" /><br />
<input name="myInput" type="text" size="20" /><br />
<br />
<input type="button" onclick="getElements()"
value="How many elements named 'myInput'?" />
</body>
</html>
alert(x.length);
}
</script>
</head>
<body>
<input name="myInput" type="text" size="20" /><br />
<input name="myInput" type="text" size="20" /><br />
<input name="myInput" type="text" size="20" /><br />
<br />
<input type="button" onclick="getElements()"
value="How many input elements?" />
</body>
</html>
ﺑـﻪ ﻳـﻚ ﻣﺠﻤﻮﻋـﻪ از ﺗـﮓ ﻫـﺎgetElementsByTagName("input") در اﻳﻦ ﻣﺜﺎل ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘـﺪ
.ﺑﺮاﺳﺎس ﻧﺎم ﻳﻜﺴﺎن دﺳﺘﺮﺳﻲ ﭘﻴﺪا ﻛﺮدﻳﻢ
<select> < را ﺑﻌﻨـﻮان ﭘـﺪرform> < ﺑﺎﻳـﺪ ﻳـﻚselect> ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار اﻧﺘﺨﺎب ﺷﺪه در ﻳـﻚ
:ﻗﺮار دارد ﺑﺼﻮرت زﻳﺮ
<form name='form1'>
<select id="select1">
<option value="0" ><ﻧﺎم/option>
<option value="1" > <ﻣﻮﺿﻮع/option>
</select>
</form>
:ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻘﺪار از دﺳﺘﻮر زﻳﺮ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ
document.form1.select1.options[document.form1.select1.
selectedIndex].value;
document.getElementById('div1').appendChild(dtext);
ﺑـﺮاي ﻣﺜـﺎل. ﺣﺴﺎس ﻧﻴﺴﺖ و آن ﻫﺎ را ﺟﺰء ﻣﺘﻦ ﺑﻪ ﺣﺴﺎب ﻣﻲ آوردHtml ﺑﻪ ﺗﮓ ﻫﺎيinnerText ﺧﺎﺻﻴﺖ
:< ﺑﻨﻮﻳﺴﻴﻢdiv> داﺧﻞ ﻳﻚHtml ﻣﻲ ﺧﻮاﻫﻴﻢ اﻳﻦ دﺳﺘﻮر
<h1>hadi</h1>
.< ﻧﻴﺰ ﺑﺮ روي ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪh1> اﻧﺠﺎم دﻫﻴﻢ ﻣﺘﻦ ﻫﺎي ﺗﮓinnerText اﮔﺮ اﻳﻦ ﻛﺎر را ﺑﺎ
document.getElementById('div1').innerText ='<h1>hadi</h1>';
. ﻣﻲ ﺑﺎﺷﺪ و اﻳﻦ ﻣﺸﻜﻞ را ﺣﻞ ﻣﻲ ﻛﻨﺪHtml ﺣﺴﺎس ﺑﻪ ﺗﮓ ﻫﺎيinnerHTML اﻣﺎ ﺧﺎﺻﻴﺖ دﻳﮕﺮ
document.getElementById('div1').innerHTML='<h1>hadi</h1>';
: ﺑﻨﻮﻳﺴﻴﻢ ﺑﺪﻳﻦ ﮔﻮﻧﻪ ﻣﻲ ﺷﺪDOM اﮔﺮ ﻣﻲ ﺧﻮاﺳﺘﻴﻢ اﻳﻦ ﻛﺎر را ﺑﺎ دﺳﺘﻮرات
var hText = document.createElement(“h1”);
hText.appendChild(document.createTextNode(“hadi”));
document.getElementById('div1').appendChild(hText);
ﺑﺮاي ﻧﻮﺷﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎ از ﻛـﺪ ﺟﺎوااﺳـﻜﺮﻳﭙﺖ ﺳـﻤﺖAjax در ﭘﺎﻳﺎن ﺑﻪ اﻳﻦ ﻧﻜﺘﻪ اﺷﺎره ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ در ﺗﻜﻨﻮﻟﻮژي
.ﺳﺮور اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد
ﺟﺎوااﺳﻜﺮﻳﭙﺖ 40ﻓﺼﻞ 2
ﻧﻴﺮوي ﭘﻴﺸﺒﺮﻧﺪه ﭘﺸﺖ ﺳﺮ ،Ajaxاﻳﺠﺎد ارﺗﺒﺎط ﺑﻴﻦ ﻛﻼﻳﻨﺖ و ﺳﺮور اﺳﺖ .ﻗﺒﻼ اﻳﻦ ارﺗﺒﺎط ﻣﺤﺪود ﺑﻪ ﺗﻮﺳﻌﻪ
زﺑﺎﻧﻬﺎي ﺳﻤﺖ ﺳﺮور ﻣﺎﻧﻨﺪ perlو CGIﺑﻮد ،ﺗﻜﻨﻮﻟﻮژﻳﻬﺎي ﺟﺪﻳﺪ ﻣﺎﻧﻨﺪ PHP ،asp.netو jspﺗﻜﻨﻴﻚ
ﻫﺎي را ﺑﺮاي آﻣﻴﺨﺘﻦ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺳﻤﺖ ﺳﺮور و ﻛﻼﻳﻨﺖ ﺑﺮاي ﻋﻼﻗﻤﻨﺪان ﺑﻪ اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﻓﺮاﻫﻢ آوردﻧﺪ،
اﻣﺎ آن ﻫﺎ ﻓﺎﻗﺪ ﺗﻜﻨﻴﻚ ﻫﺎي ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﻣﺎﻧﻨﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﻮدﻧﺪ .اﻣﺎ اﻛﻨﻮن آوﻧﮓ در ﺟﻬﺖ دﻳﮕﺮي ﺗﺎب
ﻣﻲ ﺧﻮرد ،ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن ﺳﻤﺖ ﺳﺮور ﻧﻴﺎز ﺑﻪ ﻓﻬﻤﻴﺪن ﭼﻴﺰﻫﺎي زﻳﺎدي درﺑﺎره ﺗﻜﻨﻴﻚ ﻫﺎي ﺳﻤﺖ ﻛﻼﻳﻨﺖ دارﻧﺪ
ﺗﺎ ﺑﺘﻮاﻧﻨﺪ راه ﺣﻞ Ajaxرا ﺑﻪ ﻛﺎر ﺑﺒﺮﻧﺪ.
ﺷﺮوع ﺑﺎ HTTP
ﺑﻬﺘﺮﻳﻦ روش درك Ajaxدرك HTTPاﺳﺖ HTTP ،ﭘﺮوﺗﻜﻠﻲ ﺑﺮاي ارﺳﺎل ﺻﻔﺤﺎت وب ،ﺗﺼﻮﻳﺮ و اﻧﻮاع
دﻳﮕﺮ ﻓﺎﻳﻞ ﻫﺎ ﺑﺮ روي اﻳﻨﺘﺮﻧﺖ ﺑﻪ ﺳﻤﺖ ﻣﺮورﮔﺮ ﺷﻤﺎ و ﻳﺎ ﺑﺮﻋﻜﺲ )ﺳﻤﺖ ﺳﺮور( اﺳﺖ .زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ ﻳﻚ URL
را در ﻣﺮورﮔﺮ ﺗﺎﻳﭗ ﻣﻲ ﻛﻨﻴﺪ ،ﻳﻚ HTTP://ﺑﻪ آدرس ﺷﻤﺎ اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ
از HTTPﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ﻣﺤﻞ ذﻛﺮ ﺷﺪه اﺳﺘﻔﺎده ﻛﻨﻴﺪ) .اﻏﻠﺐ ﻣﺮورﮔﺮﻫﺎ ﺗﻌﺪاد دﻳﮕﺮي از ﭘﺮوﺗﻜﻞ ﻫﺎ
ﻣﺎﻧﻨﺪ FTPرا ﻧﻴﺰ ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﻨﺪ(
HTTPاز دوﻗﺴﻤﺖ ﺗﺸﻜﻴﻞ ﺷﺪه اﺳﺖ :درﺧﻮاﺳﺖ) (requestو ﭘﺎﺳﺦ ) .(Responseزﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ در
ﻣﺮورﮔﺮ وب ﻳﻚ URLرا ﺗﺎﻳﭗ ﻣﻲ ﻛﻨﻴﺪ ،ﻣﺮورﮔﺮ از ﻃﺮف ﺷﻤﺎ ﻳﻚ درﺧﻮاﺳﺖ اﻳﺠﺎد ﻛﺮده و آن را ارﺳﺎل ﻣﻲ
ﻛﻨﺪ اﻳﻦ درﺧﻮاﺳﺖ ﺷﺎﻣﻞ Urlي ﻛﻪ ﺷﻤﺎ ﺗﺎﻳﭗ ﻛﺮده اﻳﺪ و ﺑﺮﺧﻲ اﻃﻼﻋﺎت دﻳﮕﺮ ﻛﻪ ﺑﻪ ﻣﺮورﮔﺮ ﻣﺮﺑﻮط ﻣﻲ
ﺷﻮد اﺳﺖ .ﺳﺮور اﻳﻦ درﺧﻮاﺳﺖ را درﻳﺎﻓﺖ و ﺑﻪ ﺳﻤﺖ ﻋﻘﺐ )ﺳﻤﺖ ﻣﺮورﮔﺮ( ﭘﺎﺳﺨﻲ را ارﺳﺎل ﻣﻲ ﻛﻨﺪ .ﭘﺎﺳﺦ
ﺷﺎﻣﻞ اﻃﻼﻋﺎﺗﻲ درﺑﺎره ﻣﺤﻞ ﺗﻌﻴﻴﻦ ﺷﺪه داده در URLاﺳﺖ .اﻳﻦ وﻇﻴﻔﻪ ﻣﺮورﮔﺮ اﺳﺖ ﻛﻪ ﭘﺎﺳﺦ را ﺗﻐﻴﻴﺮ داده و آن
را در ﺻﻔﺤﻪ وب ﻧﻤﺎﻳﺶ دﻫﺪ.
درﺧﻮاﺳﺖ ﻫﺎي HTTP
ﻓﺮﻣﺖ ﻳﻚ درﺧﻮاﺳﺖ HTTPﺑﻪ ﺻﻮرت زﻳﺮ اﺳﺖ:
><request-line
><headers
><blank line
]>[<request-body
در ﻳﻚ درﺧﻮاﺳﺖ ،HTTPﺧﻂ اول ﺑﺎﻳﺴﺘﻲ ﻳﻚ ﺧﻂ درﺧﻮاﺳﺖ ﺑﺎﺷﺪ ﺗﺎ ﻧﻮع درﺧﻮاﺳﺖ ،ﻣﻨﺎﺑﻊ در دﺳﺘﺮس ،و
ﻧﺴﺨﻪ HTTPﻛﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد را ﻧﺸﺎن دﻫﺪ .ﺧﻂ ﺑﻌﺪ ،ﻳﻚ ﻗﻄﻌﻪ headerاﺳﺖ ﻛﻪ اﻃﻼﻋﺎت
اﺿﺎﻓﻲ ﻛﻪ ﺗﻮﺳﻂ ﺳﺮور ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﻌﺪ از Headerﻳﻚ ﺧﻂ ﺧﺎﻟﻲ وﺟﻮد
داردﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ اﻃﻼﻋﺎت اﺿﺎﻓﻲ ﭘﺮ ﺷﻮد.
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 42ﻓﺼﻞ 3
اﻧﻮاع ﻣﺨﺘﻠﻔﻲ از درﺧﻮاﺳﺖ وﺟﻮد دارد ﻛﻪ در HTTPﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد اﻣﺎ دو ﻧﻮع ﻣﻮرد ﺗﻮﺟﻪ ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن
Ajaxدرﺧﻮاﺳﺖ ﻫﺎي ﻧﻮع GET :و POSTﻣﻲ ﺑﺎﺷﻨﺪ .ﻫﺮ زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ ﻳﻚ URLرا در ﻣﺮورﮔﺮ وب ﺗﺎﻳﭗ
ﻛﻨﻴﺪ ،ﺑﺮاي آن ،URLﻳﻚ درﺧﻮاﺳﺖ GETﺑﻪ ﺳﻤﺖ ﺳﺮور ارﺳﺎل ﻣﻲ ﻛﻨﻴﺪ ،ﻛﻪ ﺑﻄﻮر ﻛﻠﻲ ﺑﻪ ﺳﺮور ﻣﻲ ﮔﻮﻳﺪ
ﻛﻪ ﻣﻨﺎﺑﻊ را ﺑﮕﻴﺮد و آن را ﺑﻪ ﺳﻤﺖ ﻋﻘﺐ ارﺳﺎل ﻛﻨﺪ .اﻳﻨﺠﺎ ﻳﻚ ﻣﺜﺎل از ﭼﻴﺰي ﻛﻪ درﺧﻮاﺳﺖ GETﺑﺮاي آدرس
www.sample.comﻣﻲ ﺗﻮاﻧﺪ ﻧﺸﺎن دﻫﺪ آورده ﺷﺪه اﺳﺖ:
GET / HTTP/1.1
Host: www.sample.com
;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US
)rv:1.7.6
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
ﺧﻂ اول ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ ﻧﻮع درﺧﻮاﺳﺖ GETاﺳﺖ .ﻗﺴﻤﺖ دوم ) (HTTPاز آن ﺧﻂ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻛﻪ
درﺧﻮاﺳﺖ ﺑﺮاي ﻳﻚ Domainاﺳﺖ اﻧﺘﻬﺎي ﺧﻂ درﺧﻮاﺳﺖ ﻣﻌﻠﻮم ﻣﻲ ﻛﻨﺪ ﻛﻪ از ﻧﺴﺨﻪ HTTP ،1.1اﺳﺘﻔﺎده
ﻣﻲ ﺷﻮد) .ﻧﺴﺨﻪ ﻗﺒﻠﻲ آن 1.0ﺑﻮده اﺳﺖ( اﻣﺎ درﺧﻮاﺳﺖ ﺑﻪ ﻛﺠﺎ ارﺳﺎل ﺷﺪه اﺳﺖ؟ اﻳﻦ ﻣﻮﺿﻮع در ﺧﻂ دوم
ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .ﺧﻂ دوم اوﻟﻴﻦ Headerدر درﺧﻮاﺳﺖ اﺳﺖ .ﻫﺪر ،Hostﻣﻘﺼﺪ درﺧﻮاﺳﺖ را ﻧﺸﺎن ﻣﻲ
دﻫﺪ .ﺗﺮﻛﻴﺐ Hostﺑﺎ اﺳﻠﺶ ﺟﻠﻮ) (/در ﺧﻂ اول ﺑﻪ ﺳﺮور اﻋﻼم ﻣﻲ ﻛﻨﺪ ﻛﻪ درﺧﻮاﺳﺖ ﺑﺮاي
www.sample.comاﺳﺖ) .ﻫﺪر Hostدر Http1.1ﻻزم اﺳﺖ در ﻧﺴﺨﻪ ﻗﺒﻞ از آن ﻻزم ﻧﺒﻮد(.
ﺧﻂ ﺳﻮم ﺷﺎﻣﻞ User-Agentاﺳﺖ ،ﻛﻪ ﻫﻢ اﺳﻜﺮﻳﭙﺘﻬﺎي ﺳﻤﺖ ﺳﺮور و ﻫﻢ ﻛﻼﻳﻨﺖ ﺑﻪ آن دﺳﺘﺮﺳـﻲ دارﻧـﺪ و
در ﺑﺮﺧﻲ ﻣﺮورﮔﺮﻫﺎ ﺑﺮاي ﻳﺎﻓﺘﻦ ﺧﻄﺎﻫﺎي ﻣﻨﻄﻘﻲ ﻻزم اﺳﺖ .اﻳﻦ اﻃﻼﻋﺎت ﺗﻮﺳﻂ ﻣﺮورﮔﺮ ﻣﻮرد اﺳﺘﻔﺎده ﺷﻤﺎ اﻳﺠﺎد
ﻣﻲ ﺷﻮﻧﺪ) .در اﻳﻦ ﻣﺜﺎل (Firefoxو ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﻴﻚ در ﻫﺮ درﺧﻮاﺳﺖ ﺑﺮاي ﺳﺮور ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ .ﺧـﻂ
آﺧﺮ Connectionاﺳﺖ ﻛﻪ ﺑﺮاي ﻧﻤﻮﻧﻪ ﺑﺎﻻ ﺑﺎ Keep-Aliveﻣﻘﺪاردﻫﻲ ﺷﺪه اﺳﺖ) .ﻣﻲ ﺗﻮاﻧـﺪ ﺑـﺎ ﻣﻘـﺎدﻳﺮ
دﻳﮕﺮي ﻧﻴﺰ ﺳﺖ ﺷﻮد ﻛﻪ ﺧﺎرج از ﺑﺤﺚ ﻛﺘﺎب اﺳﺖ (.ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻳﻚ ﺧﻂ ﺧـﺎﻟﻲ ﺑﻌـﺪ از آﺧـﺮﻳﻦ Header
وﺟﻮد دارد ﺑﺎ اﻳﻨﻜﻪ ﻫﻴﭻ ﺑﺪﻧﻪ درﺧﻮاﺳﺘﻲ وﺟـﻮد ﻧـﺪارد وﻟـﻲ ﺧـﻂ ﺧـﺎﻟﻲ ﻻزم اﺳـﺖ .اﮔـﺮ ﻳـﻚ زﻳـﺮ دﻣـﻴﻦ ﻣﺎﻧﻨـﺪ
www.sample.com/booksرا درﺧﻮاﺳﺖ ﻛﻨﻴﺪ درﺧﻮاﺳﺖ ﺷﻤﺎ ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
GET /books/ HTTP/1.1
Host: www.sample.com
;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US
)rv:1.7.6
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ ﺗﻨﻬﺎ ﺧﻂ اول ﺗﻐﻴﻴﺮ ﻛﺮده اﺳﺖ ﻛﻪ ﺷﺎﻣﻞ ﻗﺴﻤﺘﻲ اﺳﺖ ﻛﻪ ﺑﻌﺪ از www.sample.com
در URLآﻣﺪه اﺳﺖ.
ﻓﺼﻞ 43 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
ارﺳﺎل ﭘﺎراﻣﺘﺮ ﺑﺮاي Getﻧﻴﺎزﻣﻨﺪ اﻳﻦ اﺳﺖ ﻛﻪ اﻃﻼﻋﺎت ﺧﺎرﺟﻲ را ﺑﻪ URLاﺿﺎﻓﻪ ﻛﻨﻴﺪ:
URL ? name1=value1&name2=value2&..&nameN=valueN
اﻳﻦ اﻃﻼﻋﺎت ﻛﻪ رﺷﺘﻪ queryﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮﻧﺪ ،در ﺧﻂ درﺧﻮاﺳﺖ از ﻳﻚ درﺧﻮاﺳﺖ HTTPﺗﻜﺮار ﻣﻲ ﺷﻮﻧﺪ:
GET /books/?name=root%20Directory HTTP/1.1
Host: www.sample.com
;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US
)rv:1.7.6
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﻦ " ،"root Directoryﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﺑﺎ URLارﺳﺎل ﻣﻲ ﺷﻮد ،ﺑﺎﻳﺴﺘﻲ
رﻣﺰﮔﺬاري ﺷﻮد ،ﺑﻪ ﻫﻤﻴﻦ ﺧﺎﻃﺮ ﺟﺎي ﺧﺎﻟﻲ ﺑﺎ %20ﺟﺎﻳﮕﺰﻳﻦ ﻣﻲ ﺷﻮد .ﺑﻪ اﻳﻦ اﻣﺮ encodeﻛﺮدن URLﮔﻔﺘﻪ
ﻣﻲ ﺷﻮد و در ﻗﺴﻤﺖ ﻫﺎي ﻣﺨﺘﻠﻒ HTTPاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد) .ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻳﻚ ﺗﺎﺑﻊ داﺧﻠﻲ دارد ﻛﻪ ﻋﻤﻠﻴﺎت
رﻣﺰﮔﺬاري و رﻣﺰﮔﺸﺎﺋﻲ URLرا اﻧﺠﺎم ﻣﻲ دﻫﺪ .درﺑﺎره اﻳﻦ ﺗﺎﺑﻊ ﺑﻌﺪاً در اﻳﻦ ﻓﺼﻞ ﺑﺤﺚ ﺧﻮاﻫﺪ ﺷﺪ (.ﻣﻘﺎدﻳﺮ
ﻓﻴﻠﺪﻫﺎي ﻣﺨﺘﻠﻒ ﺑﺎ ﻳﻚ آﻣﭙﺮﺳﻨﺪ "&" از ﻫﻢ ﺟﺪا ﻣﻲ ﺷﻮﻧﺪ.
ﺑﺴﻴﺎري از ﺗﻜﻨﻮﻟﻮژﻳﻬﺎي ﺳﻤﺖ ﺳﺮور ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺑﺪﻧﻪ درﺧﻮاﺳﺖ را رﻣﺰﮔﺸﺎﺋﻲ ﻣﻲ ﻛﻨﻨﺪ و دﺳﺘﺮﺳﻲ ﺑﻪ
اﻳﻦ ﻣﻘﺎدﻳﺮ را ﺑﻪ روش ﻫﺎي ﮔﻮﻧﺎﮔﻮﻧﻲ ﻣﻤﻜﻦ ﻣﻲ ﺳﺎزﻧﺪ .اﻟﺒﺘﻪ ،اﻳﻦ ﻣﺮﺑﻮط ﺑﻪ ﺳﺮور اﺳﺖ ﻛﻪ ﺑﺎ اﻳﻦ داده ﻫﺎ ﭼﻪ ﻛﺎر
ﻛﻨﺪ .از ﺳﻮي دﻳﮕﺮ ،درﺧﻮاﺳﺖ ،POSTاﻃﻼﻋﺎت را ﺑﻪ ﺑﺪﻧﻪ درﺧﻮاﺳﺖ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ .ﻣﺜﻼ ،زﻣﺎﻧﻲ ﻛﻪ ﺷﻤﺎ ﻳﻚ
ﻓﺮم onlineرا ﭘﺮ و آن را submitﻣﻲ ﻛﻨﻴﺪ ،داده ﻫﺎ ﺑﻪ ﺻﻮرت درﺧﻮاﺳﺖ POSTارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ.
اﻳﻨﺠﺎ ﻧﻤﻮﻧﻪ اي از درﺧﻮاﺳﺖ POSTآﻣﺪه اﺳﺖ:
POST / HTTP/1.1
Host: www.sample.com
;User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US
)rv:1.7.6
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=root%20Directory&OS=Unix
ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﭼﻨﺪﻳﻦ ﺗﻔﺎوت ﻣﻬﻢ ﺑﻴﻦ درﺧﻮاﺳﺖ POSTو درﺧﻮاﺳﺖ GETﺗﻮﺟﻪ ﻛﻨﻴﺪ .اول اﻳﻨﻜﻪ ﺧﻂ درﺧﻮاﺳﺖ
ﺑﺠﺎي GETﺑﺎ POSTﺷﺮوع ﻣﻲ ﺷﻮد ،ﻛﻪ ﻧﻮع درﺧﻮاﺳﺖ را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺒﻴﻨﻴﺪ ﻛﻪ ﻫﺪرﻫﺎي
Hostو User-Agentﻫﻤﺮاه ﺑﺎ دو ﻣﻮرد ﺟﺪﻳﺪ ﺳﺮﺟﺎي ﺧﻮدﺷﺎن ﻫﺴﺘﻨﺪ .ﻫﺪر Content-Typeﻧﺸﺎن
ﻣﻲ دﻫﺪ ﻛﻪ ﺑﺪﻧﻪ درﺧﻮاﺳﺖ ﭼﮕﻮﻧﻪ ﻛﺪ ﺷﺪه اﺳﺖ .ﻣﺮورﮔﺮ ﻫﻤﻴﺸﻪ داده POSTرا ﺑﻪ ﺻﻮرت
application/x-www-form-urlencodedرﻣﺰﮔﺬاري ﻣﻲ ﻛﻨﺪ ﻛﻪ رﻣﺰﮔﺬاري ﺳﺎده URLاز
ﻧﻮع MIMEاﺳﺖ .ﻫﺪر Content-Lengthﻃﻮل ﺑﺎﻳﺖ ﻫﺎي ﺑﺪﻧﻪ درﺧﻮاﺳﺖ را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﭘﺲ از
Connectionﻳﻚ ﺧﻂ ﺧﺎﻟﻲ در ﺑﺪﻧﻪ درﺧﻮاﺳﺖ وﺟﻮد دارد ،ﻛﻪ در ﺑﻴﺸﺘﺮ ﻣﺮورﮔﺮﻫﺎ ﻳﻚ ﺟﻔﺖ >ﻧﺎم-
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 44ﻓﺼﻞ 3
ﻣﻘﺪار< ﻣﻲ ﺳﺎزد ﻛﻪ در اﻳﻨﺠﺎ nameﺑﺮاﺑﺮ ﺑﺎ root Directoryو OSﺑﺎ Unixﺑﺮاﺑﺮ اﺳﺖ .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ
ﺑﺒﻴﻨﻴﺪ ﻛﻪ اﻳﻦ ﻓﺮﻣﺖ ﺷﺒﻴﻪ ﭘﺎراﻣﺘﺮﻫﺎي رﺷﺘﻪ اي Queryدر URLاﺳﺖ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼ ﮔﻔﺘﻴﻢ ،اﻧﻮاع دﻳﮕﺮ
درﺧﻮاﺳﺖ HTTPوﺟﻮد دارد ،وﻟﻲ آن ﻫﺎ ﻧﻴﺰ از ﻓﺮﻣﺖ ﻫﺎي ﺷﺒﻴﻪ POSTو GETﺗﺒﻌﻴﺖ ﻣﻲ ﻛﻨﻨﺪ .ﮔﺎم ﺑﻌﺪي
ﻧﮕﺎه ﺑﻪ ﭼﻴﺰي اﺳﺖ ﻛﻪ ﺳﺮور ﺑﻪ ﺳﻤﺖ ﻋﻘﺐ )ﺳﻤﺖ ﻣﺮورﮔﺮ( ،ﺑﻌﻨﻮان ﭘﺎﺳﺦ درﺧﻮاﺳﺖ HTTPارﺳﺎل ﻣﻲ ﻛﻨﺪ.
ﭘﺎﺳﺦ HTTP
ﻓﺮﻣﺖ ﻳﻚ ﭘﺎﺳﺦ ،HTTPﻛﻪ ﺧﻴﻠﻲ ﺷﺒﻴﻪ درﺧﻮاﺳﺖ آن اﺳﺖ ،در زﻳﺮ آﻣﺪه اﺳﺖ:
><status-line
><headers
><blank line
]>[<response-body
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ،ﺗﻨﻬﺎ ﺗﻔﺎوت ﭘﺎﺳﺦ ﺑﺎ ﻳﻚ درﺧﻮاﺳﺖ اﻳﻦ اﺳﺖ ﻛﻪ ﺧﻂ اول ﺷﺎﻣﻞ اﻃﻼﻋﺎت وﺿﻌﻴﺖ ﺑﻪ
ﺟﺎي اﻃﻼﻋﺎت درﺧﻮاﺳﺖ اﺳﺖ .ﺧﻂ وﺿﻌﻴﺖ درﺑﺎره ﻣﻨﺎﺑﻊ درﺧﻮاﺳﺖ ﺷﺪه ﺑﻮﺳﻴﻠﻪ ﻳﻚ ﻛﺪ ﺣﺎﻟﺖ اﻃﻼع رﺳﺎﻧﻲ
ﻣﻲ ﻛﻨﺪ .اﻳﻨﺠﺎ ﻳﻚ ﭘﺎﺳﺦ ﺳﺎده HTTPآﻣﺪه اﺳﺖ:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
><html
><head
><title>Wrox Homepage</title
></head
><body
><!-- body goes here --
></body
></html
دراﻳﻦ ﻣﺜﺎل ﺧﻂ وﺿﻌﻴﺖ ﻳﻚ ﻛﺪ وﺿﻌﻴﺖ 200 ،HTTPو ﻳﻚ ﭘﻴﻐﺎم okاﺳﺖ .ﺧﻂ وﺿﻌﻴﺖ ﻫﻤﻴﺸﻪ ﺷﺎﻣﻞ ﻛﺪ
وﺿﻌﻴﺖ و ﻳﻚ ﭘﻴﻐﺎم ﻛﻮﺗﺎه اﺳﺖ .ﻣﻬﻤﺘﺮﻳﻦ ﻛﺪﻫﺎي ﺣﺎﻻت در زﻳﺮ آﻣﺪه اﻧﺪ:
:(ok) 200ﻣﻨﺒﻊ ﭘﻴﺪا ﺷﺪه اﺳﺖ و ﻫﻤﻪ ﭼﻴﺰ ﺧﻮب ﻣﻲ ﺑﺎﺷﺪ.
:(NOT MODIFIED) 300ﻣﻨﺒﻊ ﻧﺘﻮاﻧﺴﺘﻪ ﺑﻌﺪ درﺧﻮاﺳﺖ آﺧﺮ اﺻﻼح ﺷﻮد .اﻳﻦ ﻛﺪ ﺑﻴﺸﺘﺮ اوﻗﺎت ﺑﺮاي ﻣﻜﺎﻧﻴﺰم
ﻫﺎي cacheﻣﺮورﮔﺮ ﺑﻪ ﻛﺎر ﻣﻲ رود.
:(UNAUTHORIZED) 401ﻛﻼﻳﻨﺖ ﺣﻖ دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻨﺒﻊ را ﻧﺪارد .اﻏﻠﺐ ﺑﺎﻋﺚ ﻣﻲ ﺷﻮد ﻛﻪ ﻣﺮورﮔﺮ ﺑﺮاي
loginﺑﻪ ﺳﺮور ﻧﺎم ﻛﺎرﺑﺮي و ﭘﺴﻮرد را درﺧﻮاﺳﺖ ﻛﻨﺪ.
:(FORBIDDEN) 403ﻛﻼﻳﻨﺖ در دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻨﺎﺑﻊ ﺑﺎ ﺧﻄﺎ ﻣﻮاﺟﻌﻪ ﺷﺪه اﺳﺖ .اﻳﻦ ﻧﻮع زﻣﺎﻧﻲ اﺗﻔﺎق ﻣﻲ اﻓﺘﺪ
ﻛﻪ ﺷﻤﺎ ﺑﻌﺪ از 401ﻧﺘﻮاﻧﻴﺪ ﺑﺎ ﻳﻚ اﺳﻢ ﻛﺎرﺑﺮي ﺻﺤﻴﺢ loginﻛﻨﻴﺪ.
:(NOT FOUND) 404ﻣﻨﺒﻊ در ﻣﺤﻞ ﻣﻮرد ﻧﻈﺮ وﺟﻮد ﻧﺪارد.
ﻓﺼﻞ 45 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
در ﺧﻂ وﺿﻌﻴﺖ ،ﻫﺪرﻫﺎي دﻳﮕﺮي ﻧﻴﺰ ﻣﻮﺟﻮدﻧﺪ .ﺑﻄﻮر ﻧﻤﻮﻧﻪ ،ﺳﺮور ﻳﻚ ﻫﺪر Dateرا ﺑﺮﻣﻲ ﮔﺮداﻧﺪ ﻛﻪ زﻣﺎن و
ﺗﺎرﻳﺦ اﻳﺠﺎد ﭘﺎﺳﺦ را ﻧﺸﺎن ﻣﻲ دﻫﺪ) .ﺳﺮور اﻃﻼﻋﺎﺗﻲ در ﻣﻮرد ﺧﻮدش ﻧﻴﺰ ارﺳﺎل ﻣﻲ ﻛﻨﺪ ،اﮔﺮ ﭼﻪ ﻣﻮرد ﻧﻴﺎز
ﻧﺒﺎﺷﻨﺪ( دو ﻫﺪر ﺑﻌﺪي ﺑﺎﻳﺪ آﺷﻨﺎ ﺑﺎﺷﻨﺪ ،آن ﻫﺎ Content-Typeو Content-Lengthﻛﻪ در
درﺧﻮاﺳﺖ POSTﻧﻴﺰ اﺳﺘﻔﺎده ﻣﻲ ﺷﺪﻧﺪ ،ﻫﺴﺘﻨﺪ .در اﻳﻦ ﻣﺜﺎل ،ﻫﺪر Content-Typeﻧﻮع MIMEرا ﺑﺮاي
text/htmlﺑﺎ ﻳﻚ رﻣﺰﮔﺬاري از ﻧﻮع ISO-8859-1ﺗﻌﻴﻴﻦ ﻣﻲ ﻛﻨﺪ) .ﻛﻪ اﺳﺘﺎﻧﺪارد ﻣﻨﺎﺑﻊ اﻧﮕﻠﻴﺴﻲ اﻳﺎﻻت
ﻣﺘﺤﺪه اﺳﺖ (.ﺑﺪﻧﻪ ﭘﺎﺳﺦ ﺷﺎﻣﻞ ﻳﻚ ﻛﺪ HTMLﺳﺎده اﺳﺖ .اﻳﻦ ﻫﻤﺎن ﭼﻴﺰي اﺳﺖ ﻛﻪ ﻣﺮورﮔﺮ ﺑﻪ ﻛﺎرﺑﺮ ﻧﺸﺎن
ﺧﻮاﻫﺪ داد .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ اﺷﺎره اي ﺑﻪ ﻧﻮع درﺧﻮاﺳﺖ ﻛﻪ ﭘﺎﺳﺦ ﺑﺮاي آن ارﺳﺎل ﻣﻲ ﺷﻮد ﻧﻴﺴﺖ؛ اﮔﺮ ﭼﻪ ،اﻳﻦ
ﻣﻄﻠﺐ اﺛﺮي ﺑﺮ روي ﺳﺮور ﻧﺪارد .اﻳﻦ ﻣﻄﻠﺐ ﻣﺮﺑﻮط ﺑﻪ ﻛﻼﻳﻨﺖ اﺳﺖ ﻛﻪ ﺑﺪاﻧﺪ ﭼﻪ ﻧﻮع داده اي ﺑﺮاي ﻫﺮ ﻧﻮع
درﺧﻮاﺳﺖ ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺳﻤﺖ ﻋﻘﺐ ﺑﺮﮔﺮداﻧﺪه ﺷﻮد ﺗﺎ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮد ﭼﮕﻮﻧﻪ از داده ﺑﺎﻳﺴﺘﻲ اﺳﺘﻔﺎده ﻛﻨﺪ.
درﺧﻮاﺳﺖ XMLHttp
XMlHttpاﺑﺘﺪا در IE5ﺑﺎ ﻳﻚ ActiveXﻣﻌﺮﻓﻲ ﺷﺪ .ﺷﻲ XMlHttpﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن را ﺑﻪ اﻳﺠﺎد
درﺧﻮاﺳﺖ Httpاز ﻫﺮ ﻛﺠﺎي ﻳﻚ ﺑﺮﻧﺎﻣﻪ ﻗﺎدر ﻣﻲ ﺳﺎزد .ﺑﺮاي اﻳﻦ درﺧﻮاﺳﺖ ﻳﻚ XMLﺑﻪ ﻋﻨﻮان ﭘﺎﺳﺦ
ﺑﺮﮔﺮداﻧﺪه ﻣﻲ ﺷﻮد ،ﺑﻪ ﻫﻤﻴﻦ ﺧﺎﻃﺮ XMlHttpﻳﻚ روش ﺳﺎده ﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت از ﻃﺮﻳﻖ XMLرا
ﻣﻬﻴﺎ ﻣﻲ ﻛﻨﺪ.
Mozilaﻧﻴﺰ ﺑﻌﺪاً XMlHttpرا در ﻣﺮورﮔﺮﻫﺎي ﺧﻮد )ﻣﺎﻧﻨﺪ (Firefoxﻗﺮار داد .ﺑﻌﺪ از آن ﻣﺮورﮔﺮﻫﺎي
) Safariﺑﻌﺪ از ﻧﺴﺨﻪ (1,2و ) Operaﻧﺴﺨﻪ 7,6ﺑﻪ ﺑﺎﻻ( از آن ﺣﻤﺎﻳﺖ ﻛﺮدﻧﺪ .اﻣﺮوزه ،ﺗﻘﺮﻳﺒﺎ اﻛﺜﺮ
ﻣﺮورﮔﺮﻫﺎي ﻣﻄﺮح از اﻳﻦ ﻧﻮع درﺧﻮاﺳﺖ ﺣﻤﺎﻳﺖ ﻣﻲ ﻛﻨﻨﺪ .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ XMlHttpاﺳﺘﺎﻧﺪارد W3C
ﻧﻴﺴﺖ ،ﺑﻪ ﻫﻤﻴﻦ ﺧﺎﻃﺮ رﻓﺘﺎرﻫﺎي ﻣﺘﻔﺎوﺗﻲ از آن را ﻣﻲ ﺗﻮان در ﻣﺮورﮔﺮﻫﺎي ﻣﺨﺘﻠﻒ ﻣﺸﺎﻫﺪه ﻛﺮد ،وﻟﻲ اﻛﺜﺮ ﻣﺘﺪﻫﺎ
و ﺻﻔﺎت ﻣﻬﻢ در ﻫﻤﻪ آن ﻫﺎ ﺑﻪ ﻳﻚ ﺻﻮرت ﺣﻤﺎﻳﺖ ﻣﻲ ﺷﻮﻧﺪ.
ﺑﺎﻳﺴﺘﻲ ﺑﻪ اﻳﻦ ﻣﻮﺿﻮع اﺷﺎره ﻛﺮد ﻛﻪ اﮔﺮ ﻛﺎرﺑﺮان ﺑﺎ ﻣﺮورﮔﺮﻫﺎي ﻗﺪﻳﻤﻲ ﺗﺮ ﺑﻪ وب ﺷﻤﺎ دﺳﺘﺮﺳﻲ دارﻧﺪ ﺑﺎﻳﺴﺘﻲ در
اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ ﺗﺠﺪﻳﺪ ﻧﻈﺮ ﻛﻨﻴﺪ.
اﻳﺠﺎد ﺷﻲ XMlHttp
ﺑﺎ اﺳﺘﻔﺎده از ﺑﺮاي ارﺳﺎل درﺧﻮاﺳﺖ و ﭘﺮدازش ﭘﺎﺳﺦ ﺑﺎﻳﺴﺘﻲ اﺑﺘﺪا ﻳﻚ ﺷﻲXMLHttpRequest
ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ اﻳﻦ ﻣﻮﺿﻮع ﻛﻪ XMLHttpRequestاﺳﺘﺎﻧﺪارد W3Cﻧﻴﺴﺖ ،ﻣﻲ
ﺑﺎﻳﺴﺘﻲ از روش ﻫﺎي ﻛﻪ ﻣﺮورﮔﺮﻫﺎ از آن ﺣﻤﺎﻳﺖ ﻣﻲ ﻛﻨﻨﺪ ﺑﻪ اﻳﺠﺎد ﺷﻲ ﻣﺒﺎدرﺗﺖ ﻛﺮد ،IE .ﺑﻮﺳﻴﻠﻪ ﻳﻚ ﺷﻲ
،ActiveXﺷﻲ XMLHttpRequestرا اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ در ﺣﺎﻟﻲ ﻛﻪ ﻣﺮورﮔﺮﻫﺎي دﻳﮕﺮ ﻣﺎﻧﻨﺪ ،Firefox
،Safari،Operaآن را ﺑﻪ ﺻﻮرت ﻳﻚ ﺷﻲ ﺟﺎوااﺳﻜﺮﻳﭙﺘﻲ ﭘﻴﺎده ﺳﺎزي ﻣﻲ ﻛﻨﻨﺪ .ﺑﺨﺎﻃﺮ اﻳﻦ ﻣﻮﺿﻮع ،ﻛﺪ
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 46ﻓﺼﻞ 3
ﻣﺸﻜﻠﻲ ﻛﻪ اﻳﻨﺠﺎ وﺟﻮد دارد ،وﺟﻮد ﭼﻨﺪﻳﻦ ﻧﺴﺨﻪ از ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي MSXMLاﺳﺖ .ﭼﻮن ﻫﺮ ﻧﺴﺨﻪ ﺳﺮﻋﺖ و ﺛﺒﺎت
ﺧﻮد را دارد ،ﺑﺎﻳﺪ ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪﻛﻪ از ﺟﺪﻳﺪﺗﺮﻳﻦ ﻧﺴﺨﻪ ﻛﻪ ﻣﺎﺷﻴﻦ ﻛﺎرﺑﺮ از آن ﺣﻤﺎﻳﺖ ﻣﻲ ﻛﻨﺪ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ
ﻳﺎ ﻧﻪ؟ ﺑﺪﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﻧﺴﺨﻪ ﻫﺎي ﻣﻮﺟﻮد را ﺑﺮرﺳﻲ ﻛﻨﻴﺪ.
ﻧﺴﺨﻪ ﻫﺎي ﻣﻮﺟﻮد MSXMLﺑﻪ ﻗﺮار زﻳﺮ ﻣﻲ ﺑﺎﺷﺪ:
- Microsoft.XMLHttp
- MSXML2.XMLHttp
- MSXML2.XMLHttp.3.0
- MSXML2.XMLHttp.4.0
- MSXML2.XMLHttp.5.0
ﻣﺘﺎﺳﻔﺎﻧﻪ ،ﺗﻨﻬﺎ راه ﺗﺸﺨﻴﺺ ﺑﻬﺘﺮﻳﻦ ﻧﺴﺨﻪ ﺑﺮاي اﺳﺘﻔﺎده ،ﺳﻌﻲ در اﻳﺠﺎد ﻫﺮ ﻳﻚ از اﻳﻦ ﻧﺴﺨﻪ ﻫﺎ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺨﺎﻃﺮ
اﻳﻨﻜﻪ اﻳﻦ ﻧﺴﺨﻪ ﻫﺎ ﻛﻨﺘﺮل ActiveXﻫﺴﺘﻨﺪ ،ﻧﺎﺗﻮاﻧﻲ در اﻳﺠﺎد ﻫﺮ ﻳﻚ از آن ﻫﺎ ﻣﻨﺠﺮ ﺑﻪ اﻳﺠﺎد ﻳﻚ ﺧﻄﺎ ﺧﻮاﻫﺪ
ﺷﺪ ،اﻳﻦ ﻣﻮرد ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ از ﺑﻠﻮك try…catchاﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻨﺼﻮرت ﺑﺎ اﻳﺠﺎد
ﻳﻚ ﺧﻄﺎ در ﻳﻚ ActiveXﺳﻌﻲ در اﻳﺠﺎد ﻳﻚ ﻧﻤﻮﻧﻪ XMLHttpRequestﺑﺎ اﺳﺘﻔﺎده از ActiveX
ﺑﻌﺪي ﻣﻲ ﻛﻨﺪ .اﻳﺠﺎد ﺷﻲ XMLHttpدر ﻣﺮورﮔﺮﻫﺎي دﻳﮕﺮ ﺑﺴﻴﺎر ﺳﺎده ﻣﻲ ﺑﺎﺷﺪ ،ﺗﻨﻬﺎ ﻛﺎﻓﻲ اﺳﺖ از ﻛﺪ زﻳﺮ
ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر اﺳﺘﻔﺎده ﻛﻨﻴﺪ:
;)(var xmlHttp = new XMLHttpRequest
ﻧﺘﻴﺠﻪ ﻛﺎر ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
{ )(function createXMLHttp
{)"if (typeof XMLHttpRequest !="undefined
)(return new XMLHttpRequest
{)}else if (window.ActiveXObject
{try
var xmlHttp = new
;)]ActiveXObject(iEVersion[i
;return xmlHttp
{)}catch(oError
ﻫﻴﭻ ﻋﻤﻠﻲ اﻧﺠﺎم ﻧﻤﻲ ﮔﻴﺮد//
}
}
}
;)"throw new Error("XMLHttp object could be created.
}
ﺗﺎﺑﻊ createXMLHttpاﺑﺘﺪا ﺑﺎ اﺳﺘﻔﺎده از ﻋﻤﻠﮕﺮ typeofﭼﻚ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﻛﻼس
XMLHttpRequestﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ ﻳﺎ ﻧﻪ؟)ﻣﺮورﮔﺮ ازآن ﭘﺸﺘﻴﺒﺎﻧﻲ ﻣﻲ ﻛﻨﺪ ﻳﺎ ﻧﻪ؟(
اﮔﺮ XMLHttpRequestﻣﻮﺟﻮد ﺑﻮد ،از آن ﺑﺮاي اﻳﺠﺎد ﺷﻲ XMLHttpاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ ،در ﻏﻴﺮ اﻳﻨﺼﻮرت
ﭼﻚ ﻣﻲ ﻛﻨﺪ ﻛﻪ آﻳﺎ ﻛﻼس ActiveXObjectﻣﻮﺟﻮد اﺳﺖ ﻳﺎ ﻧﻪ؟ در ﺻﻮرت وﺟﻮد ،دﺳﺘﻪ ActiveXﻫﺎ
را در ﻳﻚ آراﻳﻪ ﻗﺮار ﻣﻲ دﻫﺪ ) .ﺟﺪﻳﺪﺗﺮﻳﻦ ﻧﺴﺨﻪ اﺑﺘﺪاي آراﻳﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮد ( .ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺣﻠﻘﻪ ﺗﻜﺮار
ActivXﻫﺎ را از آراﻳﻪ ﺧﻮاﻧﺪه و ﺳﻌﻲ ﻣﻲ ﻛﻨﺪ ﻳﻚ ﻧﻮع XMLHttpاﻳﺠﺎد ﻛﻨﺪ اﮔﺮ اﻳﻦ ﻛﺎر اﻣﻜﺎن ﻧﺪاﺷﺖ،
ﻋﺒﺎرت catchاز اﻳﺠﺎد ﺧﻄﺎ و ﺗﻮﻗﻒ ﻋﻤﻠﻴﺎت ﺟﻠﻮﮔﻴﺮي ﻣﻲ ﻛﻨﺪ ،ﺳﭙﺲ ﻣﻮرد ﺑﻌﺪي آراﻳﻪ ﻣﻮرد آزﻣﺎﻳﺶ ﻗﺮار
ﻣﻲ ﮔﻴﺮد .زﻣﺎﻧﻲ ﻛﻪ ﻳﻚ ﺷﻲ اﻳﺠﺎد ﺷﺪ ،ﺑﺎ ﺑﺮﮔﺮداﻧﺪن آن ﺷﻲ ﻋﻤﻠﻴﺎت ﺑﻪ ﭘﺎﻳﺎن ﻣﻲ رﺳﺪ ،در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻳﻚ
ﺧﻄﺎ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر throwاﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻧﺸﺎن ﻣﻲ دﻫﺪ ﻋﻤﻠﻴﺎت ﺑﺎ ﺷﻜﺴﺖ ﻣﻮاﺟﻪ ﺷﺪه اﺳﺖ.
ﻣﺘﺪﻫﺎ و ﺻﻔﺎت
اﻛﻨﻮن ﺗﻮاﻧﺴﺘﻪ اﻳﺪ ﻳﻚ ﺷﻲ XMLHttpاﻳﺠﺎد ﻛﻨﻴﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ دﻳﺪﻳﺪ ﺑﺮاي اﻳﺠﺎد اﻳﻦ ﺷﻲ در ﻣﺮورﮔﺮﻫﺎي
ﻣﺨﺘﻠﻒ روﺷﻬﺎي ﻣﺨﺘﻠﻔﻲ را اﻋﻤﺎل ﻛﺮدﻳﻢ ،ﺑﻪ ﻫﻤﻴﻦ ﺧﺎﻃﺮ ﺗﻔﺎوﺗﻬﺎﻳﻲ ﻧﻴﺰ در ﻣﺘﺪﻫﺎ و ﺻﻔﺎت اﻳﻦ ﺷﻲ در
ﻣﺮورﮔﺮﻫﺎي ﻣﺨﺘﻠﻒ ﺧﻮاﻫﻴﻢ دﻳﺪ .ﻣﻲ ﺗﻮاﻧﻴﺪ ﺻﻔﺎت ﺷﻲ XMLHttpRequestاﻳﺠﺎد ﺷﺪه در IEرا در
ﺟﺪول 3-1و ﻣﺘﺪﻫﺎي آن را در ﺟﺪول ،3-2ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .ﺻﻔﺎت اﻳﻦ ﺷﻲ در ﻣﺮورﮔﺮﻫﺎي
netScape،Mozilaو Firefoxدر ﺟﺪول 3-3و ﻣﺘﺪ ﻫﺎي آن در ﺟﺪول 3-4آﻣﺪه اﺳﺖ.
Apple safariﻫﻨﻮز ﻣﺘﺪﻫﺎ و ﺻﻔﺎت ﻛﺎﻣﻞ ﺑﺮاي ﺷﻲ XMLHttpRequestرا اﻋﻼم ﻧﻜﺮده اﺳﺖ ،اﻣﺎ
ﻣﺠﻤﻮﻋﻪ اي از ﺻﻔﺎت ﻋﻤﻮﻣﻲ ﻣﻮرد اﺳﺘﻔﺎده را اﻋﻼم ﻛﺮده اﺳﺖ ،ﻛﻪ در ﺟﺪول 3-5آﻣﺪه اﺳﺖ و ﻣﺘﺪﻫﺎي
ﻋﻤﻮﻣﻲ ،ﻧﻴﺰ در ﺟﺪول 3-6آﻣﺪه اﺳﺖ.
Ajax ﺷﺮوع ﻛﺎر ﺑﺎ 3 ﻓﺼﻞ 48
Method Means
abort Aborts the HTTP request
getAllResponseHeaders Gets all the HTTP
headers
getResponseHeader Gets the value of an
HTTP header
open Opens a request to the
server
Method Means
abort Aborts the HTTP request
Method Means
abort Aborts the HTTP request
ﻣﺜﻼ اﮔﺮ ﺑﺨﻮاﻫﻴﺪ داده ﻫﺎﻳﺘﺎن را ﺑﻪ ﺻﻮرت Xmlارﺳﺎل ﻛﻨﻴﺪ Headerدرﺧﻮاﺳﺘﺘﺎن را ﺑﺎ ﻧﻮع ﻣﺤﺘﻮاي
" "text/xmlﺗﻨﻈﻴﻢ ﻣﻲ ﻛﻨﻴﺪ:
;)”xMLHttp.setRequestHeader(“Content-Type”, “text/xml
ﺳﭙﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺴﺘﻘﻴﻤﺎ xmlﺗﺎن را ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﻴﻢ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﺪ sendارﺳﺎل ﻛﻨﻴﺪ ،ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﭼﻴﺰي
ﺷﺒﻴﻪ اﻳﻦ ﺑﺎﺷﺪ:
;)”>xMLHttp.send(“<doc><name>limit</name><data>5</data></doc
></body
></html
اﻳﻦ ﻛﺪ ،ﺻﻔﺤﻪ ﺑﺎ ﻳﻚ ﻛﻠﻴﺪ و ﻳﻚ ﻣﺘﻦ ﺑﺮ روي آن را اﻳﺠﺎد ﺧﻮاﻫﺪ ﻛﺮد .اﻣﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﻛﻠﻴﺪ ﻣﻨﺠﺮ ﺑﻪ ﻫﻴﭻ
ﻋﻤﻠﻲ ﻧﺨﻮاﻫﺪ ﺷﺪ .در onClickدﻛﻤﻪ ﻗﺴﻤﺖ ﻛﺪي را اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺑﺎ ﻓﺸﺮدن ﻛﻠﻴﺪ ﻋﻤﻠﻴﺎت ﮔﻔﺘﻪ ﺷﺪه
را اﻧﺠﺎم دﻫﺪ.ﻛﺪ زﻳﺮ ﻛﺪ ﺗﺼﺤﻴﺢ ﺷﺪه ﻗﺴﻤﺖ ﻗﺒﻞ ﻣﻲ ﺑﺎﺷﺪ:
><html
><head
><title>Untitled Document</title
53 3 ﻓﺼﻞ Ajax ﺷﺮوع ﻛﺎر ﺑﺎ
</head>
<body>
<input type="button" value="Display Message" onclick =
"getData('Data.txt','targetDiv')">
<div id="targetDiv">
<p>Display Message Hear.</p>
</div>
</body>
</html>
و ﻣﺤﻠﻲ،Data.txt ﻧﺎم ﻓﺎﻳﻞ رﺷﺘﻪ ي: دو ﭘﺎراﻣﺘﺮ رﺷﺘﻪ اي ﻣﻲ ﮔﻴﺮدgetData ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ﺗﺎﺑﻊ
ﻓﺸﺮدن ﻛﻠﻴﺪ روي ﺻﻔﺤﻪ وب ﺟﺰ ﻳﻚ ﭘﻴﻐﺎم ﺧﻄﺎ.targetDivﻛﻪ ﻣﺤﺘﻮاي اﻳﻦ ﻓﺎﻳﻞ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد
.ﻋﻜﺲ اﻟﻌﻤﻞ دﻳﮕﺮي ﺑﻪ ﻫﻤﺮاه ﻧﺨﻮاﻫﺪ داﺷﺖ
ﻗﺒﻼ ﻃﺮﻳﻘﻪ، ﻣﻲ ﺑﺎﺷﺪXMLHttp اﺣﺘﻴﺎج ﺑﻪ ﻳﻚ ﺷﻲAjax ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼ اﺷﺎره ﺷﺪ ﺑﺮاي ﻛﺎر ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﻫﺎي
ﻛﻪ اﻳﻦcreateXMLHttp اﻛﻨﻮن ﺑﺪون ﺗﻮﺿﻴﺢ اﺿﺎﻓﻪ ي ﺗﺎﺑﻊ، را ﺗﻮﺿﻴﺢ دادﻳﻢXMLHttp ي اﻳﺠﺎد ﺷﻲ
.وﻇﻴﻔﻪ را ﺑﺮ ﻋﻬﺪه داﺷﺖ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ
<head>
<title>First Project of Ajax</title>
<script language = "javascript">
function createXMLHttp() {
if (typeof XMLHttpRequest !="undefined"){
return new XMLHttpRequest()
}else if (window.ActiveXObject){
}
}
throw new Error("XMLHttp object could be
created.");
}
</script>
</head>
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 54ﻓﺼﻞ 3
اﻛﻨﻮن ﻧﻴﺎزﻣﻨﺪ اﻳﻦ ﻫﺴﺘﻴﺪ ﻛﻪ از ﻃﺮﻳﻖ ﺗﺎﺑﻊ ﺑﺎﻻ ﻳﻚ ﻧﻤﻮﻧﻪ ﺷﻲ XMLHttpاﻳﺠﺎد ﻛﻨﻴﺪ .و از اﻳﻦ ﻧﻤﻮﻧﻪ ﺷﻲ ﺑﺮاي
اﻧﺠﺎم ﻋﻤﻠﻴﺎت ﻣﻮرد ﻧﻈﺮ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﻛﻨﻮن ﺳﻮاﻟﻲ ﻛﻪ ﻣﻄﺮح ﻣﻲ ﺷﻮد اﻳﻦ اﺳﺖ ﻛﻪ ﭼﮕﻮﻧﻪ از اﻳﻦ ﺷﻲ ﺑﺮاي ﺧﻮاﻧﺪن و ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت اﺳﺘﻔﺎده ﻛﻨﻴﻢ؟
ﻫﻤﻪ اﻳﻦ ﻋﻤﻠﻴﺎت در ﺗﺎﺑﻊ getDataﭘﻴﺎده ﺳﺎزي ﻣﻲ ﺷﻮد.
;)(xmlHttp = createXMLHttp
..
..
..
}
></script
اﻛﻨﻮن ﻳﻚ ﻧﻤﻮﻧﻪ از ﺷﻲ XMLHttpدر ﻣﺘﻐﻴﺮ xmlHttpدارﻳﺪ ،اﻛﻨﻮن ﺑﺎ ﻣﺘﺪ openﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻗﺒﻼ ﺗﻮﺿﻴﺢ
داده ﺷﺪ ﺷﻲ xmlHttpرا ﺑﺮاي اﺳﺘﻔﺎده از URLﻣﻮرد ﻧﻈﺮ ﭘﻴﻜﺮﺑﻨﺪي ﻣﻲ ﻛﻨﻴﻢ .اﻏﻠﺐ از ﻣﺘﺪ GETزﻣﺎﻧﻲ ﻛﻪ
ﻣﻲ ﺧﻮاﻫﻴﺪ اﻃﻼﻋﺎﺗﻲ را ﺑﺎزﻳﺎﺑﻲ ﻛﻨﻴﺪ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد و از ﻣﺘﺪ POSTزﻣﺎﻧﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﺨﻮاﻫﻴﺪ
ﺗﻌﺪادي داده ﺑﺮاي ﺳﺮور ارﺳﺎل ﻛﻨﻴﺪ .در اﻳﻦ ﻣﺜﺎل ﺑﺎ اﺳﺘﻔﺎده از GETﺑﺮاي ﺧﻮاﻧﺪن ﻓﺎﻳﻞ Data.txtﺑﻪ ﺻﻮرت
زﻳﺮ ﻋﻤﻞ ﻣﻲ ﻛﻨﻴﻢ:
>"<script language = "javascript
..
..
ﻓﺼﻞ 55 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
..
..
;)(xmlHttp = createXMLHttp
;)xmlHttp.open("GET", dataSource
..
..
..
}
></script
اﻳﻦ ﻛﺪ ﺷﻲ xmlHttpرا ﺑﺎ اﺳﺘﻔﺎده از URlاي ﻛﻪ ﻣﺸﺨﺺ ﻧﻤﻮده اﻳﺪ )در اﻳﻨﺠﺎ (Data.txtﭘﻴﻜﺮ ﺑﻨﺪي
ﻣﻲ ﻛﻨﺪ ،اﻣﺎ ﻫﻨﻮز ﺑﻪ ﺻﻮرت واﻗﻌﻲ ﺑﻪ ﻓﺎﻳﻞ ﻣﻮرد ﻧﻈﺮ وﺻﻞ ﻧﺸﺪه اﺳﺖ) .اﮔﺮ از ﻳﻚ داﻣﻴﻦ ﺧﺎص اﺳﺘﻔﺎده ﻣﻲ
ﻛﻨﻴﺪ آدرس URLﻣﻮرد ﻧﻈﺮ ﺑﺎﻳﺴﺘﻲ ﺷﺎﻣﻞ آدرس داﻣﻴﻦ ﻧﻴﺰ ﺑﺎﺷﺪ(
ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض اﻳﻦ ارﺗﺒﺎط ﺑﻪ ﺻﻮرت asynchronousﻣﻲ ﺑﺎﺷﺪ ،ﻛﻪ ﺑﺪﻳﻦ ﻣﻌﻨﻲ اﺳﺖ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻣﻨﺘﻈﺮ
ﺧﻮاﻧﺪن ﻓﺎﻳﻞ و داﻧﻠﻮد آن ﻧﻤﻲ ﻣﺎﻧﺪ) .ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﮔﺰﻳﻨﻪ ﺳﻮم ،asyncFlagﺑﺮاي اﺟﺮاي
synchronousﺑﺮﻧﺎﻣﻪ اﺳﺘﻔﺎده ﻛﻨﻴﺪ ،ﻛﻪ ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻫﻤﻪ ﻓﻌﺎﻟﻴﺖ ﻫﺎي ﺧﻮد را ﺗﺎ زﻣﺎن
داﻧﻠﻮد ﻓﺎﻳﻞ ﻣﺘﻮﻗﻒ ﻛﻨﺪ(.
ﺣﺎل ﻓﺮض ﻛﻨﻴﻢ ﺷﻤﺎ اﻃﻼﻋﺎﺗﺘﺎن را ﺑﺮاي ﺳﺮور ارﺳﺎل ﻛﺮده اﻳﺪ و ﺳﺮور ﺑﻪ درﺧﻮاﺳﺖ ﺷﻤﺎ ﭘﺎﺳﺦ داده و ﻓﺎﻳﻞ
Data.txtرا ﺑﺮاﻳﺘﺎن ارﺳﺎل ﻛﺮده اﺳﺖ.اﻛﻨﻮن ﭼﮕﻮﻧﻪ ﺑﺎﻳﺴﺘﻲ از آﻣﺎده ﺑﻮدن اﻃﻼﻋﺎﺗﺘﺎن ﺑﺮاي داﻧﻠﻮد آﮔﺎه
ﺷﻮﻳﺪ ﺗﺎ ﺑﺘﻮاﻧﻴﺪ از آن ﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ؟
ﺷﻲ XMLHttpﻳﻚ ) propertyﺻﻔﺖ ( ﺑﺎ ﻧﺎم onreadystatechangeدارد ﻛﻪ ﺑﺮاي اﻳﻦ ﻣﻨﻈﻮر
ﺗﺪارك دﻳﺪه اﺳﺖ .اﻳﻦ propertyاﺟﺎزه ﻣﺪﻳﺮﻳﺖ ﻋﻤﻠﻴﺎت ﺑﺎرﺷﺪن asynchronousرا ﺑﻪ ﺷﻤﺎ ﻣﻲ دﻫﺪ.
اﮔﺮ ﺷﻤﺎ ﻧﺎم ﻳﻚ ﺗﺎﺑﻊ را ﺑﺮاي اﻳﻦ propertyﻣﺸﺨﺺ ﻛﻨﻴﺪ ،ﻫﺮ زﻣﺎن ﻛﻪ ﺗﻐﻴﻴﺮي در اﺳﻜﺮﻳﭙﺖ ﺷﻤﺎ اﻳﺠﺎد ﺷﺪ
اﻳﻦ propertyﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد ،و آن ﻧﻴﺰ ﺗﺎﺑﻊ ﺷﻤﺎ را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ .اﻟﺒﺘﻪ ﭼﻮن اﻳﻦ ﺗﺎﺑﻊ در ﻣﻮارد دﻳﮕﺮ
ﻛﺎرﺑﺮدي ﻧﺪارد ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺻﻮرت زﻳﺮ آن را داﺧﻞ ﺗﺎﺑﻊ getDataاﻳﺠﺎد ﻛﻨﻴﺪ:
>"<script language = "javascript
..
..
..
..
;)(xmlHttp = createXMLHttp
;)xmlHttp.open("GET", dataSource
{)(xmlHttp.Onreadystatechange = function
..
Ajax ﺷﺮوع ﻛﺎر ﺑﺎ 3 ﻓﺼﻞ 56
..
}
..
..
}
</script>
ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ دو. ﺗﻐﻴﻴﺮي اﻳﺠﺎد ﺷﻮد ﻓﺮاﺧﻮاﻧﻲ ﺧﻮاﻫﺪ ﺷﺪxmlHttp اﻳﻦ ﺗﺎﺑﻊ ﺟﺪﻳﺪ ﻫﺮ زﻣﺎن ﻛﻪ در ﺷﻲ
ﻛﻪ وﺿﻌﻴﺖreadyState .status وreadyState ﺻﻔﺎت: از اﻳﻦ ﺷﻲ را ﺑﺮرﺳﻲ ﻛﻨﻴﺪproperty
: ﻣﻲ ﺗﻮاﻧﺪ داﺷﺘﻪ ﺑﺎﺷﺪ را ﻣﻲ آورﻳﻢreadyState اﻳﻨﺠﺎ ﻣﻘﺎدﻳﺮ ﻣﻤﻜﻨﻲ ﻛﻪ،ﻟﻮد ﺷﺪن داده ﻫﺎ را اﻋﻼم ﻣﻲ ﻛﻨﺪ
- 0 uninitialized ()ﻣﻘﺪار دﻫﻲ ﻧﺸﺪه
- 1 loading ()در ﺣﺎل ﻟﻮد
- 2 loaded ()ﻟﻮد ﺷﺪه
- 3 interactive ()در ﺣﺎل ﺗﺒﺎدل داده
- 4 complete ()ﻛﺎﻣﻞ
. ﺑﻪ ﻣﻌﻨﻲ اﻳﻦ اﺳﺖ ﻛﻪ داده ﻫﺎي ﺷﻤﺎ ﻛﺎﻣﻼ داﻧﻠﻮد ﺷﺪه اﻧﺪ4 ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ
ﺑﺪﻳﻦ ﻣﻌﻨﻲ200 آﻣﺪه اﺳﺖ )ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪstatus در اﻳﻨﺠﺎ ﺑﺮﺧﻲ ﻣﻘﺎدﻳﺮ ﻣﻤﻜﻦ ﺑﺮاي:status ﺻﻔﺖ
(.اﺳﺖ ﻛﻪ ﻫﻤﻪ ﭼﻴﺰ ﺧﻮب ﭘﻴﺶ ﻣﻲ رود
- 200 OK
- 201 Created
- 204 No Content
- 205 Reset Content
- 206 Partial Content
- 400 Bad Request
- 401 Unauthorized
- 403 Forbidden
- 404 Not Found
- 405 Method Not Allowed
- 406 Not Acceptable
- 407 Proxy Authentication Required
- 408 Request Timeout
- 411 Length Required
- 413 Requested Entity Too Large
- 414 Requested URL Too Long
- 415 Unsupported Media Type
- 500 Internal Server Error
- 501 Not Implemented
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
- 505 HTTP Version Not Supported
ﻓﺼﻞ 57 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
ﺑﺮاي اﻃﻤﻴﻨﺎن از داﻧﻠﻮد ﻛﺎﻣﻞ اﻃﻼﻋﺎﺗﺘﺎن و ﺧﻮب ﺑﻮدن ﻫﻤﻪ ﭼﻴﺰ ،ﺑﺎﻳﺪ ﻣﻄﻤﺌﻦ ﺷﻮﻳﺪ ﻛﻪ ﺻﻔﺖ readyState
ﺑﺮاﺑﺮ 4و ﺻﻔﺖ statusﺑﺎ 200ﺑﺮاﺑﺮ اﺳﺖ .اﻳﻨﺠﺎ ﭼﮕﻮﻧﮕﻲ ﭘﻴﺎده ﺳﺎزي آن را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﻢ:
>"<script language = "javascript
..
..
..
..
;)(xmlHttp = createXMLHttp
;)xmlHttp.open("GET", dataSource
{)(xmlHttp.Onreadystatechange = function
&& if(xmlHttp.readyState == 4
{)xmlHttp.status == 200
..
..
}
}
..
..
}
></script
ﺣﺎﻻ ﻣﺮورﮔﺮ اﻃﻼﻋﺎت را ﺑﺪﺳﺖ آورده اﺳﺖ ،وﻟﻲ ﺷﻤﺎ ﭼﮕﻮﻧﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ اﻳﻦ اﻃﻼﻋﺎت دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ.
ﺑﺮاي ﮔﺮﻓﺘﻦ داده ﻫﺎ از ﺷﻲ XMLHttpدو روش وﺟﻮد دارد:
-اﮔﺮ ﺷﻤﺎ ﺑﺎ داده ﻫﺎي درﻳﺎﻓﺘﻲ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻫﻤﺎﻧﻨﺪ ﻣﺘﻦ اﺳﺘﺎﻧﺪارد رﻓﺘﺎر ﻛﻨﻴﺪ ،ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺻﻔﺖ
responseTextﺷﻲ XMLHttpاﺳﺘﻔﺎده ﻛﻨﻴﺪ
-اﮔﺮ داده ﺷﻤﺎ ﺑﺼﻮرت XMLﻣﻲ ﺑﺎﺷﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ از ﺻﻔﺖ responseXMLاﺳﺘﻔﺎده ﻛﻨﻴﺪ.
در اﻳﻦ ﻣﺜﺎل ﻓﺎﻳﻞ Data.textﻣﺤﺘﻮي ﻣﺘﻦ ﻣﻲ ﺑﺎﺷﺪ ،ﺑﻪ ﻫﻤﻴﻦ ﺧﺎﻃﺮ ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ از ﺻﻔﺖ
responseTextاﺳﺘﻔﺎده ﻛﻨﻴﺪ .ﺑﺮاي اﻳﻨﻜﻪ داده داﻧﻠﻮد ﺷﺪه را در ﺻﻔﺤﻪ وﺑﺘﺎن در ﻣﺤﻠﻲ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ
ﺑﺒﻴﻨﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ آن را در ﻳﻚ Divﻛﻪ ﺑﺎ targetDiv،IDﻛﻪ در ﺻﻔﺤﻪ ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ و ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ
ﺑﻪ ﺗﺎﺑﻊ getDataارﺳﺎل ﺷﺪه ،ﻧﻤﺎﻳﺶ دﻫﻴﺪ:
;)(xmlHttp = createXMLHttp
;)xmlHttp.open("GET", dataSource
{)(xmlHttp.Onreadystatechange = function
&& if(xmlHttp.readyState == 4
{)xmlHttp.status == 200
;obj.innerHTML = xmlHttp.responseText
}
}
..
..
}
></script
اﻛﻨﻮن ﺷﻤﺎ ﻛﺪﺗﺎن را ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﭘﺎﺳﺦ ﺳﺮور ،زﻣﺎﻧﻲ ﻛﻪ ﭘﺎﺳﺦ را درﻳﺎﻓﺖ ﻛﺮدﻳﺪ آﻣﺎده ﻛﺮده اﻳﺪ .اﻣﺎ اﻛﻨﻮن
ﭼﮕﻮﻧﻪ ﺑﻪ ﺻﻮرت واﻗﻌﻲ ﺑﺮاي درﻳﺎﻓﺖ اﻳﻦ ﭘﺎﺳﺦ ﺑﻪ ﺳﺮور وﺻﻞ ﺷﻮﻳﺪ؟ ﺑﺮاي اﻳﻦ ﻛﺎر از ﻣﺘﺪ sendاﺳﺘﻔﺎده ﻣﻲ
ﻛﻨﻴﺪ .اﻳﻦ ﻣﺘﺪ ﻗﺒﻼ ﺗﻮﺿﻴﺢ داده ﺷﺪ ،زﻣﺎﻧﻲ ﻛﻪ از ﻣﺘﺪ GETاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﻣﻘﺪار nullﺑﺮاي ﺳﺮور ارﺳﺎل ﻣﻲ
ﻛﻨﻴﺪ:
>"<script language = "javascript
..
..
..
..
;)(xmlHttp = createXMLHttp
;)xmlHttp.open("GET", dataSource
{)(xmlHttp.Onreadystatechange = function
&& if(xmlHttp.readyState == 4
{)xmlHttp.status == 200
;obj.innerHTML = xmlHttp.responseText
}
}
;)xmlHttp.send (null
}
></script
اﻛﻨﻮن ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ اﻃﻼﻋﺎت درﺧﻮاﺳﺘﻲ را ﺑﻪ ﺳﺮور ارﺳﺎل ﻣﻲ ﻛﻨﺪ و ﻗﺴﻤﺖ ﻣﺪﻳﺮﻳﺖ ،اﻃﻼﻋﺎت درﻳﺎﻓﺘﻲ را ﺑﻪ ﺷﻤﺎ
ﻧﺸﺎن ﻣﻲ دﻫﺪ .اﻳﻦ اوﻟﻴﻦ ﺑﺮﻧﺎﻣﻪ واﻗﻌﻲ ﺷﻤﺎ ﺗﺤﺖ ﺑﺮﻧﺎﻣﻪ Ajaxﺑﻮد .ﺑﺮﻧﺎﻣﻪ در ﭘﺸﺖ ﺻﺤﻨﻪ اﻃﻼﻋﺎﺗﻲ را از ﺳﺮور
درﻳﺎﻓﺖ و ﺑﻪ ﺷﻤﺎ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ،ﺑﺪون اﻳﻨﻜﻪ وب ﺷﻤﺎ ﻫﻤﻪ ﻓﻌﺎﻟﻴﺖ ﻫﺎي ﺧﻮد را ﺗﺎ رﺳﻴﺪن اﻃﻼﻋﺎت ﻣﺘﻮﻗﻒ
ﻓﺼﻞ 59 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
ﻛﺮده و ﺑﺮاي ﻧﻤﺎﻳﺶ داده ﻫﺎ ﺻﻔﺤﻪ را refreshﻛﻨﺪ .ﻛﺪﻫﺎي ﻛﺎﻣﻞ اﻳﻦ ﻣﺜﺎل در CDﻛﺘﺎب در ﻣﺴﻴﺮ
\ example\xmlhttp\1ﺑﺎ ﻧﺎم firstAjax.htmlﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
ﻣﻬﻤﺘﺮﻳﻦ ﻓﻴﻠﺪ در اﻳﻦ ﺟﺪول CustomerIdﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺮاي ﮔﺮﻓﺘﻦ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ از آن اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ.
اﺑﺘﺪا ﻓﺎﻳﻞ PHPرا اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ .اوﻟﻴﻦ ﻛﺎر ،ﺗﻌﺮﻳﻒ ﻫﻤﻪ داده ﻫﺎي اﺳﺖ ﻛﻪ ﺑﺎ آن ﻫﺎ ﺳﺮوﻛﺎر دارﻳﺪ .در اﻳﻦ
ﻣﺜﺎل ،اﻳﻦ داده ﻫﺎ ﻋﺒﺎرﺗﻨﺪ از ﻛﺪ ﻣﺸﺘﺮي ﺑﺮاي ﺟﺴﺘﺠﻮ ،ﻣﺘﻐﻴﺮ $sInfoﻛﻪ اﻃﻼﻋﺎت را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ و اﻃﻼﻋﺎت
ﻣﺮﺑﻮط ﺑﻪ اﺗﺼﺎل ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ) .ﺳﺮور ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ،ﻧﺎم ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ،ﻧﺎم ﻛﺎرﺑﺮ ،ﭘﺴﻮرد و ﻳﻚ رﺷﺘﻪ
دﺳﺘﻮري (Sql
<?php
;]"$sID = $_GET["id
;"" = $sInfo
;"$sDBServer = "your.databaser.server
;"$sDBName = "your_db_name
;"$sDBUsername = "your_db_username
;"$sDBPassword = "your_db_password
;$sQuery = "Select * from user where ID=".$sID
..
..
..
>?
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 60ﻓﺼﻞ 3
اﻳﻦ ﻛﺪ ﺑﺎ ﮔﺮﻓﺘﻦ idﺷﺮوع ﻣﻲ ﺷﻮد PHP .ﺑﺮاي ﺳﺎدﮔﻲ اﻃﻼﻋﺎت ارﺳﺎﻟﻲ از ﺳﻤﺖ ﻛﺎرﺑﺮ را در ﻳﻚ آراﻳﻪ
$_GETﻗﺮار ﻣﻲ دﻫﺪ .اﻳﻦ idدر $sIDذﺧﻴﺮه ﻣﻲ ﺷﻮد ،ﻛﻪ در اﻳﺠﺎد Sql ،Queryذﺧﻴﺮه ﺷﺪه در
$sQueryﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد .ﻣﺘﻐﻴﺮ $sInfoﻧﻴﺰ اﻳﻨﺠﺎ اﻳﺠﺎد ﻣﻲ ﺷﻮد و ﺑﺎ ﻳﻚ رﺷﺘﻪ ﺧﺎﻟﻲ ﻣﻘﺪار
دﻫﻲ ﻣﻲ ﺷﻮد.ﻛﺪﻫﺎي دﻳﮕﺮ ﻣﺮﺑﻮط ﺑﻪ ﺗﻨﻈﻴﻤﺎت ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ ﺑﺎ اﻃﻼﻋﺎت ﺻﺤﻴﺢ آن
را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ.ﻛﺎر ﺑﻌﺪي اﺗﺼﺎل ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ و اﺟﺮاي Queryو ﺑﺮﮔﺮداﻧﺪن ﻧﺘﻴﺠﻪ ﻣﻲ ﺑﺎﺷﺪ .اﮔﺮ ﻛﺎرﺑﺮي ﺑﺎ
IDداده ﺷﺪه ﻣﻮﺟﻮد ﺑﺎﺷﺪ $sInfo ،ﺑﺎ ﻛﺪ Htmlﻛﻪ ﺣﺎوي اﻃﻼﻋﺎت ﻣﺸﺘﺮي اﺳﺖ ﭘﺮ ﻣﻲ ﺷﻮد ،اﮔﺮ ID
ﻧﺎﻣﻌﺘﺒﺮ ﺑﺎﺷﺪ $sInfo ،ﺑﺎ ﻳﻚ ﭘﻴﻐﺎم ﺧﻄﺎ ﺑﺮاي ﻧﺸﺎن دادن در ﺻﻔﺤﻪ وب ﻣﻘﺪار دﻫﻲ ﻣﻲ ﺷﻮد.
<?php
;]"$sID = $_GET["id
;"" = $sInfo
;"$sDBServer = "your.databaser.server
;"$sDBName = "your_db_name
;"$sDBUsername = "your_db_username
;"$sDBPassword = "your_db_password
;$sQuery = "Select * from user where ID=".$sID
= $oLink
;)mysql_connect($sDBServer,$sDBUsername,$sDBPassword
@mysql_select_db($sDBName) or $sInfo=" Unable to open
;"database
<?php
header("Content-Type: text/plain");
$sID = $_GET["id"];
$sInfo = "";
$sDBServer = "your.databaser.server";
$sDBName = "your_db_name";
$sDBUsername = "your_db_username";
$sDBPassword = "your_db_password";
$sQuery = "Select * from user where CustomerId=".$sID;
$oLink =
mysql_connect($sDBServer,$sDBUsername,$sDBPassword);
@mysql_select_db($sDBName) or $sInfo=" Unable to open
database";
echo $sInfo;
?>
ﺑﺮاي ﺗﻨﻈﻴﻢ ﻧﻮعheader() ﺟﺎﻳﻲ ﻛﻪ ﺗﺎﺑﻊ، اوﻟﻲ در اﺑﺘﺪاي ﻓﺎﻳﻞ اﻧﺠﺎم ﺷﺪه اﺳﺖ،دو ﺗﻐﻴﻴﺮ را ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺒﻴﻨﻴﺪ
اﻣﺎ ﺑﻬﺘﺮ، ﺑﺮ ﻣﻲ ﮔﺮداﻧﺪHtml ﺑﺎ اﻳﻨﻜﻪ اﻏﻠﺐ ﺻﻔﺤﻪ ﻳﻚ ﺗﻜﻪ ﻛﺪ.ﻣﺤﺘﻮاي ﺻﻔﺤﻪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد
Header ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ. ﻧﻴﺴﺖHTML ﺑﺨﺎﻃﺮ اﻳﻨﻜﻪ ﻳﻚ ﺻﻔﺤﻪ ﻛﺎﻣﻞ. ﺗﻨﻈﻴﻢ ﺷﻮدtext/plain اﺳﺖ ﻛﻪ ﺑﺎ
ﺟﺎي، ﺗﻐﻴﻴﺮ دوم در زﻳﺮ ﺑﺮﻧﺎﻣﻪ ﻗﺮار دارد. اي ﻛﻪ ﺑﻪ ﻣﺮورﮔﺮ ﻣﻲ ﻓﺮﺳﺘﻴﺪ را ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪhtml ﻫﻤﻪ ﺻﻔﺤﺎت ﻏﻴﺮ
ﺣﺎل ﺑﻪ ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﻣﻲ روﻳﻢ. ﺑﻪ ﺧﺮوﺟﻲ داده ﻣﻲ ﺷﻮدecho ﺑﻪ ﻋﻨﻮان ﻳﻚ اﺳﺘﺮﻳﻢ ﺑﺎ دﺳﺘﻮر$sInfo ﻛﻪ
: اﺑﺘﺪا ﺻﻔﺤﻪ وﺑﻲ را ﺑﻪ ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ.و ﺑﻪ ﺗﻨﻈﻴﻢ ﺑﺮﻧﺎﻣﻪ وب ﻣﻲ ﭘﺮدازﻳﻢ
<p>Enter customer ID number to retrieve information:</p>
<p>Customer ID: <input type="text" id="txtCustomerId" value=""
/></p>
<p><input type="button" value="Get Customer Info"
onclick="requestCustomerInfo()" /></p>
<div id="divCustomerInfo"></div>
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 62ﻓﺼﻞ 3
$sStatus = "";
$sDBServer = "your.database.server";
$sDBName = "your_db_name";
$sDBUsername = "your_db_username";
$sDBPassword = "your_db_password";
//more here
?>
ﻳﻚ ﭘﻴﻐﺎم وﺿﻌﻴﺖ، ﻋﻼوه ﺑﺮ اﻳﻦ، درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪPOST اﻳﻦ ﺗﻜﻪ ﻛﺪ ﻫﻤﻪ اﻃﻼﻋﺎت را از ﻃﺮﻳﻖ
ﻛﻪ، اﺳﺖINSERT در اﻳﻦ ﻣﺜﺎلSQL ﻋﺒﺎرت، و اﻃﻼﻋﺎت ﻣﺮﺑﻮط ﺑﻪ ﺑﺎﻧﻚ را اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ،($sStatus)
.ﻫﻤﻪ اﻃﻼﻋﺎت ﺑﺎزﻳﺎﺑﻲ ﺷﺪه را ذﺧﻴﺮه ﻣﻲ ﻛﻨﺪ
<?php
$sName = $_POST["txtName"];
$sAddress = $_POST["txtAddress"];
$sCity = $_POST["txtCity"];
$sState = $_POST["txtState"];
$sZipCode = $_POST["txtZipCode"];
$sPhone = $_POST["txtPhone"];
$sEmail = $_POST["txtEmail"];
$sStatus = "";
$sDBServer = "your.database.server";
$sDBName = "your_db_name";
$sDBUsername = "your_db_username";
$sDBPassword = "your_db_password";
('$sName','$sAddress','$sCity','$sState',
'$sZipCode'". ", '$sPhone', '$sEmail')";
$oLink =
mysql_connect($sDBServer,$sDBUsername,$sDBPassword);
@mysql_select_db($sDBName) or $sStatus = "Unable to open
database";
if($oResult = mysql_query($sSQL)) {
$sStatus = "Added customer; customer ID is
".mysql_insert_id();
} else {
$sStatus = "An error occurred while inserting;
customer not saved.";
}
mysql_close($oLink);
?>
ﻣﺘﻐﻴﺮ، در ﺻﻮرت درﺳﺘﻲ. ﻳﻚ ﺷﺎﺧﺺ ﺑﺮاي ﺗﺎﺋﻴﺪ درﺳﺘﻲ ﻋﻤﻠﻴﺎت اﺳﺖmysql_query() ﻧﺘﻴﺠﻪ ﺗﺎﺑﻊ،اﻳﻨﺠﺎ
ﺗﺎﺑﻊ. ﻣﻘﺪاردﻫﻲ ﻣﻲ ﺷﻮد، را ﻧﺸﺎن ﻣﻲ دﻫﺪ، ﻣﺸﺘﺮيID ﺑﺎ ﭘﻴﻐﺎﻣﻲ ﻛﻪ ﻣﻮﻓﻘﻴﺖ ﻋﻤﻠﻴﺎت ذﺧﻴﺮه و$sStatus
در. را ﺑﺮ ﻣﻲ ﮔﺮداﻧﺪauto-incremented ﻫﻤﻴﺸﻪ ﺟﺪﻳﺪﺗﺮﻳﻦ ﻣﻘﺪارmysql_insert_id()
. ﺑﺎ ﻳﻚ ﭘﻴﻐﺎم ﺧﻄﺎ ﻣﻘﺪار دﻫﻲ ﻣﻲ ﺷﻮد$sStatus ﻋﻤﻠﻴﺎت درج ﺑﻪ درﺳﺘﻲ اﻧﺠﺎم ﻧﺸﺪه ﺑﺎﺷﺪ،ﺻﻮرﺗﻴﻜﻪ
.ﺣﺎل اﻃﻼﻋﺎت ﻧﻮع ﻣﺤﺘﻮا و ﻋﻤﻠﻴﺎت ارﺳﺎل ﻣﺘﻦ را اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ
<?php
header("Content-Type: text/plain");
$sName = $_POST["txtName"];
$sAddress = $_POST["txtAddress"];
$sCity = $_POST["txtCity"];
$sState = $_POST["txtState"];
$sZipCode = $_POST["txtZipCode"];
$sPhone = $_POST["txtPhone"];
$sEmail = $_POST["txtEmail"];
$sStatus = "";
$sDBServer = "your.database.server";
$sDBName = "your_db_name";
$sDBUsername = "your_db_username";
$sDBPassword = "your_db_password";
$oLink =
mysql_connect($sDBServer,$sDBUsername,$sDBPassword);
@mysql_select_db($sDBName) or $sStatus = "Unable to open
database";
if($oResult = mysql_query($sSQL)) {
$sStatus = "Added customer; customer ID is
".mysql_insert_id();
} else {
$sStatus = "An error occurred while inserting;
customer not saved.";
}
mysql_close($oLink);
echo $sStatus;
?>
. اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد$sStatus ﺑﺮاي ارﺳﺎلecho ﺑﺮاي ﺗﻨﻈﻴﻢ ﻧﻮع ﻣﺤﺘﻮا و ﺗﺎﺑﻊheader ﺗﺎﺑﻊ
: ﺑﺮاي درﻳﺎﻓﺖ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢform در ﺻﻔﺤﻪ اﺻﻠﻲ ﻳﻚ ﺗﮓ
<form method="post" action="SaveCustomer.php"
onsubmit="sendRequest(); return false">
را روي ﻓﻴﻠﺪﻫﺎي ﻓﺮمvalue وname ﺑﺮاي اﻳﺠﺎد اﻳﻦ رﺷﺘﻪ ﺑﺎﻳﺴﺘﻲ اﺳﺘﺨﺮاج و رﻣﺰﮔﺬاري.ﺗﺪارك دﻳﺪه اﺳﺖ
: اﻳﻦ ﻛﺎر را اﻧﺠﺎم ﻣﻲ دﻫﺪgetRequestBody() ﺗﺎﺑﻊ.ﺗﻜﺮار ﻛﻨﻴﺪ
function getRequestBody(oForm) {
var aParams = new Array();
for (var i=0 ; i < oForm.elements.length; i++) {
var sParam = encodeURIComponent(oForm.elements[i].name);
sParam += "=";
sParam += encodeURIComponent(oForm.elements[i].value);
aParams.push(sParam);
}
return aParams.join("&");
}
.(oForm)اﻳﻦ ﺗﺎﺑﻊ ﻓﺮض را ﺑﺮ اﻳﻦ ﻣﻲ ﮔﺬارد ﻛﻪ ﺷﻤﺎ ﻳﻚ ارﺟﺎع ﺑﻪ ﻓﺮم از ﻃﺮﻳﻖ ﻳﻚ آرﮔﻮﻣﺎن ﺧﻮاﻫﻴﺪ داﺷﺖ
Form ﺳﭙﺲ اﻟﻤﻨﺘﻬﺎي. اﻳﺠﺎد ﻣﻲ ﺷﻮدname-value (ﺑﺮاي ذﺧﻴﺮه ﺟﻔﺖ ﻣﻘﺪارaParams) ﻳﻚ آراﻳﻪ
ﻛﻪ ﺳﭙﺲ در ﻳﻚ آراﻳﻪ ﻗﺮار ﻣﻲ، ذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪsParam ﻳﻚ رﺷﺘﻪ اﻳﺠﺎد و در،در ﻳﻚ ﺣﻠﻘﻪ ﻗﺮار ﮔﺮﻓﺘﻪ
درjoin() آﺧﺮﻳﻦ ﻣﺮﺣﻠﻪ ﻓﺮاﺧﻮاﻧﻲ. در ﺑﺮﺧﻲ ﻣﺮورﮔﺮﻫﺎ ﻣﻤﻜﻦ اﺳﺖ ﻛﻨﺪ ﺑﺎﺷﺪ، اﻧﺠﺎم اﻳﻦ ﻋﻤﻠﻴﺎت.ﮔﻴﺮﻧﺪ
ﻳﻚ اﻣﭙﺮﺳﻨﺪ "&" ﻗﺮارname-value اﻳﻦ دﺳﺘﻮر ﺑﻴﻦ ﺟﻔﺖ ﻣﻘﺎدﻳﺮ.آراﻳﻪ اﺳﺖ ﺑﺮاي ﺑﺮﮔﺮداﻧﺪن داده ﻫﺎ اﺳﺖ
.داده و ﻳﻚ رﺷﺘﻪ ﺑﺎ ﻓﺮﻣﺖ ﺻﺤﻴﺢ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ
را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ و درﺧﻮاﺳﺖ را ﺗﻨﻈﻴﻢ ﻣﻲgetRequestBody() ﺗﺎﺑﻊsendRequest() ﺗﺎﺑﻊ
:ﻛﻨﺪ
function sendRequest() {
var oForm = document.forms[0];
var sBody = getRequestBody(oForm);
oXmlHttp.onreadystatechange = function () {
if (oXmlHttp.readyState == 4) {
if (oXmlHttp.status == 200) {
saveResult(oXmlHttp.responseText);
} else {
saveResult("An error occurred: "+
oXmlHttp.statusText);
}
}
};
oXmlHttp.send(sBody);
}
ﻓﺼﻞ 67 3 ﺷﺮوع ﻛﺎر ﺑﺎ Ajax
ﻫﻤﺎﻧﻨﺪ ﻣﺜﺎل ﻗﺒﻠﻲ ،ﻣﺮﺣﻠﻪ اول دراﻳﻦ ﺗﺎﺑﻊ اﻳﺠﺎد ﻳﻚ ﻓﺮم و ذﺧﻴﺮه آن در ﻣﺘﻐﻴﺮ ) (oFormاﺳﺖ ﻛﻪ ﭘﺲ از اﻳﺠﺎد
ﺑﺪﻧﻪ درﺧﻮاﺳﺖ ،در sBodyذﺧﻴﺮه ﻣﻲ ﺷﻮد .ﻣﺮﺣﻠﻪ ﺑﻌﺪ اﻳﺠﺎد ﻳﻚ ﺷﻲ XMLHTTPاﺳﺖ .ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ در
ﻣﺘﺪ openآرﮔﻮﻣﺎن اوﻟﻲ ﺑﻪ ﺟﺎي POST ،GETﻣﻲ ﺑﺎﺷﺪ ،ﻫﭽﻨﻴﻦ آرﮔﻮﻣﺎن دوم ﺑﺎoForm.action
ﻣﻘﺪاردﻫﻲ ﻣﻲ ﺷﻮد .ﻫﭽﻨﻴﻦ Headerدرﺧﻮاﺳﺖ ﻧﻴﺰ ﺗﻨﻈﻴﻢ ﺷﺪه اﺳﺖ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﻳﻚ ﻓﺮم از ﻣﺮورﮔﺮ ﺑﻪ ﺳﺮور
ارﺳﺎل ﻣﻲ ﺷﻮد ،ﻧﻮع ﻣﺤﺘﻮاي درﺧﻮاﺳﺖ آن ﺑﺎ application/x-www-form-urlencoded
ﻣﻘﺪاردﻫﻲ ﻣﻲ ﺷﻮد .اﻛﺜﺮ زﺑﺎﻧﻬﺎي ﺗﺤﺖ ﺳﺮور در درﺧﻮاﺳﺖ ﻫﺎي POSTﺑﻪ اﻳﻦ ﻛﺪ ﺗﻮﺟﻪ ﻣﻲ ﻛﻨﺪ ،ﺑﻨﺎﺑﺮاﻳﻦ اﻳﻦ
دﺳﺘﻮر از اﻫﻤﻴﺖ ﺧﺎﺻﻲ ﺑﺮﺧﻮردار اﺳﺖ.رﺧﺪاد onreadystatechangeﺗﺎﺑﻊ )( saveResultرا
ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ:
{ )function saveResult(sMessage
;)"var divStatus = document.getElementById("divStatus
;divStatus.innerHTML = "Request completed: "+ sMessage
}
اﻳﻦ ﺗﺎﺑﻊ وﻇﻴﻔﻪ ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﻣﺸﺘﺮي و ﻳﺎ ﭘﻴﻐﺎم ﺧﻄﺎ را دارد ﺧﻂ آﺧﺮ ﺑﺴﻴﺎر ﻣﻬﻢ اﺳﺖ sBody ،ﺑﻪ ﺗﺎﺑﻊ send
ﭘﺎس داده ﻣﻲ ﺷﻮد ﻛﻪ ﺑﻌﺪ ﺟﺰﺋﻲ از درﺧﻮاﺳﺖ ﻣﻲ ﺷﻮد.
ﺷﺮوع ﻛﺎر ﺑﺎ Ajax 68ﻓﺼﻞ 3
ﻓﺼﻞ 69 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
ASP.Netﻓﺮﻳﻢ ورك ﺗﻘﺮﻳﺒﺎً ﺟﺪﻳﺪي از ﺷﺮﻛﺖ ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺎ ﻣﻌﺮﻓﻲ آن ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ Web
ﭘﺎ در ﻋﺮﺻﻪ ﺟﺪﻳﺪي ﮔﺬاﺷﺖ .ﺑﺎ اﻳﻨﻜﻪ آن را ﻧﻤﻮدي از JSPﺟﺎوا ﻣﻲ داﻧﻨﺪ ،اﻣﺎ ﻧﻤﻲ ﺗﻮان ﺗﻔﺎوت ﺑﻴﻦ اﻳﻦ دو،
روش آﺳﺎﻧﺘﺮ Asp.Netﻧﺴﺒﺖ ﺑﻪ روش ﺟﺎوا و اﻟﺒﺘﻪ ﻛﻤﻲ ﺳﺨﺖ ﻧﺴﺒﺖ ﺑﻪ PHPرا ﻛﺘﻤﺎن ﻛﺮد .اﻳﻦ ﻓﺼﻞ ﺑﻪ
ﻫﻴﭻ ﻋﻨﻮان ﻗﺼﺪ ﻣﻘﺎﻳﺴﻪ روﺷﻬﺎي اﻳﺠﺎد وب و ﻳﺎ آﻣﻮزش آﻧﻬﺎ را ﻧﺪارد؛ و ﺗﻨﻬﺎ ﺑﻪ اﻳﺠﺎد ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajaxي ﺑﺮ
روي ASP.Netﺧﻮاﻫﺪ ﭘﺮداﺧﺖ.
ﻛﻨﺘﺮل ﻫﺎ
در ASP.Netﻋﻼوه ﺑﺮ ﻋﻨﺎﺻﺮ وب ،ﺷﺎﻫﺪ وﺟﻮد ﻋﻨﺎﺻﺮ ASP.Netي ﺑﺎ ﻧﺎم ﻛﻨﺘﺮل ﻫﺴﺘﻴﻢ ﻛﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ را
ﺑﺮاي ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن ﺑﻪ ﻣﺮاﺗﺐ آﺳﺎن ﺗﺮ از ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ در ﭘﻠﺘﻔﺮم ﻫﺎي دﻳﮕﺮ ﻛﺮده اﺳﺖ .اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ
ﺻﻮرت ﻋﻤﻮﻣﻲ در ﻗﺎﻟﺐ > <asp:controlNameﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮﻧﺪ و ﻋﻤﻠﻴﺎت ﭘﻮﻳﺎ را در واﺳﻂ ﻛﺎرﺑﺮي
اﻳﺠﺎد ﻣﻲ ﻛﻨﻨﺪ .ﺑﺎ اﻳﺠﺎد روﻳﺪادي ﺑﺮ روي ﻛﻨﺘﺮل ﻫﺎ )ﻓﺸﺮدن دﻛﻤﻪ و ،(...ﻛﻨﺘﺮل ﻫﺎ اﻃﻼﻋﺎﺗﻲ را ﺑﻪ ﺳﻤﺖ ﺳﺮور
ارﺳﺎل ﻣﻲ ﻛﻨﻨﺪ وﻣﻨﺘﻈﺮ اﺗﻤﺎم ﻛﺎر ﺳﺮور و ﭘﺎﺳﺦ از ﺳﻤﺖ ﺳﺮور ﻣﻲ ﺷﻮﻧﺪ ؛ ﺑﺎ درﻳﺎﻓﺖ اﻃﻼﻋﺎت از ﺳﻤﺖ ﺳﺮور
ﺻﻔﺤﻪ وب ﻣﺠﺪدا ﺑﺎرﮔﺬاري ﺷﺪه و اﺣﺘﻤﺎل از دﺳﺖ دادن اﻃﻼﻋﺎت ﻗﺒﻠﻲ وﺟﻮد دارد.
اﻣﺎ ﻋﻨﺎﺻﺮ ﻣﻌﻤﻮﻟﻲ htmlاﻳﻦ ﺧﺎﺻﻴﺖ را ﻧﺪارﻧﺪ وﺣﺎﻟﺖ ﭘﻴﺶ ﻓﺮض آن ﻫﺎ اﺟﺮاي روﻳﺪاد در ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﻣﻲ
ﺑﺎﺷﺪ .ﺑﻪ ﻋﻠﺖ ﺳﺮ ﺑﺎر زﻳﺎدي ﻛﻪ ﻛﻨﺘﺮل ﻫﺎي ASP.NETدارﻧﺪ در اﻳﻨﺠﺎ از ﻋﻨﺎﺻﺮ ﺳﺎده htmlاﺳﺘﻔﺎده ﻣﻲ
ﻛﻨﻴﻢ.
Ajaxدر ASP.Net
دراﻳﻦ ﺑﺨﺶ ﻗﺼﺪ دارﻳﻢ ﭼﮕﻮﻧﮕﻲ ﻛﺎر ﺑﺎ Ajaxرا ﺑﺎ ﻳﻚ ﻣﺜﺎل ﺗﻮﺿﻴﺢ دﻫﻴﻢ :ﻗﺮار اﺳﺖ ﺑﺮﻧﺎﻣﻪ اي اﻳﺠﺎد ﻛﻨﻴﺪ
ﻛﻪ ﻛﺎرﺑﺮ ﺑﺎ اﻧﺘﺨﺎب ﻳﻚ ﻛﻠﻴﺪ اﻃﻼﻋﺎت ﻳﻚ ﻓﺎﻳﻞ XMLرا در ﺻﻔﺤﻪ وب ﻣﺸﺎﻫﺪه ﻛﻨﺪ .اﻳﻦ ﻛﺎر را از ﻃﺮﻳﻖ
ajaxاﻧﺠﺎم ﺧﻮاﻫﻴﺪ داد.
اﺑﺘﺪا ﻳﻚ ﭘﺮوژه وب در Microsoft Visual Studioﺑﺎ ﻧﺎم AspAjaxSampleاﻳﺠﺎد ﻛﻨﻴﺪ .ﻳﻚ
ﭘﻮﺷﻪ ﺑﺎ ﻧﺎم javaScriptاﻳﺠﺎد ﻛﺮده و ﺑﺎ اﺳﺘﻔﺎده از ﮔﺰﻳﻨﻪ Add New Itemﻳﻚ ﻓﺎﻳﻞ ﺟﺎوا اﺳﻜﺮﻳﭙﺘﻲ ﺑﺎ
ﻧﺎم xmlHttp.jsدر آن اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ .ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺖ ﻛﻪ اﻳﻦ ﭘﻮﺷﻪ ﺗﻨﻬﺎ ﺑﺮاي دﺳﺘﺮﺳﻲ آﺳﺎن ﺑﻪ داده اﺳﺖ
و ﻟﺰوﻣﻲ ﺑﺮاي وﺟﻮد آن ﻧﻴﺴﺖ .ﺣﺎل دو ﻣﺘﺪ ﻛﻪ ﺑﺮاي اﻳﺠﺎد ajaxﺳﺎﺧﺘﻪ ﺑﻮدﻳﻢ را در اﻳﻦ ﻓﺎﻳﻞ ﻗﺮار ﻣﻲ دﻫﻴﻢ.
ﺣﺎل ﻳﻚ web Formﺑﺎ ﻧﺎم SimpleResponseText.aspxرا ﺑﻪ ﭘﺮوژه اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ.
ﺗﺎﺑﻊ )() getDataﻛﻪ در ﻓﺼﻞ ﺳﻮم ﺑﺎ آن آﺷﻨﺎ ﺷﺪﻳﺪ( را ﺑﻪ ﺻﻮرت زﻳﺮ اﺻﻼح ﻛﻨﻴﺪ .اﻳﻦ ﺗﺎﺑﻊ را ﺑﻪ ﻫﻤﺮاه
ﺗﺎﺑﻊ )( createXMLHttpﺑﻪ ﻓﺎﻳﻞ xmlHttp.jsاﺿﺎﻓﻪ ﻧﻤﺎﻳﺪ:
)function getData(dataSource, divID
{
;)(xmlHttp = createXMLHttp
ASP.Net درAjax ﻛﺎر ﺑﺎ 4 ﻓﺼﻞ 70
if(xmlHttp) {
var obj = document.getElementById(divID);
xmlHttp.open("GET", dataSource);
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4 && xmlHttp.status ==
200) {
obj.childNodes[0].nodeValue =
xmlHttp.responseText;
}
}
xmlHttp.send(null);
}
}
</form>
</body>
اﺳﺖ را در ﭘﻮﺷﻪxml ﻛﻪ ﻳﻚ ﻓﺎﻳﻞDataFile.xml ﺣﺎل اﺻﻠﻲ ﺗﺮﻳﻦ ﻋﻨﺼﺮ اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﻳﻌﻨﻲ ﻓﺎﻳﻞ
. ﺑﻪ ﺻﻮرت زﻳﺮ ﻣﻲ ﺑﺎﺷﺪDataFile.xml ﻣﺤﺘﻮﻳﺎت ﻓﺎﻳﻞ. اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢresource
<?xml version="1.0" encoding="utf-8" ?>
<Customers>
<Customer>
<Firstname>Joe</Firstname>
<Lastname>Bloggs</Lastname>
<email>joe@bloggs.com</email>
ﻓﺼﻞ 71 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
></Customer
><Customer
><Firstname>Alan</Firstname
><Lastname>Anonymous</Lastname
><email>anon@ymous.com</email
></Customer
><Customer
><Firstname>Marvin</Firstname
><Lastname>Martian</Lastname
><email>marvin@mars.com</email
></Customer
></Customers
زﻣﺎﻧﻲ ﻛﻪ ﻛﻠﻴﺪ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﻧﺘﻴﺠﻪ ﺑﻪ ﺻﻮرت ﺷﻜﻞ 5-1ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻫﻤﺎﻧﻄﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ،اﻃﻼﻋﺎت ﻓﺎﻳﻞ XMLﺑﻪ ﻫﻤﺎن ﺻﻮرﺗﻲ ﻛﻪ در آن ذﺧﻴﺮه ﺷﺪه اﻧﺪ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ.
اﺳﺘﻔﺎده از ﺧﺎﺻﻴﺖ responseXML
در ﺳﻨﺎرﻳﻮي اﺻﻠﻲ ﺷﻤﺎ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻛﻪ ﭼﻨﺪﻳﻦ آﻳﺘﻢ ﻧﻤﺎﻳﺶ دﻫﻴﺪ ،ﻛﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت اﻧﺘﺨﺎب ﻧﺎم اﻓﺮاد از
ﻟﻴﺴﺖ ﺑﺎﺷﺪ .ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﻓﺼﻞ ﺳﻮم ﻧﻴﺰ اﺷﺎره ﺷﺪ ﺑﺮاي ﺧﻮاﻧﺪن ﻓﺮﻣﺖ ، XMLﺷﻲ XMLHTTPﻳﻚ ﺧﺎﺻﻴﺖ
ﺑﺎ ﻧﺎم responseXMLرا ﻓﺮاﻫﻢ ﻛﺮده اﺳﺖ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻳﻚ ﺷﻲ ﺳﻨﺪي XMLاﺳﺘﺎﻧﺪارد ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻲ
ﺗﻮاﻧﺪ ﺑﻪ ﺑﺮرﺳﻲ و ﺗﺠﺰﻳﻪ اﺳﻨﺎد XMLﻳﺎ اﺳﺘﻔﺎده ﻣﺘﺪﻫﺎ و ﺧﺎﺻﻴﺖ ﻫﺎي ﮔﺮه ﻫﺎي DOMﺑﭙﺮدازد.
اﺑﺘﺪا ﻳﻚ Web Formﺑﺎ ﻧﺎم SimpleResponseXML.aspxاﻳﺠﺎد ﻛﻨﻴﺪ .و ﻓﺎﻳﻞ xmlHttp.jsرا
ﺑﻪ آن اﻟﺤﺎق ﻛﻨﻴﺪ.
ﺑﺒﺮﻳﺪ .ﺗﻮﺟﻪ دارﻳﺪ ﻛﻪ ﺑﺮاي ﻫﺮ ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺴﺘﻲ ﻋﻤﻠﻴﺎﺗﻲ ﻛﻪ روﻳﺪاد onreadystatechangeاﻧﺠﺎم ﻣﻲ دﻫﺪ
را ﺗﻐﻴﻴﺮ دﻫﻴﺪ ،ﺗﺎ از ﺑﺮﻧﺎﻣﻪ ﺟﻮاب ﺑﮕﻴﺮﻳﺪ .ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻳﻚ وﻳﮋﮔﻲ ﺳﺎده و ﺟﺎﻟﺒﻲ دارد ﻛﻪ ﺷﻤﺎ را ﻗﺎدر ﻣﻲ ﺳﺎزد
ﻛﺪ ﻳﻚ ﺗﺎﺑﻊ را ﺑﻪ ﺗﺎﺑﻊ دﻳﮕﺮي ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ﭘﺎس دﻫﻴﺪ .از اﻳﻦ ﺧﺎﺻﻴﺖ اﺳﺘﻔﺎده ﻛﺮده و ﺗﺎﺑﻊ ﺟﺪﻳﺪي ﺑﻪ
ﺻﻮرت زﻳﺮ اﻳﺠﺎد ﻛﻨﻴﺪ:
)function getDataCallBack(callBack,dataSource
{
;)(xmlHttp = createXMLHttp
{ )if(xmlHttp
;)xmlHttp.open("GET", dataSource
)(xmlHttp.onreadystatechange = function
{
== if (xmlHttp.readyState == 4 && xmlHttp.status
{ )200
callBack(xmlHttp.responseText,xmlHttp.
;)responseXML
}
}
;)xmlHttp.send(null
}
}
callBackﻫﻤﺎن ﺗﺎﺑﻌﻲ اﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﭘﺎراﻣﺘﺮ ﺑﻪ ﺗﺎﺑﻊ ﺟﺪﻳﺪ getDataCallBackﭘﺎس داده ﺷﺪه
اﺳﺖ .در روﻳﺪاد onreadystatechangeﻧﻴﺰ ﭘﺲ از ﻋﻤﻠﻴﺎت اﻋﺘﺒﺎر ﺳﻨﺠﻲ ﺑﻪ ﺟﺎي اﻧﺠﺎم ﻣﺴﺘﻘﻴﻢ ﻋﻤﻠﻴﺎت،
ﻳﻚ ﺗﺎﺑﻊ ﭘﺎس داده ﺷﺪه ﺑﺎ دو ﭘﺎراﻣﺘﺮ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .ﺑﺎ اﻳﻦ ﻛﺎر ﻛﺪ ﺧﻮاﻧﺎﺗﺮي ﺧﻮاﻫﻴﺪ داﺷﺖ.
اﺑﺘﺪا ﻳﻚ ﺗﺎﺑﻊ ﺟﺪﻳﺪي ﺑﻪ ﻓﺮم اﺿﺎﻓﻪ ﻛﻨﻴﺪ ،اﻳﻦ ﺗﺎﺑﻊ ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
>"<head runat="server
"<script type="text/javascript
>src="javaScript/xmlHttp.js"></script
> "<script type="text/javascript
{)function getDataCallBack(responseText,responseXML
;)"var obj = document.getElementById("divResults
(var node = responseXML.selectSingleNode
;)”)(“//Customers/Customer/Firstname/text
;obj.childNodes[0].nodeValue = node.nodeValue
}
></script
></head
ﺑﻪ ﺟﺎي اﻳﻨﻜﻪ داده ﺧﺮوﺟﻲ را ﺑﻪ ﺻﻮرت ﻣﺠﻤﻮﻋﻪ ﻛﺎﻣﻞ ﻧﻤﺎﻳﺶ دﻫﻴﺪ ،اوﻟﻴﻦ ﻧﻤﻮﻧﻪ > ،<Firstnameرا
ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﺪ .ﺷﻤﺎ اﻳﻦ ﻛﺎر را ﺑﺎ اﺳﺘﻔﺎده ﻣﺘﺪ selectSingleNodeاﻧﺠﺎم ﻣﻲ دﻫﻴﺪ .اﻳﻦ ﻣﺘﺪ در ﺻﻮرت
ﭘﻴﺪا ﻛﺮدن ﺟﻮاب ﻳﻚ ﮔﺮه XMLي را ﺑﺮﻣﻲ ﮔﺮداﻧﺪ در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻣﻘﺪار ﺧﺮوﺟﻲ آن nullﺧﻮاﻫﺪ ﺑﻮد.
ﻣﻘﺪار ﺷﻲ ﮔﺮه در nodeValueي اوﻟﻴﻦ ﻋﻨﺼﺮ ﺑﺪﺳﺖ آﻣﺪه ﺗﻮﺳﻂ ﺧﺎﺻﻴﺖ childNodesاز ﻋﻨﺼﺮ
ﻓﺼﻞ 73 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
divResultsﻗﺮار داده ﻣﻲ ﺷﻮد .اﮔﺮ از Firefoxاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﺪ ﺑﺎﻳﺪ ﺗﻮﺟﻪ داﺷﺘﻪ ﺑﺎﺷﻴﺪ ﻛﻪ
Firefoxاز ﻣﺘﺪﻫﺎي )( selectSingleNodeو )( selectNodesﺣﻤﺎﻳﺖ ﻧﻤﻲ ﻛﻨﺪ.
اﻛﻨﻮن ﺑﺪﻧﻪ ي ﻣﺜﺎل ﺟﺪﻳﺪ را ﻫﻤﺎﻧﻨﺪ ﻣﺜﺎل ﻗﺒﻠﻲ ﻧﻮﺷﺘﻪ و ﺗﻨﻬﺎ ﺑﺮاي اﺳﺘﻔﺎده از ﻣﺘﺪ ﺟﺪﻳﺪ در آن ﺗﻐﻴﻴﺮ ﻛﻮﭼﻜﻲ
ﺑﺪﻫﻴﺪ:
>"<form id="form1" runat="server
"<input type="button
onclick="getDataCallBack(parsingData,'http://' +
";)'location.host + '/AspAjaxSample/resource/DataFile.xml
>value="Test XMLHTTP Call"/
><br /
><br /
><div id="divResults">{no results}</div
></form
اﻳﻦ ﻣﺜﺎل ﻓﻌﻼ ﻳﻚ ﻣﺜﺎل ﺳﺎده ﻣﻲ ﺑﺎﺷﺪ ،ﺣﺎﻻ ﺑﺎ اﻳﺠﺎد ﻳﻚ ﺻﻔﺤﻪ وب ﺳﺎده ﻣﻲ ﺧﻮاﻫﻴﻢ ﻛﻪ ﺑﻪ ﺷﻤﺎ اﺟﺎزه اﻧﺘﺨﺎب
ﻳﻚ ﻓﺮد از ﻟﻴﺴﺖ اﻓﺮاد و ﻧﻤﺎﻳﺶ ﻧﺎم ﻛﺎﻣﻞ واﻃﻼﻋﺎت mailﺑﺎ اﻧﺠﺎم ﻳﻚ ﺟﺴﺘﺠﻮي ﺳﻤﺖ ﺳﺮور از ﻓﺎﻳﻞ XML
ﺑﻪ ﺻﻮرت ﻏﻴﺮ ﻫﻤﺰﻣﺎن داده ﺷﻮد.
ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﻋﻨﺼﺮ ،drop-downﻟﻴﺴﺘﻲ از ﻧﺎم اﻓﺮاد ﻣﻮﺟﻮد در ﻓﺎﻳﻞ XMLرا اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ .زﻣﺎﻧﻲ ﻛﻪ
ﻛﺎرﺑﺮ ﻧﺎﻣﻲ را از ﻟﻴﺴﺖ اﻧﺘﺨﺎب ﻛﺮد ،ﻳﻚ درﺧﻮاﺳﺖ ﺳﻤﺖ ﺳﺮور ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ آن داده و ﺑﺎزﻳﺎﺑﻲ emailاﺟﺮا
ﻣﻲ ﺷﻮد .ﺑﺪون اﺳﺘﻔﺎده از XMLHTTPﻛﺎرﺑﺮ ﺑﺎﻳﺴﺘﻲ ﺗﺎ زﻣﺎن ارﺳﺎل اﻃﻼﻋﺎت ﺑﻪ ﺳﺮور و ﭘﺮدازش آن و ﺑﺎزﻳﺎﺑﻲ
اﻃﻼﻋﺎت ﻣﻨﺘﻈﺮ ﺑﻤﺎﻧﺪ.
ﺑﺪﻧﻪ ﻓﺮم را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ ﺑﺪﻫﻴﺪ:
><div
"<select id="ddlCustomers
onchange="getDataCallBack(DisplayCustomerDetails,
'http://' + location.host +
>";)''/AspAjaxSample/resource/DataFile.xml
<option value="">- Select a Customer -
></option
></select
><hr /
><div
><p>Details:</p
>"<span id="spnDetailDisplay
ASP.Net درAjax ﻛﺎر ﺑﺎ 4 ﻓﺼﻞ 74
</div>
</form>
</body>
< ﻗﺮار دارد ﻛﻪ ﻧﺎم ﻛﺎرﻣﻨﺪان را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و ﻳﻚ ﻋﻨﺼﺮselect> داﺧﻞ ﻋﻨﺼﺮ ﻓﺮم ﻳﻚ ﻋﻨﺼﺮ
onload ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﻛﻪ روﻳﺪاد.< ﻛﻪ در آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺸﺨﺼﺎت ﻛﺎرﻣﻨﺪان را ﻧﻤﺎﻳﺶ دﻫﻴﺪspan>
ﺑﻪ آن ﭘﺎس داده ﺷﺪه را ﻓﺮاﺧﻮاﻧﻲLoadCustomers() ﻛﻪ ﻣﺘﺪgetDataCallBack < ﺗﺎﺑﻊbody>
ﻋﻨﺼﺮonchange ﻫﻤﭽﻨﻴﻦ روﻳﺪاد،ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺑﺮاي ﻣﻘﺪار دﻫﻲ اوﻟﻴﻪ ﻟﻴﺴﺖ ﺑﺎ ﻧﺎم ﻛﺎرﻣﻨﺪان ﻣﻲ ﺑﺎﺷﺪ
را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ ﻛﻪ اﻃﻼﻋﺎت ﻛﺎرﻣﻨﺪDisplayCustomerDetails() ﺗﺎﺑﻊ، <select>
.اﻧﺘﺨﺎﺑﻲ را از اﻧﺘﺨﺎب ﻛﺮده و ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ
: ﻛﻪ ﻧﺎم ﻛﺎرﻣﻨﺪان را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮدLoadCustomers() ﻣﺘﺪ
function LoadCustomers(responseText,responseXML){
var ctrl =
document.getElementById("ddlCustomers");
var doc = responseXML;
var lastName=ctrl.options[ctrl.selectedIndex]
.value;
("//Customers/Customer[Lastname='" +
;)"]'" lastName +
var details = 'Fullname: ' + node
)')(.selectSingleNode('Firstname/text
.nodeValue + ' ' +lastName + '. Email: ' +
)')(node.selectSingleNode('email/text
;.nodeValue
)"document.getElementById("spnDetailDisplay
;.childNodes[0].nodeValue = details
}
</span>
</div>
</div>
</form>
دراﻳﻦ ﻣﺘﺪ ﻳﻚ. را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪLoadCustomer < ﻣﺘﺪselect> ﻋﻨﺼﺮonchange در اﻳﻦ ﻣﺜﺎل
، ﭘﺎس ﻣﻲ دﻫﺪgetDataCallBack را ﺑﻪ ﺗﺎﺑﻊShowCustomer دارﻳﻢ ﻛﻪ ﻣﺘﺪAjax درﺧﻮاﺳﺖ
را ﺑﺎarg اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ وasynchronous ﺑﺮاي اﻳﺠﺎد درﺧﻮاﺳﺖhandeler ﻫﻤﭽﻨﻴﻦ از ﻳﻚ
.< ﻣﻘﺪار دﻫﻲ ﻣﻲ ﻛﻨﺪselect> ﮔﺰﻳﻨﻪ اﻧﺘﺨﺎﺑﻲ در ﻋﻨﺼﺮ
: ﺑﻪ ﺻﻮرت زﻳﺮ ﭘﻴﺎده ﺳﺎزي ﻣﻲ ﺷﻮدLoadCustomer ﻣﺘﺪ
<head runat="server">
<script type="text/javascript"
src="javaScript/xmlHttp.js"></script>
<script type="text/javascript" >
function LoadCustomers(){
var ddlCtrl=document.
getElementById("ddlCustomers");
</script>
</head>
: ﻧﻴﺰ ﺑﻪ ﺻﻮرت زﻳﺮ ﭘﻴﺎده ﺳﺎزي ﻣﻲ ﺷﻮدShowCustomer ﺗﺎﺑﻊ
function ShowCustomer(responseText,responseXML){
ﻓﺮاﺧﻮاﻧﻲXMLHTTP ﺗﻮﺳﻂ ﺷﻲhandeler اﻳﻦ. را در زﻳﺮ ﻣﻲ ﺑﻴﻨﻴﺪHTTP handeler ﭘﻴﺎده ﺳﺎزي ﻳﻚ
ﺑﻪ ﺷﻲ، ﻛﺎرﻣﻨﺪemail ﺷﺎﻣﻞ ﻧﺎم و،XML ﻛﺎرﺑﺮ را ﮔﺮﻓﺘﻪ و از آن ﺑﺮاي ﺑﺮﮔﺮداﻧﺪن ﻳﻚ ﺳﻨﺪID و،ﻣﻲ ﺷﻮد
. ﻗﺮار ﻣﻲ ﮔﻴﺮدAsyncRequestHandler.ashx اﻳﻦ ﻛﺪ در ﻓﺎﻳﻞ. اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪXMLHTTP
<%@ WebHandler Language="C#" Class="AsyncRequestHandler" %>
using System;
using System.Web;
}
ﻓﺼﻞ 79 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
public AsyncService () {
}
[WebMethod]
public int AdderAdder(int arg1, int arg2) {
return arg1 + arg2;
}
}
اﻳﻦ ﻣﺘﺪ ﻣﻘﺎدﻳﺮ دو ﻓﻴﻠﺪ را ﮔﺮﻓﺘﻪ و ﻳﻚ. ﻣﻲ ﭘﺮدازﻳﻢExecWebService() ﺣﺎل ﺑﻪ ﭘﻴﺎده ﺳﺎزي ﻣﺘﺪ
: اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ،getDataCallBack ﺑﻪ ﺗﺎﺑﻊShowResoult ي ﺑﺎ ﭘﺎس دادن ﻣﺘﺪ-ajax درﺧﻮاﺳﺖ
function ExecWebService(){
getDataCallBack(ShowResoult,'http://' +
location.host +'/AspAjaxSample/AsyncService.asmx
/Adder?arg1=' + ctlVal1.value + '&arg2=' +
ctlVal2.value);
}
: ﺑﻪ ﻛﺎر ﻣﻲ رودWeb Server ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺪار ﺑﺮﮔﺮداﻧﺪه ﺷﺪه ازShowResoult ﻣﺘﺪ
function ShowResoult(responseText,responseXML){
var disp = document
.getElementById("spnDetailDisplay");
var result = responseXML.lastChild
.childNodes[0].nodeValue;
disp.childNodes[0].nodeValue = "Result: " +
result;
}
اﻳﻦ ﻣﻮﺿﻮع ﻧﺸﺎن از اﻳﺠﺎد ﻳﻚ ﻣﺸﻜﻞ در ﻛﺪ. ﻫﻴﭻ ﺟﻮاﺑﻲ از ﺳﻤﺖ ﺳﺮور درﻳﺎﻓﺖ ﻧﺨﻮاﻫﻴﺪ ﻛﺮد،ﺑﺎ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ
ﻛﻪ ﺑﺮ رويFirebug ﻣﺎﻧﻨﺪDebug ﺑﺮاي ﭘﻲ ﺑﺮدن ﺑﻪ ﻣﺸﻜﻞ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻧﺮم اﻓﺰارﻫﺎي.ﺷﻤﺎ ﻣﻲ ﺑﺎﺷﺪ
در اﻳﻨﺠﺎ ﻣﺎ از ﺗﻐﻴﻴﺮ در ﻛﺪ ﺑﺮﻧﺎﻣﻪ اﺷﻜﺎل ﻣﻮﺟﻮد را ﺑﺮرﺳﻲ ﻣﻲ. ﻛﺎر ﻣﻲ ﻛﻨﻨﺪ اﺳﺘﻔﺎده ﻛﻨﻴﺪFirefox ﻣﺮورﮔﺮ
: را ﺑﻪ ﺻﻮرت زﻳﺮ ﺗﻐﻴﻴﺮ دﻫﻴﺪgetDataCallBack در ﻛﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺗﺎﺑﻊ.ﻛﻨﻴﻢ
function getDataCallBack(callBack,dataSource)
81 4 ﻓﺼﻞ ASP.Net درAjax ﻛﺎر ﺑﺎ
{ .
.
.
}
}
ﻛﻪ ﻣﺸﻜﻞ در ارﺳﺎل درﺧﻮاﺳﺖ ﺑﻪ ﺳﻤﺖ،ﺑﺎ اﺟﺮاي دوﺑﺎره ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﭘﻴﻐﺎم ﺧﻄﺎ در ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮد
.ﺳﺮور را ﺑﻴﺎن ﻣﻲ ﻛﻨﺪ
></protocols
></webServices
></system.web
></configuration
ﺑﺎ اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ ﺑﺎﻻ در ،web.configﺑﺮﻧﺎﻣﻪ اﺟﺮا اﺟﺮا ﺧﻮاﻫﺪ ﺷﺪ.
ﺑﺮاي اﺳﺘﻔﺎده از رﺷﺘﻪ آرﮔﻮﻣﺎﻧﻬﺎ ،ﻛﻪ در ﻣﺜﺎل ﺑﺎﻻ ﻧﺸﺎن داده ﺷﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻣﺘﺪ )( sendﺷﻲ XMLHTTP
ﺑﺮاي اﻟﺤﺎق داده ﻫﺎ ﺑﺎ ﺑﺪﻧﻪ درﺧﻮاﺳﺖ اﺳﺘﻔﺎده ﻛﻨﻴﺪ .در اﻳﻦ ﺻﻮرت اﺣﺘﻴﺎﺟﻲ ﺑﻪ اﺿﺎﻓﻪ ﻛﺮدن ﻛﺪ در
web.configﻧﺨﻮاﻫﻴﺪ داﺷﺖ.
ﺑﺮاي ﻧﻮﺷﺘﻦ اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﭘﺮوﺗﻜﻞ POSTاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ،ﺑﻪ ﻫﻤﻴﻦ دﻟﻴﻞ ﺑﺎﻳﺴﺘﻲ )(getDataCallBack
را ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﭘﺮوﺗﻜﻞ آﻣﺎده ﻛﻨﻴﺪ .روش ﺧﻮﺑﻲ ﻛﻪ ﺑﺮاي اﻳﻦ ﻛﺎر ﻣﻲ ﺗﻮان ﭘﻴﺸﻨﻬﺎد داد اﺳﺘﻔﺎده از ﻳﻚ
آرﮔﻮﻣﺎن ﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﻧﻮع ﭘﺮوﺗﻜﻞ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ در ﻫﺮ ﺑﺎر ﻓﺮاﺧﻮاﻧﻲ ﺑﺎﻳﺴﺘﻲ ﭘﺮوﺗﻜﻞ را ﺑﻪ آن ﭘﺎس داد.
در اﻳﻨﺠﺎ ﻳﻚ ﻣﺘﺪ ﺟﺪﻳﺪ ﺑﺮاي اﺳﺘﻔﺎده از اﻳﻦ ﭘﺮوﺗﻜﻞ اﺿﺎﻓﻲ ﭘﻴﺎده ﺳﺎزي ﻣﻲ ﺷﻮد.
)function getDataCallBackWithPost(callBack,dataSource,sendData
{
;)(xmlHttp = createXMLHttp
{ )if(xmlHttp
;)xmlHttp.open("POST", dataSource
)(xmlHttp.onreadystatechange = function
{
== if (xmlHttp.readyState == 4 && xmlHttp.status
{ )200
callBack(xmlHttp.responseText,xmlHttp.
;)responseXML
{}else
;)alert(xmlHttp.responseText
}
}
xmlHttp.setRequestHeader("Content-
Type","application/x-
;)"www-form-urlencoded
;)xmlHttp.send(sendData
}
}
ﺗﻐﻴﻴﺮات ﺗﺎﺑﻊ )( getDataCallBackWithPostﻧﺴﺒﺖ ﺑﻪ ﺗﺎﺑﻊ )( getDataCallBackﺑﻪ
ﺻﻮرت ﭘﺮ رﻧﮓ ﻧﺸﺎن داده ﺷﺪه اﺳﺖ .آرﮔﻮﻣﺎن ، sendDataرﺷﺘﻪ آرﮔﻮﻣﺎﻧﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ ﺑﺪﻧﻪ درﺧﻮاﺳﺖ
اﻟﺤﺎق ﺷﺪه و ﺑﻪ ﺳﺮور ارﺳﺎل ﻣﻲ ﺷﻮد .ﺣﺎل ﺑﻪ ﺑﺪﻧﻪ ﺻﻔﺤﻪ HTMLدﻛﻤﻪ ي ﺑﺮاي اﻧﺠﺎم ﻋﻤﻠﻴﺎت ﺟﻤﻊ ﺑﺎ ﻣﺘﺪ
POSTاﺿﺎﻓﻪ ﻛﻨﻴﺪ:
.
.
.
<input type="button" value="CalculateWithPost"
onclick="ExecWebServiceWithPost();" />
.
.
.
</form>
:ﺣﺎل ﻣﺘﺪ را ﺑﻪ ﺻﻮرت زﻳﺮ ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ
function ExecWebServiceWithPost(){
arg1=1&arg2=2
اﻳﻦ رﺷﺘﻪ ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎرﺑﻪ ﻋﻨﻮان ﻗﺴﻤﺘﻲ از ﺑﺪﻧﻪ. ﻣﻲ ﺑﺎﺷﺪ2 ﺑﺮاﺑﺮ ﺑﺎarg2 و1 ﺑﺮاﺑﺮarg1 ﻛﻪ ﻣﻘﺪار
اﻳﻦ روش ﻣﺎﻧﻨﺪ ﻫﻤﺎن روﺷﻲ اﺳﺖ ﻛﻪ. ﻣﺪﻳﺮﻳﺖ ﺧﻮاﻫﺪ ﺷﺪweb Service درﺧﻮاﺳﺖ در آﻣﺪه و ﺑﺎ ﺗﻮﺳﻂ
ﻣﻲ ﺗﻮاﻧﺪ ﺷﺒﻴﻪ ﻛﺪ زﻳﺮURL درﺧﻮاﺳﺖ ﻣﺸﺎﺑﻪ ﺑﺎ اﺳﺘﻔﺎده از رﺷﺘﻪ آرﮔﻮﻣﺎﻧﻬﺎ در. اﻧﺠﺎم ﻣﻲ ﺷﺪGET درﺧﻮاﺳﺖ
:ﺑﺎﺷﺪ
http://www.somesite.com/SomePage.aspx?arg1=1&arg2=2
: ﺣﺎﺻﻞ ﺟﻤﻊ ﺑﻪ ﺻﻮرت زﻳﺮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد،در آﺧﺮ
var result = responseXML.lastChild.text;
ﭘﺎﺳﺨﻲ ﻛﻪ ﺑﻪ. ﺑﻪ دﺳﺖ ﻣﻲ آوردWebServer ﻣﻘﺪار رﺷﺘﻪ ي آﺧﺮﻳﻦ ﮔﺮه ﻓﺮزﻧﺪ را از ﭘﺎﺳﺦ،اﻳﻦ دﺳﺘﻮر
: ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد، داده ﻣﻲ ﺷﻮد،webServer آرﮔﻮﻣﺎﻧﻬﺎﻳﻲ ﺑﺎ ﻣﻘﺎدﻳﺮ ﮔﻔﺘﻪ ﺷﺪه ﺑﻪ درﺧﻮاﺳﺖ
<?xml version=”1.0” encoding=”utf-8”?>
<int xmlns=”http://tempuri.org/”>3</int>
: اﻣﻜﺎن روﺑﺮو ﺷﺪن ﺑﺎ دوﻧﻮع ﺧﻄﺎ وﺟﻮد داردﻛﻪ ﺑﺎﻳﺪ ﺑﻪ روﺷﻬﺎي ﻣﺨﺘﻠﻔﻲ ﻣﺪﻳﺮﻳﺖ ﺷﻮد،در اﻳﻦ ﻣﺜﺎل
( از آن ﺣﺬف ﺷﻮد و ﻳﺎ/Adder )در اﻳﻦ ﻣﺜﺎلurl اوﻟﻴﻦ ﺧﻄﺎ زﻣﺎﻧﻲ اﺗﻔﺎق ﻣﻲ اﻓﺘﺪ ﻛﻪ ﻣﺘﺪ ﺗﻌﻴﻴﻦ ﺷﺪه در-
.آرﮔﻮﻣﺎن ﻧﺎﻣﻌﺘﺒﺮ ﺑﺎ درﺧﻮاﺳﺖ ارﺳﺎل ﺷﻮد
.“ ﺑﺮاي ﻫﺪر درﺧﻮاﺳﺖ ﻓﺮاﻣﻮش ﺷﻮدContent-Type” ﻧﻮع ﺑﻌﺪي از ﺧﻄﺎ زﻣﺎﻧﻲ اﺗﻔﺎق ﻣﻲ اﻓﺘﺪ ﻛﻪ ﺗﻌﻴﻦ-
ﺑﺪﻧﻪ ﭘﺎﺳﺦ ﻣﺎﻧﻨﺪ ﻣﺜﺎل، در ﻧﻤﻮﻧﻪ اول. ﺧﻮاﻫﻴﺪ داﺷﺖstatus را ﺑﺮاي500 ﺷﻤﺎ ﻣﻘﺪار،ﺑﺮاي ﻫﺮ دو ﻣﻮرد ﺧﻄﺎ
:زﻳﺮ ﺧﻮاﻫﻴﺪ داﺷﺖ
System.InvalidOperationException: Request format is invalid. :
at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()
at
System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()
at
System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.
Read()
at System.Xml.XmlReader.MoveToContent()
at
System.Web.Services.Protocols.SoapServerProtocol.SoapEnvelopeReader.
MoveToContent()
at
System.Web.Services.Protocols.SoapServerProtocolHelper.GetRequestEle
ment()
at
System.Web.Services.Protocols.Soap12ServerProtocolHelper.RouteReques
t()
at
System.Web.Services.Protocols.SoapServerProtocol.RouteRequest(SoapSe
rverMessage
message)
at System.Web.Services.Protocols.SoapServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type
type,
HttpContext context, HttpRequest request, HttpResponse response,
Boolean&
abortProcessing)
--- End of inner exception stack trace ---
</soap:Text></soap:Reason><soap:Detail
/></soap:Fault></soap:Body></soap:Envelope>
ASP.NET AJAX
ﻛﺘﺎﺑﺨﺎﻧﻪ اي از ﺗﻮاﺑﻊ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ ﺷﺮﻛﺖMicrosoft Ajax ﻳﺎ ﺑﻪ ﺑﻴﺎن ﻛﺎﻣﻞ ﺗﺮMS Ajax
اﻳﺠﺎد ﺷﺪهVS 2005 در ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺤﺖ وب درAjax ﻣﺎﻳﻜﺮوﺳﺎﻓﺖ ﺑﻪ ﻣﻨﻈﻮر ﺑﻬﺮه ﮔﻴﺮي از ﺗﻜﻨﻮﻟﻮژي
.اﺳﺖ
(Open Source) ﺑﻮده و ﻫﻢ اﻛﻨﻮن ﺑﻪ ﺻﻮرت ﻣﻨﺒﻊ ﺑﺎزAtlas ﻻزم ﺑﻪ ذﻛﺮ اﺳﺖ ﻛﻪ ﻧﺎم ﺳﺎﺑﻖ آن
.در دﺳﺘﺮس ﻣﻲ ﺑﺎﺷﺪ
اوﻟﻴﻦ ﭼﻴﺰي ﻛﻪ ﺷﺎﻳﺪ در ﻣﻮرد ﻣﻌﻤﺎري ﻓﺮﻳﻢ ورك ASP.NET AJAXﺑﻪ آن ﺗﻮﺟﻪ ﻛﻨﻴﺪ اﻳﻦ اﺳﺖ ﻛﻪ ﻛﻼﻳﻨﺖ
و ﺳﺮور را ﭘﻮﺷﺶ ﻣﻲ دﻫﺪ .ﺑﻪ ﻏﻴﺮ از ﻳﻚ ﻣﺠﻤﻮﻋﻪ از ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ و ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎ ﻣﻮارد ﺑﺴﻴﺎري وﺟﻮد دارد ﻛﻪ
در ﺳﻤﺖ ﺳﺮور ﺑﺎ ﻛﻨﺘﺮﻟﻬﺎي ﺳﻤﺖ ﺳﺮور و ﺳﺮوﻳﺲ ﻫﺎي ASP.NETﺣﻤﺎﻳﺖ ﻣﻲ ﺷﻮﻧﺪ.
ﻫﺪف ﺳﻴﺴﺘﻢ ﻧﻮع ﻣﻌﺮﻓﻲ ﻣﻔﻬﻮﻣﻲ ﺷﺒﻴﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﺷﻲ ﮔﺮا در ﺟﺎوا اﺳﻜﺮﻳﭙﺖ ﻣﻲ ﺑﺎﺷﺪ؛ ﻣﺎﻧﻨﺪ ﻛﻼس ﻫﺎ ،ارث
ﺑﺮي ،اﻳﻨﺘﺮﻓﻴﺲ ﻫﺎ و ﻣﺪﻳﺮﻳﺖ روﻳﺪاد .اﻳﻦ ﻻﻳﻪ ﻫﻤﭽﻨﻴﻦ ﻧﻮع ﻫﺎي ﻣﻮﺟﻮد در ﺟﺎوااﺳﻜﺮﻳﭙﺖ را ﺑﺴﻂ ﻣﻲ دﻫﺪ .ﺑﺮاي
ﻣﺜﺎل ،ﻧﻮع ﻫﺎي Stringو Arrayدر ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻫﺮ دو ﺑﺮاي آﻣﺎده ﺳﺎزي ﺗﻮاﺑﻊ اﺿﺎﻓﻲ و آﺷﻨﺎ ﺑﻮدن ﺑﺮاي
ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن ASP.NETﺑﺴﻂ داده ﺷﺪه اﻧﺪ .ﺳﻴﺴﺘﻢ ﻧﻮع زﻣﻴﻨﻪ ي ﻛﺎري را ﺑﺮاي اﺗﻜﺎي )راﺣﺘﻲ( ﻛﺘﺎﺑﺨﺎﻧﻪ
ﻫﺴﺘﻪ اي Ajaxاﻳﺠﺎد ﻣﻲ ﻛﻨﺪ.
در ﺑﺎﻻي ﺳﻴﺴﺘﻢ ﻧﻮع ﻻﻳﻪ ﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ ) (components layerﻗﺮار دارﻧﺪ ،اﻳﻦ ﻻﻳﻪ ﺑﺨﺶ ﻋﻤﺪه ي
ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺴﺘﻪ ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﻻﻳﻪ از ﺳﺮي ﻛﺮدن )ﺳﺮﻳﺎل ﺳﺎزي( ،JSONارﺗﺒﺎﻃﺎت ﺷﺒﻜﻪ ،ﻣﺤﻠﻲ ﺳﺎزي ،ﻓﻌﺎﻟﻴﺘﻬﺎي
DOMو ﺳﺮوﻳﺴﻬﺎي ﺑﺮﻧﺎﻣﻪ ASP.NETﻣﺎﻧﻨﺪ اﻋﺘﺒﺎر ﺳﻨﺠﻲ و ﭘﺮوﻓﺎﻳﻞ ،ﺣﻤﺎﻳﺖ ﻣﻲ ﻛﻨﺪ .ﻫﻤﭽﻨﻴﻦ ﺗﺼﻮﻳﺮي از
ﺳﺎﺧﺘﻤﺎن ﻣﺪل ﻫﺎي ﻗﺎﺑﻞ اﺳﺘﻔﺎده را ﻣﻌﺮﻓﻲ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﻪ ﻋﻨﻮان ﻛﻨﺘﺮل و رﻓﺘﺎرﻫﺎ در ﺻﻔﺤﻪ دﺳﺘﻪ ﺑﻨﺪي
ﺷﻮﻧﺪ.
اﻳﻦ ﻻﻳﻪ ﻣﺎ را ﺑﻪ ﻻﻳﻪ ﺑﺎﻻﺗﺮ در ﻛﺘﺎﺑﺨﺎﻧﻪ ﻣﺘﺼﻞ ﻣﻲ ﻛﻨﺪ .ﻻﻳﻪ ﺑﺮﻧﺎﻣﻪ ) (Application layerﻳﻚ ﺑﺨﺶ
ﺗﻮﺿﻴﺤﻲ ﺑﺮاي Application modelاﺳﺖ .ﻫﻤﺎﻧﻨﺪ ﭼﺮﺧﻪ ﺣﻴﺎت ﺻﻔﺤﻪ در ASP.NETاﻳﻦ ﻻﻳﻪ ﻳﻚ
ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻣﺪﻳﺮﻳﺖ روﻳﺪاد را اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮاي ﻛﺎر ﺑﺎ ﻋﻨﺎﺻﺮ ،DOMﻛﺎﻣﭙﻮﻧﻨﺖ ﻫﺎ و
ﭼﺮﺧﻪ ﺣﻴﺎت ﻫﺮ ﺑﺮﻧﺎﻣﻪ در ﻣﺮورﮔﺮ از آن اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
JavaScript ،HTMLو XML Script
ﺻﻔﺤﺎت وب ﺑﺎ ﺗﻮاﻧﺎﻳﻲ ASP.NET AJAXدر ،HTMLﺟﺎوااﺳﻜﺮﻳﭙﺖ و ﻳﻚ ﺗﻌﺮﻳﻒ ﻛﻨﻨﺪه ﮔﺮاﻣﺮ ﺟﺪﻳﺪ ﺑﺮ
ﭘﺎﻳﻪ XMLﻛﻪ XML Scriptﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد ،ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ ﻣﻮﺿﻮع ﺑﻴﺶ از ﻳﻚ ﮔﺰﻳﻨﻪ ﺑﺮاي ﻧﻮﺷﺘﻦ ﻛﺪ
در ﺳﻤﺖ ﻛﻼﻳﻨﺖ را ﺑﺮاي ﺷﻤﺎ آﻣﺎده ﻣﻲ ﻛﻨﺪ .ﻋﻨﺎﺻﺮ ﺗﻌﺮﻳﻒ ﺷﺪه در XML Scriptداﺧﻞ ﺗﮓ ﺟﺪﻳﺪ
اﺳﻜﺮﻳﭙﺘﻲ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ:
>"<script type="text/xml-script
ﻣﺮورﮔﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺗﮓ اﺳﻜﺮﻳﭙﺖ را ﺗﺸﺨﻴﺺ ﺑﺪﻫﺪ اﻣﺎ ﻣﻜﺎﻧﻴﺴﻤﻲ ﺑﺮاي ﭘﺮدازش ﻧﻮع XML Scriptﻧﺪارد .در
ﻋﻮض ،ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻮﺟﻮد درﻓﺮﻳﻢ ورك ASP.NET AJAXﻣﻲ ﺗﻮاﻧﺪ اﺳﻜﺮﻳﭙﺘﻬﺎ را ﺗﺠﺰﻳﻪ ﻛﺮده ،ﻳﻚ
ﻧﻤﻮﻧﻪ ﻛﺎﻣﭙﻮﻧﻨﺖ و ﻛﻨﺘﺮل را در ﺻﻔﺤﻪ اﻳﺠﺎد ﻛﻨﺪ .دراداﻣﻪ ﺗﻜﻪ ﻛﺪي را ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻧﺸﺎن ﻣﻲ دﻫﺪ XML
Scriptﭼﮕﻮﻧﻪ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻳﻚ ﭘﻴﻐﺎم ﺑﻌﺪ از اﻳﻨﻜﻪ ﺻﻔﺤﻪ ﻟﻮد ﺷﺪ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮد:
>"<script type="text/xml-script
>"<page xmlns="http://schemas.microsoft.com/xml-script/2005
><components
><application load="page_load" /
></components
></page
></script
>"<script type="text/javascript
{)function page_load(sender, e
;)"!alert("Hello from XML-Script
ﻛﺎر ﺑﺎ Ajaxدر ASP.Net 88ﻓﺼﻞ 4
}
></script
دراﻳﻦ ﻣﺜﺎل ،در ﺗﮓ XML Scriptﻳﻚ ﺗﺎﺑﻊ ﺟﺎوااﺳﻜﺮﻳﭙﺘﻲ ﺑﻪ ﻧﺎم page_loadرا ﺑﻪ روﻳﺪاد loadﺻﻔﺤﻪ
ﻧﺴﺒﺖ ﻣﻲ دﻫﺪ .اﺟﺮاي اﻳﻦ ﺻﻔﺤﻪ ﺗﺎﺑﻊ page_loadرا ﺑﻌﺪ از ﻓﻌﺎل ﺷﺪن روﻳﺪاد loadﺑﺮاي ﻧﻤﺎﻳﺶ ﺟﻌﺒﻪ
ﭘﻴﻐﺎم در ﻛﻼﻳﻨﺖ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪ.
XMl Scriptو ﺟﻨﺒﻪ ﻫﺎي دﻳﮕﺮ ﻣﻮﺟﻮد در ﻓﺮﻳﻢ ورك در ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺟﺪاﮔﺎﻧﻪ اي از ﻣﻨﺎﺑﻊ ﺑﻪ ﻧﺎم
ASP.NET Futureاراﺋﻪ ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ وﻳﮋﮔﻲ ﻫﺎ در وﺿﻌﻴﺖ ﭘﻴﺶ ﻧﻤﺎﻳﺶ ﺗﻜﻨﻮﻟﻮژي اﺟﺘﻤﺎع )(CTP
ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﻨﺪ(Community Technology Preview) CTP .وﺿﻌﻴﺖ ﻓﻌﻠﻲ ﻣﺤﺼﻮﻻﺗﻲ را ﻛﻪ
ﻫﻨﻮز اﻣﻜﺎن ﺗﻐﻴﻴﺮ دارﻧﺪ را ﻣﻨﻌﻜﺲ ﻣﻲ ﻛﻨﺪ .دراﻳﻦ ﺻﻮرت ASP.NET Future CTP ،ﺑﺴﻄﻲ از ﻫﺴﺘﻪ ﻓﺮﻳﻢ
ورك ASP.NET AJAXاﺳﺖ ﻛﻪ ﺳﺮاﻧﺠﺎم در ﺑﺴﺘﻪ ﻫﺴﺘﻪ ادﻏﺎم ﺧﻮاﻫﺪ ﺷﺪ.
ﻓﺮﻳﻢ ورك ﺳﺮور
ASP.NET 2.0از ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺑﺎارزﺷﻲ از ﻛﻨﺘﺮل ﻫﺎ و ﺳﺮوﻳﺲ ﻫﺎ ﻛﻪ ﻗﺎﺑﻞ ﺗﻮﺳﻌﻪ ﺑﺮاي ﭘﺸﺘﻴﺒﺎﻧﻲ Ajaxﻣﻲ
ﺑﺎﺷﺪ ،اﻳﺠﺎد ﺷﺪه اﺳﺖ .اﻳﻦ ﻻﻳﻪ از ﻓﺮﻳﻢ ورك ﺳﺮور ASP.NET AJAX server extensions
ﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد server extensions .ﺑﻪ ﺳﻪ ﻗﺴﻤﺖ ﺗﻘﺴﻴﻢ ﻣﻲ ﺷﻮﻧﺪ :ﻛﻨﺘﺮل ﻫﺎي ﺳﺮوري ،ﭘﻞ ﺳﺮوﻳﺲ
ﻫﺎي وب ) (web serviceو ﭘﻞ ﺳﺮوﻳﺲ ﻫﺎي ﺑﺮﻧﺎﻣﻪ) .(Application servicesﻫﺮ ﻳﻚ از
اﻳﻦ ﻗﺴﻤﺖ ﻫﺎ در ارﺗﺒﺎط ﻧﺰدﻳﻚ ﺑﺎ ﻣﺪل ﺑﺮﻧﺎﻣﻪ در ﻛﻼﻳﻨﺖ ﺑﺮاي ﺑﻬﺒﻮد ﻓﻌﻞ و اﻧﻔﻌﺎل ﺻﻔﺤﺎت ASP.NETﺑﺮ
ﻳﻜﺪﻳﮕﺮ ،ﻫﺴﺘﻨﺪ.
ﻛﻨﺘﺮل ﻫﺎي ﺳﺮور ASP.NET AJAX
ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﺟﺪﻳﺪ از ﻛﻨﺘﺮل ﻫﺎي ﺳﺮور ﺑﻪ ﻧﻮار اﺑﺰار ASP.NETاﺿﺎﻓﻪ ﻣﻲ ﺷﻮد ﻛﻪ ﻋﻤﺪﺗﺎً ﺑﺎ دو ﻛﻨﺘﺮل ﻣﺪﻳﺮﻳﺖ
ﻣﻲ ﺷﻮد .اوﻟﻴﻦ ﻧﻮع از اﻳﻦ ﻛﻨﺘﺮل ﻫﺎ ScriptManagerﻣﻲ ﺑﺎﺷﺪ ،ﻛﻪ ﻣﻔﻬﻮم ﻳﻚ ﺻﻔﺤﻪ ﺑﺎ ﻗﺎﺑﻠﻴﺖ Ajaxرا
ﻃﺮح رﻳﺰي ﻣﻲ ﻛﻨﺪ .ﻳﻜﻲ از وﻇﺎﻳﻒ ﻋﻤﺪه ي ScriptManagerﺗﻨﻈﻴﻢ ﺑﺨﺸﻲ ازﺻﻔﺤﻪ اﺳﺖ ﻛﻪ ﻫﻨﮕﺎم
درﻳﺎﻓﺖ ﺟﻮاب ﺑﺼﻮرت ﻏﻴﺮﻫﻤﺎن ﺑﻪ روز رﺳﺎﻧﻲ ﻣﻲ ﺷﻮد .ﻛﻨﺘﺮل دوم UpdatePanel ،ﻧﺎم دارد ،و ﺑﺮاي
ﻣﺸﺨﺺ ﻛﺮدن آن ﺑﺨﺸﻲ از ﺻﻔﺤﻪ ﻛﻪ ﻧﻴﺎز دارد ﺑﻪ روز رﺳﺎﻧﻲ ﺷﻮد اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .اﻳﻦ دو ﻛﻨﺘﺮل ﺑﺎ ﻫﻢ ﺑﺮاي
ﺑﺎﻻ ﺑﺮدن ﺗﺠﺮﺑﻪ ﻛﺎرﺑﺮ ﺑﺎ ﺟﺎﻳﮕﺰﻳﻨﻲ ارﺳﺎل و درﻳﺎﻓﺖ اﻃﻼﻋﺎت ﻏﻴﺮ ﻫﻤﺰﻣﺎن ﺑﺠﺎي روش ﻗﺒﻠﻲ ﺑﻪ ﻛﺎر ﻣﻲ روﻧﺪ .اﻳﻦ
ﻛﻨﺘﺮل ﻫﺎ ﺑﻪ ﺟﺎي ﺑﻪ روز رﺳﺎﻧﻲ ) (refreshﻛﻞ ﺻﻔﺤﻪ در ﺑﺨﺸﻲ از ﺻﻔﺤﻪ ﻛﻪ ﺑﺎﻳﺪ ﺑﻪ روز رﺳﺎﻧﻲ ﺷﻮد ﻣﻮرد
اﺳﺘﻔﺎده ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ.
ﭘﻞ Web services
ﺑﻄﻮرﻧﻤﻮﻧﻪ ،ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﺑﻪ ﻣﻨﺎﺑﻊ ﺑﺮ روي ﺳﺮورﻫﺎي ﻣﺤﻠﻲ ﺷﺎن ﻣﺤﺪود ﻣﻲ ﺷﻮﻧﺪ .ﮔﺬﺷﺘﻪ از ﻳﻚ ﺳﺮي ﻣﻨﺎﺑﻊ
ﺧﺎرﺟﻲ ،ﻣﺎﻧﻨﺪ ﺗﺼﺎوﻳﺮ و ﻓﺎﻳﻠﻬﺎي ،CSSﺑﺮﻧﺎﻣﻪ ﻫﺎ اﺟﺎزه دﺳﺘﺮﺳﻲ ﺑﻪ ﻣﻨﺎﺑﻌﻲ ﻛﻪ در ﻣﺤﺪوده ﻛﻼﻳﻨﺖ ﻫﺴﺘﻨﺪ را
ﻧﺪارﻧﺪ .ﺑﺮاي ﻏﻠﺒﻪ ﺑﺮ اﻳﻦ ﻣﺎﻧﻊ server extensions ،در ﻓﺮﻳﻢ ورك ASP.NET AJAXﺷﺎﻣﻞ ﻳﻚ
ﻓﺼﻞ 89 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
web services bridgeاﺳﺖ ﻛﻪ دروازه اي ﺑﺮاي ﺷﻤﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ ﺗﺎ از ﻃﺮﻳﻖ آن ﺳﺮوﻳﺲ ﻫﺎي وب
ﺧﺎرﺟﻲ را از ﻃﺮﻳﻖ اﺳﻜﺮﻳﭙﺖ ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ.
ﭘﻞ Application services
ﺑﻪ ﻋﻠﺖ اﻳﻨﻜﻪ ASP.NET AJAXﺑﺎ ASP.NETﻋﻤﻴﻘﺎ ﺗﺮﻛﻴﺐ ﺷﺪه اﺳﺖ دﺳﺘﺮﺳﻲ ﺑﻪ ﺑﺮﺧﻲ از ﺳﺮوﻳﺲ ﻫﺎي
ﺑﺮﻧﺎﻣﻪ ﻣﺎﻧﻨﺪ اﻋﺘﺒﺎر ﺳﻨﺠﻲ ) (authenticationو ﺳﺎﺑﻘﻪ ) (profileﻛﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ اﺿﺎﻓﻪ ﺷﺪه ﺑﺎﺷﻨﺪ
ﺧﻴﻠﻲ ﺑﺪون دردﺳﺮ اﺳﺖ .اﻳﻦ وﻳﮋﮔﻲ ﻗﺎدر ﻣﻲ ﺳﺎزد ﻋﻤﻠﻴﺎﺗﻲ ﻣﺎﻧﻨﺪ ﺗﺼﺪﻳﻖ ) (verifyingاﻋﺘﺒﺎرﻧﺎﻣﻪ ﻳﻚ
ﻛﺎرﺑﺮ و دﺳﺘﺮﺳﻲ ﺑﻪ اﻃﻼﻋﺎت ﺳﺎﺑﻘﻪ ﻛﺎرﺑﺮ از ﻃﺮﻳﻖ اﺳﻜﺮﻳﭙﺖ ﻫﺎي ﻛﻼﻳﻨﺘﻲ ﺳﺎزﻣﺎﻧﺪﻫﻲ ﺷﻮﻧﺪ.
اﻛﻨﻮن ﻛﻪ ﻳﻚ اﻳﺪه ﻛﻠﻲ از ﺑﺨﺶ ﻫﺎي ﺳﺎزﻧﺪه ﻓﺮﻳﻢ ورك دارﻳﺪ ﺑﻬﺘﺮ اﺳﺖ ﺑﺎ ﺳﻮاﻟﻲ ﻛﻪ ﭼﮕﻮﻧﻪ اﻳﻦ ﺑﺨﺶ ﻫﺎ را
ﺑﻄﻮر ﻣﻮﺛﺮ ﺑﻜﺎر ﺑﺒﺮﻳﻢ؟ ﺷﺮوع ﻛﻨﻴﻢ .ﺟﻮاب اﻳﻦ ﺳﻮال ﻣﻨﺠﺮ ﺑﻪ ﺑﺮرﺳﻲ دو ﺳﻨﺎرﻳﻮي ﺗﻮﺳﻌﻪ ﻣﻲ ﺷﻮد.
ﺻﻔﺤﺎت ASP.NETاﺳﺖ ﻣﺪﻟﻲ ﻛﻪ در آن واﺳﻂ ﻛﺎرﺑﺮي را ﺑﺎ ارﺳﺎل داده ﺑﻪ ﻣﺮورﮔﺮ ﺑﻪ ﻋﻨﻮان ﺧﺮوﺟﻲ ﺗﻮﻟﻴﺪ
ﻣﻲ ﻛﻨﺪ .ﺗﻔﺎوت ﺑﻴﻦ اﻳﻦ ﻣﺪل و ﻣﺪل ﻗﺒﻠﻲ وب در Asp.netاﻳﻦ اﺳﺖ ﻛﻪ آن ﻗﺴﻤﺖ از واﺳﻂ ﻛﺎرﺑﺮي ﻛﻪ
ﻧﻴﺎزدارد ﺑﻌﻨﻮان ﺧﺮوﺟﻲ ﻧﻤﺎﻳﺶ داده ﺷﻮد ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﻣﺮورﮔﺮي ﭘﺎس داده ﻣﻲ ﺷﻮد ﻧﻪ ﻣﺎﻧﻨﺪ ﻣﺪل ﻗﺒﻠﻲ ﻛﻪ ﺗﻤﺎم
ﺻﻔﺤﻪ ارﺳﺎل ﻣﻲ ﺷﺪ.
ﺷﻜﻞ 5-7ﻣﺪل ﺳﺮور ﻣﺤﻮري ﺗﻮﺳﻌﻪ را ﻧﺸﺎن ﻣﻲ دﻫﺪ.
;using System
public static class HumanResources
{
)public static int GetEmployeeCount(string department
{
;int count = 0
)switch (department
{
case "Sales":
;count = 10
;break
case "Engineering":
;count = 28
ﻛﺎر ﺑﺎ Ajaxدر ASP.Net 92ﻓﺼﻞ 4
;break
case "Marketing":
;count = 44
;break
case "HR":
;count = 7
;break
default:
;break
}
;return count
}
}
اﻳﻦ ﻛﻼس ﺷﺎﻣﻞ ﻳﻚ ﻣﺘﺪ ﺑﻨﺎم GetEmployeeCountﻣﻲ ﺑﺎﺷﺪ ،ﻛﻪ ﻧﺎم دﭘﺎرﺗﻤﺎن را ﺑﻪ ﻋﻨﻮان ﭘﺎراﻣﺘﺮ ورودي
درﻳﺎﻓﺖ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻣﺘﺪ از ﻳﻚ switchﺑﺮاي ﻣﺸﺨﺺ ﻛﺮدن ﺗﻌﺪاد ﻛﺎرﻣﻨﺪان ﻫﺮ ﺑﺨﺶ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ.
زﻣﺎﻧﻴﻜﻪ ﻳﻚ وب ﺳﺎﻳﺖ ﺟﺪﻳﺪ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﺪ ،ﻳﻚ ﺻﻔﺤﻪ ﭘﻴﺶ ﻓﺮض ﺑﻨﺎم Default.aspxدر آن اﻳﺠﺎد
ﻣﻲ ﺷﻮد ﻛﻪ ﻣﺤﺘﻮاي آن ﻣﺎﻧﻨﺪ ﻛﺪ زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮد:
"<%@ Page Language="C#" AutoEventWireup="true
>CodeFile="Default.aspx.cs" Inherits="_Default" %
<div>
<asp:ListBox AutoPostBack="true" runat="server"
ID="Departments"
OnSelectedIndexChanged="Departments_SelectedIndexChanged">
<asp:ListItem Text="Engineering"
Value="Engineering" />
<asp:ListItem Text="Human Resources"
Value="HR" />
<asp:ListItem Text="Sales" Value="Sales" />
<asp:ListItem Text="Marketing"
Value="Marketing" />
</asp:ListBox>
</div>
<br />
<div>
<asp:Label ID="EmployeeResults" runat="server" />
</div>
، ﻛﻨﺘﺮلAutoPostBack ﺧﺎﺻﻴﺖ.از ﻳﻚ ﻟﻴﺴﺖ ﺑﺮاي ﻧﻤﺎﻳﺶ ﻧﺎم دﭘﺎرﺗﻤﺎن ﻫﺎ ﺟﻬﺖ اﻧﺘﺨﺎب اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد
اﻳﻦ ﻋﻤﻞ ﻳﻌﻨﻲ اﻧﺘﺨﺎب ﻧﺎم ﻳﻚ دﭘﺎرﺗﻤﺎن. ﺗﻨﻈﻴﻢ ﻣﻲ ﺷﻮدtrue ﺑﻪ ﻣﻨﻈﻮر درﺧﻮاﺳﺖ ﻳﻚ ﭘﺎﺳﺦ از ﺳﺮور ﺑﺎ ﻣﻘﺪار
و ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪSelectedIndexChanged از ﻟﻴﺴﺖ ﻛﻪ ﺑﺎﻋﺚ ﻓﻌﺎل ﺷﺪن روﻳﺪاد
Label در اﻧﺘﻬﺎي ﻓﺮم ﻳﻚ ﻛﻨﺘﺮل. در ﻛﺪ ﻣﻲ ﺷﻮدDepartments_SelectedIndexChanged
ﺑﺮاي ﺗﻜﻤﻴﻞ ﺑﺮﻧﺎﻣﻪ ﻳﻚ واﺳﻂ ﻛﺎرﺑﺮي را ﭘﻴﺎده ﺳﺎزي ﻛﻨﻴﺪ ﻛﻪ.ﻗﺮار دارد ﻛﻪ ﻧﺘﻴﺠﻪ ﻋﻤﻠﻴﺎت را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ
:ﺑﺮاي ﺟﺴﺘﺠﻮي ﺗﻌﺪاد ﻛﺎرﻣﻨﺪان ﻣﻮﺟﻮد در دﭘﺎرﺗﻤﺎن اﻧﺘﺨﺎﺑﻲ ﺑﺎﺷﺪ
protected void Departments_SelectedIndexChanged(object
sender,EventArgs e)
{
EmployeeResults.Text = string.Format("Employee count:
{0}",HumanResources.GetEmployeeCountDepartments.SelectedV
alue));
}
: ﻧﺘﻴﺠﻪ ي ﻣﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ را ﻣﻲ ﺗﻮان ﻣﺸﺎﻫﺪ ﻛﺮد،زﻣﺎﻧﻴﻜﻪ ﺑﺮﻧﺎﻣﻪ اﺟﺮا ﺷﻮد و ﻳﻜﻲ از دﭘﺎرﺗﻤﺎﻧﻬﺎ اﻧﺘﺨﺎب ﮔﺮدد
ASP.Net درAjax ﻛﺎر ﺑﺎ 4 ﻓﺼﻞ 94
OnSelectedIndexChanged="Departments_SelectedIndexChanged">
<asp:ListItem Text="Engineering"
Value="Engineering" />
<asp:ListItem Text="Human Resources"
Value="HR" />
<asp:ListItem Text="Sales" Value="Sales"
/>
<asp:ListItem Text="Marketing"
Value="Marketing" />
</asp:ListBox>
</div>
</ContentTemplate>
</asp:UpdatePanel>
: وﻳﮋوال اﺳﺘﻮدﻳﻮ ﺑﻪ ﺻﻮرت زﻳﺮ ﺧﻮاﻫﺪ ﺑﻮدDesign ﻧﺘﻴﺠﻪ ﻛﺎر در ﻗﺴﻤﺖ
ﻓﺼﻞ 95 4 ﻛﺎر ﺑﺎ Ajaxدر ASP.Net
][ScriptService
])"[WebService(Namespace = "http://tempuri.org/
])[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1
{ public class HRService : System.Web.Services.WebService
][ScriptMethod
][WebMethod
)public int GetEmployeeCount(string department
{
;)return HumanResources.GetEmployeeCount(department
}
}
اﺑﺘﺪا ﺑﻪ ﻓﻀﺎي ﻧﺎﻣﻲ System.Web.Script.Servicesﺗﻮﺟﻪ ﻛﻨﻴﺪ .اﻳﻦ ﻓﻀﺎي ﻧﺎﻣﻲ ﻗﺴﻤﺘﻲ از ﻫﺴﺘﻪ
ﻓﺮﻳﻢ ورك ASP.NET AJAXﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﺮﺧﻲ از ارﺗﺒﺎﻃﺎت ﺷﺒﻜﻪ اي و ﻋﻤﻠﻴﺎت اﺳﻜﺮﻳﭙﺘﻲ را ﻛﭙﺴﻮﻟﻪ ﻣﻲ
ﻛﻨﺪ .ﺳﭙﺲ ﺑﻪ ﺧﺎﺻﻴﺖ ﻫﺎي ﺟﺪﻳﺪي ﻛﻪ ﻛﻼس )] ([ScriptServiceو ﺗﻌﺮﻳﻒ ﻣﺘﺪ
)] ([ScriptMethodرا در web serviceدر ﺑﺮ ﻣﻲ ﮔﻴﺮﻧﺪ ﺗﻮﺟﻪ ﻛﻨﻴﺪ .اﻳﻦ ﺧﺎﺻﻴﺖ ﻫﺎ ﺗﻮﺳﻂ
ASP.NET Ajaxﺗﺠﺰﻳﻪ ﺷﺪه و ﺑﺮاي ﺗﻌﻴﻴﻦ اﻳﻨﻜﻪ ﭼﻪ ﻗﺴﻤﺘﻬﺎﻳﻲ از ﺳﺮوﻳﺲ در اﺧﺘﻴﺎر ﭘﺮاﻛﺴﻲ ﻫﺎي
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻗﺮار ﺑﮕﻴﺮﻧﺪ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ .اﻟﺒﺘﻪ ﺧﺎﺻﻴﺖ ScriptMethodﺿﺮوري ﻧﻤﻲ ﺑﺎﺷﺪ ،اﻣﺎ ﻣﻲ
ﺗﻮاﻧﻴﺪ از آن ﺑﺮاي دﺳﺘﻜﺎري ﺗﻨﻈﻴﻤﺎت ﺑﺮﺧﻲ از ﻣﺘﺪﻫﺎ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
اﮔﺮ در ﻣﺮورﮔﺮ ﺗﺎن ﻓﺎﻳﻞ ASMXرا ﺑﺎ ﻳﻚ /jsدر اﻧﺘﻬﺎي URLآن ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ ،ﻳﻚ ﻣﺠﻤﻮﻋﻪ ﭘﺮاﻛﺴﻲ
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺮاي اﻳﻦ ﺳﺮوﻳﺲ اﻳﺠﺎد ﺷﺪه را ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺷﻜﻞ 5-12اﻳﻦ ﻣﻮرد را ﻧﺸﺎن ﻣﻲ دﻫﺪ.
ﺑﺎ اﺳﺘﻔﺎده از web serviceآﻣﺎده ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﺻﻔﺤﻪ ﺟﺪﻳﺪ ﺑﺮاي اﻳﻦ راه ﺣﻞ اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﺮاي ﺷﺮوع
ﻳﻚ ﻓﺮم وب ﺑﻪ ﻧﺎم EmployeeLookupClient.aspxﺑﻪ ﺳﺎﻳﺖ اﺿﺎﻓﻪ ﻛﻨﻴﺪ .اﺑﺘﺪا اﺣﺘﻴﺎج ﺑﻪ اﺿﺎﻓﻪ
ﻛﺮدن ﻛﻨﺘﺮل ScriptManagerﺑﻪ ﺻﻔﺤﻪ ﺑﺮاي ﭘﺸﺘﻴﺒﺎﻧﻲ از ajaxﻣﻲ ﺑﺎﺷﺪ .ﺣﺎل ،ﻳﻚ ارﺟﺎع ﺑﻪ ﺳﺮوﻳﺲ
وب ﻣﺤﻠﻲ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﺪ ،ﺑﺮاي اﻳﺠﺎد ﭘﺮوﻛﺴﻲ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺮاي ﺳﺮوﻳﺲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺎﻧﻨﺪ ﻛﺪ زﻳﺮ آن را
ﻓﺮاﺧﻮاﻧﻲ ﻛﻨﻴﺪ:
<option value="Sales">Sales</option>
<option value="Marketing">Marketing</option>
</select>
</div>
<br />
<div>
<span id="employeeResults"></span>
<span id="loading" style="display:none;">
<img src="images/indicator.gif" alt="" />
Loading ...
</span>
</div>
$addHandler(departments, "change",
;)departments_onchange
}
{)function page_unload(sender, e
$removeHandler(departments, "change",
;)departments_onchange
}
{)function departments_onchange(sender, e
;"" = $get("employeeResults").innerHTML
;"$get("loading").style.display = "block
;var selectedValue = departments.value
HRService.GetEmployeeCount(selectedValue,
;)onSuccess
}
{)function onSuccess(result
;"$get("loading").style.display = "none
$get("employeeResults").innerHTML = "Employee count:
;" + result
}
>//--
></script
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﻣﻲ ﺑﻴﻨﻴﺪ ﻣﺘﺪﻫﺎي loadو unloadدر ﻣﺮورﮔﺮ ﺑﺎ ﻣﺪل ﺑﺮﻧﺎﻣﻪ ﺗﻨﻈﻴﻢ ﺷﺪه اﻧﺪ .اﮔﺮ ﺑﻪ ﻛﺘﺎﺑﺨﺎﻧﻪ
ﻫﺴﺘﻪ ﻛﻪ ﻗﺒﻼ ﮔﻔﺘﻪ ﺷﺪ ﻧﮕﺎه ﺑﻴﺎﻧﺪازﻳﺪ ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ ﻓﺮﻳﻢ ورك ﻛﻼﻳﻨﺖ ﻳﻚ ﭼﺮﺧﻪ ﺣﻴﺎت ﺻﻔﺤﻪ ﻣﺎﻧﻨﺪ آﻧﭽﻪ
در Asp.netاﺳﺖ ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .در اﻳﻦ ﺻﻮرت از روﻳﺪاد loadﺑﺮاي ﺛﺒﺖ ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ در ﻟﻴﺴﺖ دﭘﺎرﺗﻤﺎن
ﺻﻮرت ﻣﻲ ﮔﻴﺮد ،اﺳﺘﻔﺎده ﻛﺮد .ﻫﻤﭽﻨﻴﻦ از ﻣﺘﺪ unloadﺑﺮاي ﺣﺬف ﺗﻐﻴﻴﺮاﺗﻲ ﻛﻪ ﺛﺒﺖ ﺷﺪه اﺳﺖ اﺳﺘﻔﺎده ﻣﻲ
ﺷﻮد.
در اﻳﻦ ﻛﺪ ﺑﺮﺧﻲ ﻣﻮارد ﺟﺪﻳﺪ ﻣﻲ ﺑﺎﺷﻨﺪ :دﺳﺘﻮراﺗﻲ ﻛﻪ ﺑﺎ $ﺷﺮوع ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ دﺳﺘﻮرات ﻣﻴﺎﻧﺒﺮ ﻳﺎ ﻧﺎم ﻣﺴﺘﻌﺎر
ﻣﻌﺎدل دﺳﺘﻮر ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺷﺎن ﻣﻲ ﺑﺎﺷﻨﺪ ﻛﻪ در آﺧﺮ ﺑﻪ دﺳﺘﻮر ﻣﻌﺎدل ﺧﻮد ﺗﺮﺟﻤﻪ ﻣﻲ ﺷﻮﻧﺪ .ﺑﺮاي ﻣﺜﺎل $get
ﻣﻌﺎدل دﺳﺘﻮر document.getElementByIdﻣﻲ ﺑﺎﺷﺪ.
زﻣﺎﻧﻴﻜﻪ ﻳﻚ دﭘﺎرﺗﻤﺎن در ﺻﻔﺤﻪ اﻧﺘﺨﺎب ﻣﻲ ﺷﻮد ﻣﺘﺪ زﻳﺮ ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ ﺗﻌﺪاد ﻛﺎرﻣﻨﺪان ﺳﺮوﻳﺲ وب را ﻓﺮاﺧﻮاﻧﻲ
ﻣﻲ ﻛﻨﺪ.
;)HRService.GetEmployeeCount(selectedValue, onSuccess
ﭘﺎراﻣﺘﺮ اول در اﻳﻦ ﻣﺘﺪ دﭘﺎرﺗﻤﺎن اﻧﺘﺨﺎب ﺷﺪه از ﻟﻴﺴﺖ ﻣﻲ ﺑﺎﺷﺪ .ﭘﺎراﻣﺘﺮ دوم ﻧﺎم ﺗﺎﺑﻌﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻫﻨﮕﺎم اﺗﻤﺎم
ﻣﻮﻓﻖ ﻣﺘﺪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺗﺎﺑﻊ onSuccessاﺟﺮا ﺷﻮد واﺳﻂ ﻛﺎرﺑﺮي ﺑﻪ روز )(updateﻣﻲ
ﺷﻮد.
ASP.Net درAjax ﻛﺎر ﺑﺎ 4 ﻓﺼﻞ 100
ﻓﺼﻞ 101 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﻳﻜﻲ از ﻣﺮاﺣﻞ ﻣﻬﻢ ﭼﺮﺧﻪ ﺗﻮﺳﻌﻪ ﻧﺮم اﻓﺰار ،ﺗﺴﺖ ﻧﺮم اﻓﺰار ﻣﻲ ﺑﺎﺷﺪ .ﻫﺮ ﻧﺮم اﻓﺰار ﻧﻮﺷﺘﻪ ﺷﺪه ﺑﺪون ﺧﻄﺎ ﻧﻴﺴﺖ ﺑﻪ
ﻫﻤﻴﻦ ﻋﻠﺖ ﻧﺮم اﻓﺰارﻫﺎي دﻳﺒﺎگ ﺑﻪ اﺑﺰارﻫﺎي ﺑﺎ ارزﺷﻲ ﺗﺒﺪﻳﻞ ﺷﺪﻧﺪ.
ﺑﻪ ﺻﻮرت ﺳﻨﺘﻲ دﻳﺒﺎگ ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﺸﻜﻞ ﻣﻲ ﺑﺎﺷﺪ .ﺗﺎ ﭼﻨﺪي ﭘﻴﺶ ﻣﺮورﮔﺮﻫﺎ ﺑﻪ ﺻﻮرت ﻣﺤﺪودي
از دﻳﺒﺎگ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺣﻤﺎﻳﺖ ﻣﻲ ﻛﺮدﻧﺪ .اوﻟﻴﻦ ﻧﺴﺨﻪ Safariﻛﻨﺴﻮل ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻧﺪاﺷﺖ Opera .ﺑﻌﺪ
از ﻧﺴﺨﻪ 8اﻳﻦ ﻛﻨﺴﻮل را اﺿﺎﻓﻪ ﻛﺮد Firefox .از ﻛﻨﺴﻮل ﺟﺎوااﺳﻜﺮﻳﭙﺖ در ﻧﺴﺨﻪ 1,0ﺧﻮد ﺣﻤﺎﻳﺖ ﻛﺮدIE .
در ﻧﺴﺨﻪ 7,0ﻫﻢ ﻫﻨﻮزﻛﻨﺴﻮﻟﻲ ﺑﺮاي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻧﺪارد ،و ﺗﻨﻬﺎ ﻫﻨﮕﺎم اﻳﺠﺎد ﺧﻄﺎ ﭘﻨﺠﺮه اي ﺑﺮاي اﻋﻼم ﺧﻄﺎ
ﻧﺸﺎن ﻣﻲ دﻫﺪ.
اﻳﻨﺠﺎ ﻳﻜﻲ از اﺑﺰارﻫﺎي ﻣﻔﻴﺪ دﻳﺒﺎگ را ﻣﻌﺮﻓﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.
FireBug
Firefoxداري ﻗﺎﺑﻠﻴﺘﻲ ﺑﻪ ﻧﺎم add-onﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﻣﻲ ﺗﻮان ﻧﺮم اﻓﺰارﻫﺎﻳﻲ اﻳﺠﺎد ﻛﺮد ﻛﻪ از ﺗﻮاﻧﺎﻳﻲ ﻛﺎر ﺑﺎ
Joe Firefoxﺑﺮﺧﻮردار ﻣﻲ ﺑﺎﺷﻨﺪ و اﻳﻦ ﻧﺮم اﻓﺰارﻫﺎ را ﺑﻪ Firefoxاﺿﺎﻓﻪ ﻛﺮد .در ﺳﺎل ،2006
،Hewittﻧﺮم اﻓﺰار Firebugرا ﺑﻪ ﻋﻨﻮان اﺑﺰار ﺟﺪﻳﺪي ﺑﺮاي ﻛﻤﻚ ﺑﻪ ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن در اﻳﺠﺎد و دﻳﺒﺎگ
ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﻣﻌﺮﻓﻲ ﻛﺮد Firebug .ﺑﻪ ﺻﻮرت ﺗﻮﻛﺎر اﺟﺎزه ﺑﺮرﺳﻲ و ﺑﺎزرﺳﻲ DOMﺻﻔﺤﻪ اي ﻛﻪ اﻛﻨﻮن
ﻟﻮد ﺷﺪه اﺳﺖ را ﻣﻲ دﻫﺪ ،اﻃﻼﻋﺎﺗﻲ در ﻣﻮرد ﻗﺎﻟﺐ ﻋﻨﺎﺻﺮ اراﺋﻪ ﻣﻲ ﻛﻨﺪ ،و ﻗﺴﻤﺘﻲ ﻛﻪ ﺑﺮاي ﺗﻮﺳﻌﻪ دﻫﻨﺪﮔﺎن
Ajaxﺟﺎﻟﺐ ﻣﻲ ﺑﺎﺷﺪ ،ﻧﻈﺎرت) (monitoringﺑﺮ ﻫﻤﻪ ارﺳﺎل ﻫﺎ و درﻳﺎﻓﺖ ﻫﺎي ﻛﻪ از ﻃﺮﻳﻖ ﺷﻲ XHR
اﻧﺠﺎم ﻣﻲ ﮔﻴﺮد.
ﻧﺼﺐ و آﻣﺎده ﺳﺎزي
Firebugرا ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺻﻮرت راﻳﮕﺎن از ﺳﺎﻳﺖ www.getfirebug.comداﻧﻠﻮد ﻛﻨﻴﺪFirebug .
ﺑﻪ ﺻﻮرت ﻳﻚ XPIداﻧﻠﻮد ﻣﻲ ﺷﻮد ،ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﻛﻪ ﺧﻮد Firefoxﻣﻲ داﻧﺪ ﻛﻪ ﭼﮕﻮﻧﻪ آن را ﻧﺼﺐ ﻛﻨﺪ .در
ﻣﺮورﮔﺮ Firfoxﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﻟﻴﻨﻚ داﻧﻠﻮد ،ﺑﻪ ﺑﺴﺘﻪ اﺟﺎزه ﻧﺼﺐ ﺑﺪﻫﻴﺪ .روي ﻛﻠﻴﺪ OKﭘﻴﻐﺎم ﻧﺼﺐ
Firebugﻛﻠﻴﻚ ﻛﻨﻴﺪ) .ﺑﻌﺪ از آن ﻧﻴﺎز ﺑﻪ Restartﻣﺮورﮔﺮ دارﻳﺪ(.
Firebugﺑﻪ دو روش ﺑﻪ ﭘﻨﺠﺮه Firefoxاﺿﺎﻓﻪ ﻣﻲ ﺷﻮد:
-1اﺑﺘﺪا ،در ﺳﻤﺖ راﺳﺖ ﻧﻮار وﺿﻌﻴﺖ ،ﭘﺎﻧﻞ ﻛﻮﭼﻜﻲ را اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﺧﻄﺎﻫﺎي ﻣﺮﺑﻮط ﺑﻪ ﺻﻔﺤﻪ را ﻧﻤﺎﻳﺶ
ﻣﻲ دﻫﺪ).داﻳﺮه ﺗﻮﭘﺮ ﺳﺒﺰ در ﺻﻮرﺗﻲ ﻛﻪ ﺑﺪون ﺧﻄﺎ ﺑﺎﺷﺪ ،و ﻋﻼﻣﺖ " "xﻗﺮﻣﺰ رﻧﮓ اﮔﺮ ﺧﻄﺎﺋﻲ داﺷﺘﻪ ﺑﺎﺷﺪ(.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 102ﻓﺼﻞ 5
-2روش دوم ،ﭘﺎﻧﻞ اﺻﻠﻲ ﻛﻪ اﻃﻼﻋﺎﺗﻲ درﺑﺎره ﺻﻔﺤﻪ ﻟﻮد ﺷﺪه ﻓﻌﻠﻲ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ و در ﭘﺎﺋﻴﻦ ﭘﻨﺠﺮه ﻧﻤﺎﻳﺶ
داده ﻣﻲ ﺷﻮد .اﻳﻦ ﭘﺎﻧﻞ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض ﻣﺨﻔﻲ ﻳﺎ آﺷﻜﺎر ﺑﺎﺷﺪ و ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﭘﺎﻧﻞ
وﺿﻌﻴﺖ از ﻳﻚ ﺣﺎﻟﺖ ﺑﻪ ﺣﺎﻟﺖ دﻳﮕﺮ ﺑﺮود.
واﺳﻂ
واﺳﻂ ﻓﺎﻳﺮﺑﺎگ ﺷﺎﻣﻞ ﺷﺶ ﻧﻮار در ﭘﺎﻧﻞ اﺻﻠﻲ ﻣﻲ ﺑﺎﺷﺪ:
-ﻧﻮار اوﻟﻲ Consoleﻧﺎم دارد ،و ﺷﺎﻣﻞ ﺧﻂ ﻓﺮﻣﺎن ﭘﺎﻳﻪ ﺑﺮاي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﻧﻮار ﭘﻴﻐﺎم
ﻫﺎي ﺧﻄﺎ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ ،ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮان ﺑﺎ ﻧﻮﺷﺘﻦ دﺳﺘﻮرات ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺑﺎ ﺻﻔﺤﻪ ﺗﻌﺎﻣﻞ داﺷﺖ.
-ﻧﻮار دوﻣﻲ HTMLﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد ،و ﺷﺎﻣﻞ ﺑﺎزرس DOMﭘﺎﻳﻪ ﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﻧﻮار ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﮔﺮه ﻫﺎي
Style،DOMو Layoutرا ﺑﻪ ﺻﻮرت ﺳﻠﺴﻠﻪ ﻣﺮاﺗﺒﻲ ﺑﺒﻴﻨﻴﺪ.
-ﻧﻮار ﺳﻮم CSSﻣﻲ ﺑﺎﺷﺪ ،و ﺑﻌﻨﻮان ﺑﺎزرس ،CSSاﺟﺎزه ﻣﺸﺎﻫﺪه ﻫﻤﻪ ي ﺷﻴﻮه ﻧﺎﻣﻪ ﻫﺎ ) (CSSو وﻳﺮاﻳﺶ
ﻗﺎﻟﺐ ﻫﺎ) (Styleرا ﺑﻪ ﺷﻤﺎ ﻣﻲ دﻫﺪ.
-ﻧﻮار ﭼﻬﺎرم Scriptﻣﻲ ﺑﺎﺷﺪ ،و ﺷﺎﻣﻞ دﻳﺒﺎﮔﺮ ﻛﺪﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻲ ﺗﻮاﻧﻴﺪ در ﻓﺎﻳﻞ
ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻧﻘﺎط ﺗﻮﻗﻒ اﺟﺮا ) (breakpointاﻳﺠﺎد ﻛﻨﻴﺪ.
-ﻧﻮار ﭘﻨﺠﻢ DOMﻧﺎﻣﻴﺪه ﻣﻲ ﺷﻮد ،ﻛﻪ ﺗﻤﺎﻣﻲ اﺷﻴﺎ ﻣﻮﺟﻮد در ﺻﻔﺤﻪ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
-ﻧﻮار ﺷﺸﻢ Netﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺷﺎﻣﻞ ﻧﺸﺎﻧﻬﺎي ﮔﺮاﻓﻴﻜﻲ ﺑﺮاي ﺗﻤﺎﻣﻲ ﻣﻨﺎﺑﻌﻲ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺗﻮﺳﻂ ﺻﻔﺤﻪ ﻟﻮد
ﺷﺪه اﻧﺪ .زﻣﺎن ﻻزم ﺑﺮاي ﻟﻮد اﻳﻦ ﻣﻨﺎﺑﻊ را ﻧﻴﺰ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
در اداﻣﻪ ﻫﻤﻪ ﻧﻮارﻫﺎي ﻣﻮﺟﻮد در ﻓﺎﻳﺮﺑﺎگ ﻣﻔﺼﻼ ﺷﺮح داده ﺧﻮاﻫﻨﺪ ﺷﺪ.
واﻗﻌﻪ ﻧﮕﺎري )XHR (Logging
اﻏﻠﺐ اوﻗﺎت ﺷﻲ XHRﺑﺮاي اﻳﺠﺎد درﺧﻮاﺳﺖ HTTPاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد ،اﻳﻦ اﻃﻼﻋﺎت در ﻧﻮار ﻛﻨﺴﻮل ﺑﻪ ﺻﻮرت
ﻳﻚ آﻳﺘﻢ ﻳﻚ ﺧﻄﻲ ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ .اﻳﻦ ﺧﻂ ﺷﺎﻣﻞ ﻣﺘﺪ درﺧﻮاﺳﺖ )ﻋﻤﻮﻣﺎً GETو ﻳﺎ (POSTو ﻫﻤﭽﻨﻴﻦ ﺑﻪ
دﻧﺒﺎل آن URLاﺳﺘﻔﺎده ﺷﺪه ﺑﺮاي درﺧﻮاﺳﺖ ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺧﻂ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي URLﺑﺴﻂ داده ﺷﺪه
و ﻧﻮارﻫﺎي ﺑﻴﺸﺘﺮي را ﻧﻤﺎﻳﺶ دﻫﺪ.
اﮔﺮ درﺧﻮاﺳﺖ GETارﺳﺎل ﺷﺪه ﺑﺎﺷﺪ ،ﺳﻪ ﻧﻮار ﻣﻮﺟﻮد ﺧﻮاﻫﺪ ﺑﻮد Headers،Params :و. Respons
-ﻧﻮار Paramsﭘﺎراﻣﺘﺮﻫﺎي رﺷﺘﻪ ارﺳﺎﻟﻲ درﺧﻮاﺳﺖ ﻛﻪ ﺑﻪ ﺻﻮرت ﻧﺎم-ﻣﻘﺪار ﻣﻲ ﺑﺎﺷﺪ را در ﺑﺮدارد.
-ﻧﻮار Headerﺷﺎﻣﻞ ﻫﺪرﻫﺎي ﭘﺎﺳﺦ HTTPﻛﻪ ﻫﻤﺮاه ﺑﺎ داده ﻫﺎي درﺧﻮاﺳﺖ ارﺳﺎل ﻣﻲ ﺷﻮﻧﺪ ،ﻣﻲ ﺑﺎﺷﺪ.
اﻳﻦ ﻧﻮار ﺷﺎﻣﻞ اﻃﻼﻋﺎت ﻣﻔﻴﺪي ﻣﺎﻧﻨﺪ ﻛﻮﻛﻲ ﻫﺎ ،ﻧﻮع ﻣﺤﺘﻮا ،و زﻣﺎن ارﺳﺎل ﭘﺎﺳﺦ ﻣﻲ ﺑﺎﺷﺪ.
-ﻧﻮار Responseﺷﺎﻣﻞ اﻃﻼﻋﺎت ارﺳﺎﻟﻲ از ﺳﻤﺖ ﺳﺮور ﺑﻪ ﻛﻼﻳﻨﺖ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻤﻜﻦ اﺳﺖ ﻛﻪ اﻳﻦ
اﻃﻼﻋﺎت ﻓﺮﻣﺖ ﻣﻨﺎﺳﺒﻲ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﻨﺪ و ﻣﺠﺒﻮر ﺑﺎﺷﻴﺪ ﺑﺮاي ﻣﻄﺎﻟﻌﻪ ،آن ﻫﺎ را در ﻳﻚ واﻳﺸﮕﺮ ﻛﭙﻲ ﻛﻨﻴﺪ.
ﻓﺼﻞ 103 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
در ﺻﻮرﺗﻲ ﻛﻪ ﻧﻮع درﺧﻮاﺳﺖ POSTﺑﺎﺷﺪ ،ﺗﻌﺪار ﻧﻮارﻫﺎ ﭼﻬﺎر ﺗﺎ ﺧﻮاﻫﺪ ﺑﻮد .ﻋﻼوه ﺑﺮ ﻣﻮارد ﻓﻮق ﻧﻮار Post
ﻧﻴﺰ داده ارﺳﺎﻟﻲ ﺑﻪ ﺳﺮور را ﻧﻤﺎﻳﺶ ﺧﻮاﻫﺪ داد .داده ﻫﺎ ﺑﺮاي درﺧﻮاﺳﺖ POSTﺑﻪ ﻋﻨﻮان ﺑﺪﻧﻪ درﺧﻮاﺳﺖ ارﺳﺎل
ﻣﻲ ﺷﻮﻧﺪ.
ﺧﻄﺎﻳﺎﺑﻲ
زﻣﺎﻧﻲ ﻛﻪ در ﺑﺮﻧﺎﻣﻪ ﺧﻄﺎ وﺟﻮد داﺷﺘﻪ ﺑﺎﺷﺪ ،ﻓﺎﻳﺮﺑﺎگ ﻓﻮرا ﺑﻪ ﺷﻤﺎ ﺧﺒﺮ داده و اﻃﻼﻋﺎت ﺟﺎﻣﻊ و ﻣﻔﻴﺪي درﺑﺎره
ﺧﻄﺎﻫﺎي ﻣﻮﺟﻮد در ﺟﺎوااﺳﻜﺮﻳﭙﺖ CSS ،و XMLرا ﺑﻪ ﺷﻤﺎ ﻣﻲ دﻫﺪ.
ﺗﻔﻜﻴﻚ ﺧﻄﺎ
اﻏﻠﺐ ﻣﺮورﮔﺮﻫﺎ ﺧﻄﺎﻫﺎ را در ﻳﻚ ﭘﻨﺠﺮه ﺑﻪ ﺻﻮرت ﻳﻚ ﻟﻴﺴﺘﻲ ﺷﺎﻣﻞ ﺧﻄﺎﻫﺎي ﺗﻤﺎم ﺻﻔﺤﺎﺗﻲ ﻛﻪ ﺗﺎ ﺑﻪ ﺣﺎل دﻳﺪه
اﻳﺪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻨﺪ .ﻓﺎﻳﺮﺑﺎگ ﺑﻪ ﮔﻮﻧﻪ دﻳﮕﺮي اﻳﻦ ﻛﺎر را اﻧﺠﺎم ﻣﻲ دﻫﺪ ،ﻓﺎﻳﺮﺑﺎگ ﺗﻨﻬﺎ ﺧﻄﺎﻫﺎي ﻣﻮﺟﻮد در
ﺻﻔﺤﻪ اي را ﻛﻪ اﻛﻨﻮن در ﺣﺎل ﺗﻤﺎﺷﺎ ﻫﺴﺘﻴﺪ را ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
اﻃﻼﻋﺎت ﻳﻚ ﺧﻄﺎ
در ﻣﻮرد ﺧﻄﺎﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﻃﻼﻋﺎت ﻛﺎﻣﻠﻲ درﺑﺎره ﺧﻄﺎي ﭘﻴﺶ آﻣﺪه را ﻧﺸﺎن ﻣﻲ دﻫﺪ .در ﻣﻮرد ﺧﻄﺎ
ﺗﻮﺿﻴﺢ داده و ﻓﺎﻳﻞ و ﺷﻤﺎره ﺧﻄﻲ ﻛﻪ ﺧﻄﺎ در آن اﻳﺠﺎد ﺷﺪه را ﻧﻴﺰ اﻋﻼم ﻣﻲ ﻛﻨﺪ .اﻏﻠﺐ ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي ﭘﻴﻜﺎن
ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﻮﺿﻴﺤﺎت را ﺑﺴﻂ داده و اﻃﻼﻋﺎت ﻛﺎﻣﻞ ﭘﺸﺘﻪ ي زﻣﺎن اﺟﺮا ،ﺷﺎﻣﻞ ﻣﻘﺎدﻳﺮ آرﮔﻮﻣﺎن ﻫﺎي ﭘﺸﺘﻪ را ﺑﺒﻴﻨﻴﺪ.
ﺟﺴﺘﺠﻮي ﺳﺮﻳﻊ
ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ ﺟﺴﺘﺠﻮي ﺳﺮﻳﻊ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﻨﺴﻮل ﻓﺎﻳﺮﺑﺎگ را ﺑﺮاي ﻧﻤﺎﻳﺶ ﺧﻄﺎﻫﺎﻳﻲ ﻛﻪ ﺑﺎ ﻣﺘﻨﻲ ﻛﻪ ﺷﻤﺎ
ﺟﺴﺘﺠﻮ ﻣﻲ ﻛﻨﻴﺪ ﻳﻜﺴﺎﻧﻨﺪ ﻓﻴﻠﺘﺮ ﻛﻨﻴﺪ .ﺳﻄﺮﻫﺎي ﺟﺪﻳﺪي ﻛﻪ ﺑﻪ ﻛﻨﺴﻮل اﺿﺎﻓﻪ ﻣﻲ ﺷﻮﻧﺪ ،ﺗﻨﻬﺎ زﻣﺎﻧﻲ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮﻧﺪ
ﻛﻪ ﺑﺎ ﻣﺘﻦ ﻣﻮﺟﻮد در ﺟﻌﺒﻪ ﺟﺴﺘﺠﻮي ﺳﺮﻳﻊ ﻣﻄﺎﺑﻘﺖ داﺷﺘﻪ ﺑﺎﺷﻨﺪ.
ﻓﻴﻠﺘﺮﻳﻨﮓ ﺧﻄﺎﻫﺎ
ﻓﺎﻳﺮﺑﺎگ ﺗﻮاﻧﺎﻳﻲ ﮔﺰارش دﻫﻲ درﺑﺎره ي ﺧﻄﺎﻫﺎي ﻣﻮﺟﻮد در ﻓﺎﻳﻞ ﻫﺎي ﺟﺎوااﺳﻜﺮﻳﭙﺖ ،CSS ،ﻳﺎ XMLرا دارد.
اﮔﺮ ﺑﻪ ﺧﻄﺎﻫﺎي ﻳﻜﻲ از اﻳﻦ زﺑﺎن ﻫﺎ ﻋﻼﻗﻤﻨﺪ ﻧﺒﺎﺷﻴﺪ ،ﺑﺎ اﻧﺘﺨﺎب ﻧﻜﺮدن ﻫﺮ ﻛﺪام ﻛﻪ ﻧﻤﻲ ﺧﻮاﻫﻴﺪ ﺑﺒﻴﻨﻴﺪ در ﻣﻨﻮي
Optionsﻛﻨﺴﻮل ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ اﻳﻦ ﻧﺘﻴﺠﻪ ﺑﺮﺳﻴﺪ.
اﺣﺘﻤﺎﻻ ﺑﺎ اﻳﻦ ﻣﺴﺎﻟﻪ ﺑﺮﺧﻮرد ﻛﺮده اﻳﺪ ﻛﻪ ﺑﺮرﺳﻲ ﻛﺪﻫﺎي DOMو ﻣﺸﺎﻫﺪه ﻧﺘﻴﺠﻪ آن ﺧﻴﻠﻲ آﺳﺎن ﻧﻴﺴﺖ اﻣﺎ ﺑﺎ ﺧﻂ
ﻓﺮﻣﺎن ﺑﺮاﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ دﺳﺘﻮر ﺧﻮد را ﻧﻮﺷﺘﻪ و ﻧﺘﻴﺠﻪ اﺟﺮاي آن را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ.
وﻳﺮاﻳﺸﮕﺮ راﺣﺖ
اﮔﺮ ﻫﻨﮕﺎم ﻧﻮﺷﺘﻦ ﺧﻄﻲ اﺣﺴﺎس ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺤﺪوده ﻛﺎرﺗﺎن ﻛﻮﭼﻚ ﻣﻲ ﺑﺎﺷﺪ ،ﻧﮕﺮان ﻧﺒﺎﺷﻴﺪ .ﺧﻂ ﻓﺮﻣﺎن
ﻓﺎﻳﺮﺑﺎگ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﻳﻚ وﻳﺮاﻳﺸﮕﺮ ﺑﺰرگ ﺗﺒﺪﻳﻞ ﺷﻮد ﭘﺲ از آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﺪﺗﺎن را در ﻳﻚ ﺧﻂ وارد ﻛﻨﻴﺪ.
ﻫﻮﺷﻤﻨﺪي ﺧﻂ ﻓﺮﻣﺎن
ﻳﻚ دﺳﺘﻪ ﻛﺪ ﺟﺎوااﺳﻜﺮﻳﭙﺖ را ﻧﻮﺷﺘﻪ و ﻣﻲ ﺧﻮاﻫﻴﺪ ﺻﺤﺖ آﻧﻬﺎ را ﺗﺴﺖ ﻛﻨﻴﺪ .ﺗﻨﻬﺎ ﻛﺎري ﻛﻪ ﺑﺎﻳﺪ اﻧﺠﺎم دﻫﻴﺪ
ﻛﭙﻲ آﻧﻬﺎ ﺑﻪ ﺧﻂ ﻓﺮﻣﺎن ﻣﻲ ﺑﺎﺷﺪ .اﮔﺮ ﺑﻴﺶ از ﻳﻚ ﺧﻂ ﺑﺎﺷﺪ ،ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﺗﻮﺳﻂ ﻓﺎﻳﺮﺑﺎگ ﻳﻚ وﻳﺮاﻳﺸﮕﺮ
ﺑﺰرگ ﺑﺮاي اﺳﻜﺮﻳﭙﺖ ﺷﻤﺎ آﻣﺎده ﺧﻮاﻫﺪ ﺷﺪ.
ﻓﺼﻞ 107 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﺗﺎﺑﻊ)(console.log
روش آﺳﺎن ﺑﺮاي ﻧﻮﺷﺘﻦ در ﻛﻨﺴﻮل ﻓﺎﻳﺮﺑﺎگ ﻣﺎﻧﻨﺪ اﻳﻦ ﻣﻲ ﺑﺎﺷﺪ:
)"console.log("hello world
ﻣﻲ ﺗﻮاﻧﻴﺪ آرﮔﻮﻣﺎﻧﻬﺎي زﻳﺎدي را ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﺪ ﺑﺎ ﻫﻢ ﻛﺎري اﻧﺠﺎم دﻫﻨﺪ را وارد ﻛﻨﻴﺪ ،ﻣﺎﻧﻨﺪ:
console.log(2,4,6,8,"foo",bar).
ﻫﺎﻳﭙﺮﻟﻴﻨﻚ اﺷﻴﺎ
console.logو ﺗﻮاﺑﻊ ﻣﺮﺑﻮط ﺑﻪ آن ﻣﻲ ﺗﻮاﻧﻨﺪ ﻛﺎري ﺑﻴﺶ از ﻧﻮﺷﺘﻦ ﻣﺘﻦ در ﻛﻨﺴﻮل اﻧﺠﺎم دﻫﻨﺪ .ﻣﻲ ﺗﻮاﻧﻴﺪ
ﻫﺮ ﻧﻮع ﺷﻲ را ﺑﻪ console.logارﺳﺎل ﻛﻨﻴﺪ و آن را ﺑﻪ ﺻﻮرت ﻫﺎﻳﭙﺮﻟﻴﻨﻚ ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ .ﻋﻨﺎﺻﺮ ،ﺗﻮاﺑﻊ و
آراﻳﻪ ﻫﺎ ﻣﺎﻧﻨﺪ ﺷﻲ ﺧﻮاﻫﻨﺪ ﺑﻮد ،و ﺷﻤﺎ ﺑﺎﻳﺪ ﻧﺎم آن ﻫﺎ را وارد ﻛﻨﻴﺪ .ﺑﺎ ﻛﻠﻴﻚ ﺑﺮ روي اﻳﻦ ﻟﻴﻨﻚ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ
روي ﻧﻮاري ﻛﻪ ﺑﻪ آن ﻫﺎ اﺧﺘﺼﺎص دارﻧﺪ ﺑﻪ ﺑﺮرﺳﻲ ﻣﻘﺎدﻳﺮ آن ﻫﺎ ﺑﭙﺮدازﻳﺪ.
رﺷﺘﻪ ﻓﺮﻣﺖ
ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ ﺳﺒﻚ دﺳﺘﻮر printfزﺑﺎن cدﺳﺘﻮر console.logرا ﻧﻴﺰ ﻓﺮﻣﺖ ﺑﻨﺪي ﻛﻨﻴﺪ .ﺑﺮاي ﻣﺜﺎل ،ﻣﻲ
ﺗﻮاﻧﻴﺪ ﺑﻪ ﺻﻮرت ) console.log("%s is %d years old.", "Bob", 42ﺑﻨﻮﻳﺴﻴﺪ.
ﻓﺼﻞ 109 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﺑﺮرﺳﻲ ﭘﺸﺘﻪ
ﻓﺎﻳﺮﺑﺎگ ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ )( console.traceاﻃﻼﻋﺎت ﻛﺎﻣﻠﻲ درﺑﺎره stack traceدر ﻛﻨﺴﻮل ﺧﻮاﻫﺪ
داد .ﻧﻪ ﺗﻨﻬﺎ در ﻣﻮرد ﺗﻮاﺑﻊ ﻣﻮﺟﻮد در ﭘﺸﺘﻪ ﮔﺰارش ﺧﻮاﻫﺪ داد ،ﺑﻠﻜﻪ در ﻣﻮرد آرﮔﻮﻣﺎن ﻫﺎي ﻛﻪ ﺑﻪ ﺗﻮاﺑﻊ ﭘﺎس داده
ﺷﺪه اﻧﺪ ﻧﻴﺰ اﻃﻼﻋﺎﺗﻲ ﺧﻮاﻫﺪ داد .ﺑﺮاي ﺑﺮرﺳﻲ ﺗﻮاﺑﻊ و ﻳﺎ اﺷﻴﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮ روي آن ﻫﺎ ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
ﺑﺮرﺳﻲ ﺷﻲ
ﭼﻨﺪﻳﻦ ﺑﺎر ﺗﺎﺑﺤﺎل ﺑﺮاي ﻳﻚ ﻋﻨﺼﺮ ﻣﺠﺒﻮر ﺑﻪ ﻧﻮﺷﺘﻦ ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎﻳﺶ ﺷﺪه اﻳﺪ؟ ﺑﺎ ﻓﺎﻳﺮﺑﺎگ ﻧﻴﺎزي ﺑﻪ ﻧﻮﺷﺘﻦ
ﺗﻤﺎم ﺧﺎﺻﻴﺖ ﻫﺎ ﻧﻴﺴﺖ .ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ) console.dir(objectﻟﻴﺴﺘﻲ از ﺧﺎﺻﻴﺖ ﻫﺎي ﻳﻚ ﺷﻲ را
ﺧﻮاﻫﻴﺪ داﺷﺖ.
ﻓﺼﻞ 111 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﺗﻮﺳﻌﻪ HTML
ﻓﺎﻳﺮﺑﺎگ ﻳﺎﻓﺘﻦ ﻋﻨﺎﺻﺮ HTMLﻛﻪ داﺧﻞ ﺻﻔﺤﺎت ﭘﻨﻬﺎن ﺷﺪه اﻧﺪ را آﺳﺎن ﻛﺮده اﺳﺖ .زﻣﺎﻧﻴﻜﻪ ﻋﻨﺼﺮي را ﻛﻪ ﺑﻪ
دﻧﺒﺎل آن ﻣﻲ ﮔﺮدﻳﺪ ﭘﻴﺪا ﻛﻨﻴﺪ ،ﻓﺎﻳﺮﺑﺎگ اﻃﻼﻋﺎت ﻛﺎﻓﻲ از آن را در اﺧﺘﻴﺎرﺗﺎن ﻗﺮار ﺧﻮاﻫﺪ داد ،و ﺑﻪ ﺷﻤﺎ اﺟﺎزه
ﻣﻲ دﻫﺪ ﻛﻪ HTMLرا وﻳﺮاﻳﺶ ﻛﻨﻴﺪ.
ﻧﻤﺎﻳﺶ ﻛﺪ ﺻﻔﺤﻪ
Firefoxداري ﭘﻨﺠﺮه " "View Sourceﻣﻲ ﺑﺎﺷﺪ ﻛﻪ در آن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﺪ ﺻﻔﺤﻪ را ﺑﺒﻴﻨﻴﺪ ،اﻣﺎ ﻧﺤﻮه
ﺗﻐﻴﻴﺮ ﻛﺪ ﺗﻮﺳﻂ ﺟﺎوااﺳﻜﺮﻳﭙﺖ آن را ﺑﻪ ﺷﻤﺎ ﻧﺸﺎن ﻧﺨﻮاﻫﺪ داد .ﻧﻮار HTMLﻣﻮﺟﻮد در ﻓﺎﻳﺮﺑﺎگ ﭼﻴﺰي را ﻛﻪ
اﻛﻨﻮن در ﺻﻔﺤﻪ وﺑﺘﺎن ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ را ﺑﻪ ﺷﻤﺎ ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﻌﻼوه ،ﻧﻮارﻫﺎي ﺳﻤﺖ راﺳﺖ اﺟﺎزه ﻣﺸﺎﻫﺪه
ﺧﺎﺻﻴﺘﻬﺎي اﺧﺘﺼﺎﺻﻲ ﻋﻨﺼﺮ ،ﺷﺎﻣﻞ ﻗﻮاﻧﻴﻦ CSSﻛﻪ ﺳﺒﻚ ﻋﻨﺼﺮ را ﻧﺸﺎن ﻣﻲ دﻫﺪ ،ﭘﻴﻜﺴﻞ ﻫﺎ ﻛﻪ ﻣﻮﻗﻌﻴﺖ و ﺳﺎﻳﺰ
ﻋﻨﺎﺻﺮ را ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ ،و ﺧﺎﺻﻴﺖ ﻫﺎي DOMﻛﻪ ﺗﻮﺳﻂ ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﻪ آﻧﻬﺎ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﺪ
را ﻣﻲ دﻫﺪ.
وﻳﺮاﻳﺶ ﻛﺪ Html
ﻓﺎﻳﺮﺑﺎگ روش ﺟﺎﻟﺒﻲ را ﺑﺮاي اﻳﺠﺎد ﺗﻐﻴﻴﺮات آزﻣﺎﻳﺸﻲ در HTMLو دﻳﺪن ﻓﻮري ﺗﺎﺛﻴﺮ آن ﻫﺎ در اﺧﺘﻴﺎرﺗﺎن ﻗﺮار ﻣﻲ
دﻫﺪ .ﺗﻨﻬﺎ ﺑﺎ ﻛﻠﻴﻚ آن ﻫﺎ و رﻓﺘﻦ از ﻳﻚ ﺻﻔﺖ ﺑﻪ دﻳﮕﺮي ﺑﺎ اﺳﺘﻔﺎده از tabﻣﻲ ﺗﻮاﻧﻴﺪ ﺻﻔﺎت و ﻣﺘﻦ HTMLرا
اﻳﺠﺎد ،ﺣﺬف و ﻳﺎ وﻳﺮاﻳﺶ ﻛﻨﻴﺪ .ﺗﻐﻴﻴﺮات ﺑﻪ ﻫﻤﺎن ﺻﻮرﺗﻲ ﻛﻪ ﺷﻤﺎ ﻧﻮﺷﺘﻪ اﻳﺪ اﻋﻤﺎل ﺧﻮاﻫﻨﺪ ﺷﺪ .اﮔﺮ ﻫﺪﻓﺘﺎن
اﻧﺠﺎم ﺗﻐﻴﻴﺮاﺗﻲ ﺑﻴﺶ از ﻳﻚ ﺗﻐﻴﻴﺮ ﻛﻮﭼﻚ ﻣﻲ ﺑﺎﺷﺪ ،ﻓﺎﻳﺮﺑﺎگ اﺟﺎزه وﻳﺮاﻳﺶ ﺗﻤﺎم ﻛﺪ HTMLﺑﺮاي ﻫﺮ ﻋﻨﺼﺮي را
ﻣﻲ دﻫﺪ .ﺗﻨﻬﺎ ﻛﺎﻓﻲ اﺳﺖ ﻛﻪ ﺑﺮ روي ﻋﻨﺼﺮ ﻣﻮرد ﻧﻈﺮ ﻛﻠﻴﻚ -راﺳﺖ ﻛﺮده و از ﻣﻨﻮ " "Edit HTML...را
اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
ﺟﺴﺘﺠﻮ در ﻛﺪ
اﻏﻠﺐ اوﻗﺎت ﻣﻲ داﻧﻴﺪ ﻛﻪ دﻧﺒﺎل ﭼﻪ ﭼﻴﺰي ﻣﻲ ﮔﺮدﻳﺪ ،اﻣﺎ ﻧﻤﻲ ﺗﻮاﻧﻴﺪ آن را در ﺻﻔﺤﻪ ﺑﺒﻴﻨﻴﺪ .ﺑﺎ اﺳﺘﻔﺎده از ﺟﻌﺒﻪ
ﺟﺴﺘﺠﻮي ﺳﺮﻳﻊ در toolbarﻣﻮﺟﻮد در ﻓﺎﻳﺮﺑﺎگ ﻣﻲ ﺗﻮاﻧﻴﺪ در ﻛﺪ HTMLﺟﺴﺘﺠﻮ ﻛﺮده و ﻧﺘﻴﺠﻪ را ﺑﻪ
ﺻﻮرت ﭘﺮرﻧﮓ ﺑﺒﻴﻨﻴﺪ.
ﻓﺼﻞ 113 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﻛﭙﻲ ﻛﺪ Html
ﺑﺎ ﻛﻠﻴﻚ راﺳﺖ ﺑﺮ روي ﻫﺮ ﻋﻨﺼﺮ ،ﭼﻨﺪﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاي ﻛﭙﻲ ﻋﻨﺼﺮ از ﺟﻨﺒﻪ ﻫﺎي ﻣﺨﺘﻠﻔﻲ ﺧﻮاﻫﻴﺪ داﺷﺖ ،ﻣﺎﻧﻨﺪ
ﻳﻚ ﻛﺪ ،HTMLﻣﻘﺪار ﻣﻮﺟﻮد در ﺧﺎﺻﻴﺖ innerHTMLآن ،و ﻳﺎ ﺑﻪ ﺻﻮرت ﻋﺒﺎرت .Xpath
ﺗﻮﺳﻌﻪ CSS
ﻗﺴﻤﺖ Firebug CSSﻫﺮ ﭼﻴﺰي ﻛﻪ در ﻣﻮرد ﻗﺎﻟﺐ وب ﺳﺎﻳﺘﺘﺎن را ﺑﺨﻮاﻫﻴﺪ ﺑﻪ ﺷﻤﺎ ﻣﻲ ﮔﻮﻳﺪ ،و اﮔﺮ ﭼﻴﺰي را
دوﺳﺖ ﻧﺪاﺷﺘﻪ ﺑﺎﺷﻴﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ آن را ﺗﻐﻴﻴﺮ داده و ﻧﺘﻴﺠﻪ ﻛﺎر را ﻓﻮراٌ ﺑﺒﻴﻨﻴﺪ.
ﺧﻂ ﻛﺶ راﻫﻨﻤﺎ
ﻣﻮﺳﺘﺎن را در ﻧﻮار Layoutاﻃﺮاف ﺟﻌﺒﻪ ﻫﺎ ﺣﺮﻛﺖ دﻫﻴﺪ ،ﺑﺎ اﻧﺠﺎم اﻳﻦ ﻛﺎر ،ﺧﻂ ﻛﺶ ﻫﺎ و راﻫﻨﻤﺎﻳﻲ ﻫﺎ در
ﺻﻔﺤﻪ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮﻧﺪ .ﺑﺎ اﻳﻦ ﻛﺎر ﻣﻮﻗﻌﻴﺖ ﻋﻨﺎﺻﺮ را ﺧﻮاﻫﻴﺪ دﻳﺪ.
ﻓﺼﻞ 117 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
اﺟﺮا ،ﻓﻘﻂ ﺑﺮ روي ﺷﻤﺎره ﺧﻂ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻳﻚ ﻧﻘﻄﻪ ﻗﺮﻣﺰ ﺑﺮاي ﻧﻤﺎﻳﺶ اﻳﻨﻜﻪ ﻧﻘﻄﻪ ﺗﻮﻗﻒ ﺗﻨﻈﻴﻢ ﺷﺪه ﻇﺎﻫﺮ ﻣﻲ
ﺷﻮد .ﺑﺮاي ﺣﺬف ﻧﻘﻄﻪ ﺗﻮﻗﻒ دوﺑﺎره ﺑﺮ روي ﻧﻘﻄﻪ ﻗﺮﻣﺰ ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
ﭘﻨﺠﺮه Watch
در ﻃﻮل دﻳﺒﺎگ ،ﻣﻲ ﺧﻮاﻫﻴﺪ ﻣﻘﺪار ﻋﺒﺎرات ﭘﻴﭽﻴﺪه و ﻳﺎ اﺷﻴﺎﺋﻲ ﻛﻪ داﺧﻞ DOMﻣﻲ ﺑﺎﺷﻨﺪ را ﺑﺒﻴﻨﻴﺪ .ﻓﺎﻳﺮﺑﺎگ ﺑﻪ
ﺷﻤﺎ اﺟﺎزه ﻣﻲ دﻫﺪ ﻛﻪ ﻋﺒﺎرات ﺟﺎوااﺳﻜﺮﻳﭙﺘﻲ را ﻛﻪ ﻫﻨﮕﺎم دﻳﺒﺎگ ﻣﻘﺎدﻳﺮﺷﺎن ﺑﺮوز ﻣﻲ ﺷﻮد را ﺑﻨﻮﻳﺴﻴﺪ .ﻫﻨﮕﺎم
ﻧﻮﺷﺘﻦ اﻳﻦ ﻋﺒﺎرات ،ﻓﺮاﻣﻮش ﻧﻜﻨﻴﺪ ﻛﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ از ﻛﻠﻴﺪ tabﺑﺮاي اﻧﺘﺨﺎب ﺧﺎﺻﻴﺖ ﺷﻲ اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
Tooltipﻣﺘﻐﻴﺮﻫﺎ
زﻣﺎﻧﻲ ﻛﻪ دﻳﺒﺎﮔﺮ ﻣﺘﻮﻗﻒ ﻣﻲ ﺑﺎﺷﺪ ،ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﻮس را ﺑﺮ روي ﻫﺮ ﻳﻚ از ﻣﺘﻐﻴﺮﻫﺎ ﺗﺎﺑﻊ در ﺣﺎل اﺟﺮا ﺑﺮده ﺗﺎ ﻣﻘﺪار
آن ﻫﺎ را ﺑﻪ ﺻﻮرت tooltipﺑﺒﻴﻨﻴﺪ.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 120ﻓﺼﻞ 5
ﺣﺎﻓﻈﻪ ﻛﺶ ) (cacheﺳﺎﻳﺖ
ﻫﻤﻪ درﺧﻮاﺳﺖ ﻫﺎي ﺷﺒﻜﻪ اي ﻳﻜﺴﺎن ﻧﻤﻲ ﺑﺎﺷﻨﺪ -ﺑﺮﺧﻲ از آﻧﻬﺎ ﺑﻪ ﺟﺎي ﺷﺒﻜﻪ از ﻗﺴﻤﺖ ﻛﺶ ﻣﺮورﮔﺮ ﻟﻮد ﻣﻲ
ﺷﻮﻧﺪ .ﻓﺎﻳﺮﺑﺎگ درﺧﻮاﺳﺘﻬﺎي را ﻛﻪ از ﻛﺶ ﻟﻮد ﻣﻲ ﺷﻮﻧﺪ را ﺧﺎﻛﺴﺘﺮي روﺷﻦ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ ﺑﻨﺎﺑﺮاﻳﻦ ﺑﻪ راﺣﺘﻲ
ﻣﻲ ﺗﻮاﻧﻴﺪ ﺗﺎﺛﻴﺮ ﻛﺶ را ﺑﺮ روي ﺳﺎﻳﺘﺘﺎن ﺑﺒﻴﻨﻴﺪ.
ﻧﻈﺎرت ﺑﺮ ﺷﻲ XMLHttpRequest
ﭘﺪﻳﺪه Ajaxﺣﻮل ﻣﺤﻮر ﺷﻲ ﻛﻮﭼﻜﻲ ﺑﻪ ﻧﺎم XMLHttpRequestﻣﻲ ﭼﺮﺧﺪ .ﺟﺎﻟﺐ ﻧﺨﻮاﻫﺪ ﺑﻮد اﮔﺮ اﻳﻦ
درﺧﻮاﺳﺖ را ارﺳﺎل ﻛﺮده و ﻫﻴﭻ ﺑﺎزﺧﻮرد ﺑﺼﺮي از آن درﻳﺎﻓﺖ ﻧﺸﻮد .ﻓﺎﻳﺮﺑﺎگ ﻫﻤﻪ XMLHttpRequestرا
در ﻧﻮارﻫﺎي Consoleو Netﺑﻪ ﻫﻤﺮاه ﻧﻮﺷﺘﻪ اي ﻛﻪ ارﺳﺎل ﺷﺪه و ﻧﻮﺷﺘﻪ اي ﻛﻪ درﻳﺎﻓﺖ ﺷﺪه ﺑﻪ ﺷﻤﺎ ﻧﺸﺎن ﻣﻲ
دﻫﺪ.
ﻓﺼﻞ 123 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
دﻳﺒﺎگ ﻫﻨﺮ ﺗﺸﺨﻴﺺ و ﺑﺮﻃﺮف ﺳﺎزي ﻣﺸﻜﻼت ﻛﺪ ﺑﺮﻧﺎﻣﻪ ﺗﺎن ﻣﻲ ﺑﺎﺷﺪ .ﻫﻤﻪ ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﺎن ﺑﻌﻀﻲ اوﻗﺎت در ﺣﻴﻦ
ﺗﻮﺳﻌﻪ ﺑﺮﻧﺎﻣﻪ اﺣﺘﻴﺎج ﺑﻪ ﻳﻚ درﺟﻪ از دﻳﺒﺎگ ﺑﺮﻧﺎﻣﻪ ﻫﺎﻳﺸﺎن ﺧﻮاﻫﻨﺪ داﺷﺖ.
Asp.Netﺑﻪ ﺗﻜﻨﻮﻟﻮژي ﺳﻤﺖ ﺳﺮور ﻣﺴﻠﺢ ﺑﻮده و ﺑﻪ ﺻﻮرت وﺳﻴﻊ از دﻳﺒﺎگ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ASP.Netﺣﻤﺎﻳﺖ
ﻣﻲ ﻛﻨﺪ .ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajaxي ﺟﻨﺒﻪ ﻫﺎي ﺟﺪﻳﺪي را ﻣﻄﺮح ﻛﺮدﻧﺪ ﻛﻪ دﻳﺒﺎگ ﺑﺮﻧﺎﻣﻪ ﻫﺎ را ﺑﺴﻴﺎر ﭘﻴﭽﻴﺪه ﻛﺮده
اﺳﺖ .اﺳﺘﻔﺎده وﺳﻴﻊ از ﺟﺎوااﺳﻜﺮﻳﭙﺖ و اﻳﻦ ﺣﻘﻴﻘﺖ ﻛﻪ داده ﺳﻔﺎرﺷﻲ ﺑﺎ اﺳﺘﻔﺎده از اﻧﺘﻘﺎل ﻏﻴﺮ ﻫﻤﺰﻣﺎن ارﺳﺎل ﻣﻲ
ﺷﻮد ﺑﻪ اﻳﻦ ﻣﻌﻨﻲ ﺧﻮاﻫﺪ ﺑﻮد ﻛﻪ ﺑﺎ ﭼﺎﻟﺶ ﺟﺪﻳﺪي ﻫﻨﮕﺎم دﻳﺒﺎگ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajaxي در ASP.NETروﺑﺮو
ﺧﻮاﻫﻴﺪ ﺷﺪ.
در اﻳﻦ ﺑﺨﺶ ﺑﻪ روش دﻳﺒﺎگ ﺟﺎوااﺳﻜﺮﻳﭙﺖ از ﻃﺮﻳﻖ ASP.NETﺳﻤﺖ ﺳﺮور ﺧﻮاﻫﻴﻢ ﭘﺮداﺧﺖ.
دﻳﺒﺎگ ﺳﻤﺖ ﺳﺮور
ASP.Netﻣﺤﻴﻂ ﺗﻮﺳﻌﻪ ﺳﻤﺖ ﺳﺮور ﻣﻲ ﺑﺎﺷﺪ ،ﻣﻮﺗﻮر runtimeدر ASP.NETﺑﻪ ﺻﻮرت ﻣﺠﺎزي ﻫﻤﻪ
ﺻﻔﺤﺎت و ﻛﺪﻫﺎي اﺳﻤﺒﻠﻲ .NETرا ﺗﺠﺰﻳﻪ و ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﻛﻨﺪ.
)ﻣﺎﻧﻨﺪwww.SomeSite.com/ ﺷﻮد ﻣﻲ درﺧﻮاﺳﺖ ASP.NET وب ﺻﻔﺤﻪ زﻣﺎﻧﻴﻜﻪ
،( SomePage.aspxﻣﻮﺗﻮر runtimeﻣﻮﺟﻮد در ASP.NETﺻﻔﺤﻪ وب و ﻛﺪﻫﺎي ﻛﻪ ﺑﺎ آن در ارﺗﺒﺎط
ﻣﻲ ﺑﺎﺷﻨﺪ را ﺗﺠﺰﻳﻪ ﻣﻲ ﻛﻨﺪ .اﻳﻦ ﻛﺪﻫﺎ ﻣﻌﻤﻮﻻ در ﻳﻚ ﻓﺎﻳﻞ ﻛﺪ در داﻳﺮﻛﺘﻮري App_Codeوب ﺳﺎﻳﺖ ﻗﺮار
دارﻧﺪ ،ﻳﺎ اﻳﻨﻜﻪ ﻣﻲ ﺗﻮاﻧﻨﺪ در ﺧﻮد ﺻﻔﺤﻪ وب ) ( ASPXﺟﺎﮔﺬاري ﺷﻮﻧﺪ .ﺻﻔﺤﻪ وب و ﻛﺪ ﻫﺎ در ﻳﻚ اﺳﻤﺒﻠﻲ
.NETﻛﺎﻣﭙﺎﻳﻞ ﺷﺪه و ﺑﺮاي اﺟﺮا داﺧﻞ ﻛﺶ ) (cacheاﺳﻤﺒﻠﻲ ﻟﻮد ﻣﻲ ﺷﻮﻧﺪ.
ﻓﻌﺎل ﺳﺎزي ﺑﺮا ي ﭘﺸﺘﻴﺒﺎﻧﻲ از دﻳﺒﺎگ
ﻗﺒﻞ از اﻳﻨﻜﻪ ﺑﺘﻮان از دﻳﺒﺎگ اﺳﺘﻔﺎده ﻛﺮد ﭘﺸﺘﻴﺒﺎﻧﻲ از دﻳﺒﺎگ ﻧﻴﺎز ﺑﻪ ﻓﻌﺎل ﺳﺎزي دارد .در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب
،ASP.NETﺑﺮاي رﺳﻴﺪن ﺑﻪ اﻳﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺻﻮرت زﻳﺮ در ﻓﺎﻳﻞ ﭘﻴﻜﺮﺑﻨﺪي ﺑﺮﻧﺎﻣﻪ وب )(web.config
ﺗﻨﻈﻴﻤﺎت زﻳﺮ را اﻋﻤﺎل ﻛﺮد:
><configuration
><system.web
>”<compilation debug=“true
></compilation
></system.web
></configuration
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 124ﻓﺼﻞ 5
در ﺻﻮرﺗﻴﻜﻪ ﺑﺨﻮاﻫﻴﺪ ﺑﺮﻧﺎﻣﻪ وب را ﺑﺎ اﺳﺘﻔﺎده از Visual Studio .NET 2005در ﺣﺎﻟﺖ دﻳﺒﺎگ اﺟﺮا
ﻛﻨﻴﺪ ،و ﭘﻴﻜﺮﺑﻨﺪي >” <compilation debug=“trueﺗﻨﻈﻴﻢ ﻧﺸﺪه ﺑﺎﺷﺪ ،ﺷﻤﺎ ﺑﺎﻳﺪ آن را ﻓﻌﺎل ﺑﺎ ﻣﻘﺪار
trueﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ:
ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎي دﻳﮕﺮ ﻣﺎﻧﻨﺪ ﻛﺘﺎﺑﺨﺎﻧﻪ ﻫﺎي ﻛﻼﺳﻲ ،ﺑﺎﻳﺴﺘﻲ ﻣﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ در ﻓﺎﻳﻞ ﭘﻴﻜﺮﺑﻨﺪي debugاﻧﺘﺨﺎب
ﺷﻮد.
در ﻫﺮﻳﻚ از اﻳﻦ ﺣﺎﻻت ،زﻣﺎﻧﻲ ﻛﻪ ﻓﺎﻳﻞ ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﺷﻮﻧﺪ ،اﻃﻼﻋﺎت ﺧﺎص دﻳﺒﺎگ ﺗﻮﻟﻴﺪ ﻣﻲ ﺷﻮﻧﺪ
ﻛﻪ دﻳﺒﺎﮔﺮ Visual Studio.NETرا ﺑﺮاي ردﻳﺎﺑﻲ ﻓﻌﺎل ﺳﺎﺧﺘﻪ و دﻗﻴﻘﺎ ﻧﺸﺎن ﻣﻲ دﻫﻨﺪ ﻛﻪ ﻛﺪام ﺧﻂ در
ﺣﺎل اﺟﺮا ﻣﻲ ﺑﺎﺷﺪ .ﻣﻲ ﺗﻮاﻧﻴﺪ اﻳﻦ ﻣﻮﺿﻮع را ﺑﺎ ﻧﮕﺎه ﺑﻪ داﻳﺮﻛﺘﻮري ﺧﺮوﺟﻲ ﺑﺮﻧﺎﻣﻪ اي ﻛﻪ ﻛﺎﻣﭙﺎﻳﻞ ﻣﻲ ﻛﻨﻴﺪ ﺑﺒﻴﻨﻴﺪ.
اﮔﺮ debug buildاﻧﺘﺨﺎب ﺷﺪه ﺑﺎﺷﺪ ،ﻳﺎ دﻳﺒﺎگ از ﻃﺮﻳﻖ web.configﻫﻤﺎن ﻃﻮر ﻛﻪ ﻗﺒﻼ ﮔﻔﺘﻪ ﺷﺪ
ﺗﻨﻈﻴﻢ ﺷﺪه ﺑﺎﺷﺪ ،آن ﺟﺎ ﻓﺎﻳﻞ ﻫﺎي ﻣﺮﺑﻮط ﺑﻪ دﻳﺒﺎگ ﻇﺎﻫﺮ ﺧﻮاﻫﺪ ﺷﺪ ،ﻛﻪ ﭘﺴﻮﻧﺪ ﻓﺎﻳﻠﻲ .pdbرا دارﻧﺪ .ﺑﺮاي
ﻣﺜﺎل ،اﮔﺮ ﺑﺮﻧﺎﻣﻪ ﺷﻤﺎ MyApp.exeرا ﺗﻮﻟﻴﺪ ﻛﻨﺪ ،ﻳﻚ ﻓﺎﻳﻞ ﻣﺘﻨﺎﻇﺮ ﺑﺎ آن ﺑﻪ ﻧﺎم MyApp.pdbاﻳﺠﺎد ﺧﻮاﻫﺪ
ﺷﺪ.
ﺗﻨﻈﻴﻢ ﻧﻘﺎط ﺗﻮﻗﻒ اﺟﺮا
ﺣﺎل ﻛﻪ دﻳﺒﺎگ ﻓﻌﺎل ﺷﺪه اﺳﺖ ،اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﻫﺎ در ﺳﺮور ﻣﻲ ﺗﻮاﻧﻨﺪ ردﻳﺎﺑﻲ) (trackﺷﻮﻧﺪ .آﺳﺎن ﺗﺮﻳﻦ روش
ﺑﺮاي اﻳﻦ ﻛﺎر ﺗﻨﻈﻴﻢ ﻧﻘﺎط ﺗﻮﻗﻒ اﺟﺮا ﻣﻲ ﺑﺎﺷﺪ .ﻧﻘﺎط ﺗﻮﻗﻒ اﺟﺮا ﻳﻚ ﺧﻂ ﻧﺸﺎﻧﺪار در ﻛﺪ ﻣﻲ ﺑﺎﺷﺪ ﻛﻪ ﺑﻪ دﻳﺒﺎﮔﺮ
اﻋﻼن ﺗﻮﻗﻒ اﺟﺮا در ﺧﻄﻲ ﻛﻪ ﺑﺎ ﻧﻘﻄﻪ ﺗﻮﻗﻒ اﺟﺮا ﻧﺸﺎﻧﺪار ﺷﺪه اﺳﺖ را ﻣﻲ دﻫﺪ .ﻳﻚ ﻧﻘﻄﻪ ﺗﻮﻗﻒ اﺟﺮا ﻛﻪ ﺑﺎ ﻳﻚ
ﻧﻘﻄﻪ ﻗﺮﻣﺰ در ﺳﻤﺖ ﭼﭗ ﺧﻂ ﻧﺸﺎﻧﺪار ﺷﺪه اﺳﺖ ،ﺑﺎ ورود ﺑﻪ ﺧﻂ آن ﻧﻴﺰ ﺑﻪ ﺻﻮرت ﻗﺮﻣﺰ رﻧﮓ در ﺧﻮاﻫﺪ آﻣﺪ.
ﺷﻜﻞ زﻳﺮ ﻳﻚ ﻧﻘﻂ ﺗﻮﻗﻒ اﺟﺮا را ﻧﺸﺎن ﻣﻲ دﻫﺪ.
ﻓﺼﻞ 125 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
اﻳﺠﺎد ﻛﻨﻴﺪ و ﻳﺎASPX ﻳﻚ ﻓﺮم ﺟﺪﻳﺪ.ﺑﺮاي اﻣﺘﺤﺎن اﻳﻦ ﻣﻮرد ﻳﻚ ﭘﺮوژه ﺟﺪﻳﺪ در وﻳﮋوال اﺳﺘﻮدﻳﻮ اﻳﺠﺎد ﻛﻨﻴﺪ
< ﻣﻮﺟﻮد در ﺻﻔﺤﻪ وhtml></html> اﻋﻼم. داﺧﻞ ﭘﺮوژه را وﻳﺮاﻳﺶ ﻛﻨﻴﺪ،Default.aspx ﺻﻔﺤﻪ
:ﻣﺤﺘﻮﻳﺎت آن را ﭘﺎك ﻛﺮده و ﻛﺪ زﻳﺮ را ﺟﺎﻳﮕﺰﻳﻦ آن ﻛﻨﻴﺪ
<script type="text/javascript">
function DoSomeWork()
{
var cntrl =
document.getElementById("txtInput");
var number = cntrl.value;
number++;
var newValue = DoSomeMoreWork(number);
alert("New Value = " + newValue);
}
function DoSomeMoreWork(arg)
{
// Do some calculations
arg = arg * 2 + 32;
arg = arg + 18 / 2;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="text"id="txtInput" value="test"/>
<input type="button" value="Submit value"
onclick="DoSomeWork();" />
</div>
</form>
</body>
</html>
)ﺑﺎ ﻛﻠﻴﻚ.ﻣﻄﻤﺌﻦ ﺑﺎﺷﻴﺪ ﻛﻪ ﺻﻔﺤﻪ ي ﺟﺪﻳﺪي ﻛﻪ اﻳﺠﺎد ﻛﺮده اﻳﺪ ﺑﻪ ﻋﻨﻮان ﺻﻔﺤﻪ ﺷﺮوع ﺗﻨﻈﻴﻢ ﺷﺪه اﺳﺖ
Set as ﺑﺮ روي ﺻﻔﺤﻪ و اﻧﺘﺨﺎب ﮔﺰﻳﻨﻪSolution Explorer راﺳﺖ در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻗﺴﻤﺖ
را در ﺻﻔﺤﻪF5 ﺑﺮاي اﺟﺮاي ﺑﺮﻧﺎﻣﻪ در ﺣﺎﻟﺖ دﻳﺒﺎگ ﺑﺮ روي ﻛﻠﻴﺪ ﺷﺮوع ﻛﻠﻴﻚ ﻛﻨﻴﺪ و ﻳﺎ.(Start page
Submit ( ﻛﻠﻴﻚ ﺑﺮروي ﻛﻠﻴﺪ. ﺑﺮاي دﻳﺒﺎگ ﺗﻨﻈﻴﻢ ﺷﺪه اﺳﺖweb.config )ﻣﻄﻤﺌﻴﻦ ﺑﺎﺷﻴﺪ ﻛﻪ.ﻛﻠﻴﺪ ﺑﺰﻧﻴﺪ
. ﺑﺎﻳﺴﺘﻲ ﺧﻄﺎﻳﻲ ﻣﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ را ﺗﻮﻟﻴﺪ ﻛﻨﺪValure
ﻓﺼﻞ 127 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
اﻳﻦ ﻧﺘﻴﺠﻪ آن ﭼﻴﺰي ﻧﻴﺴﺖ ﻛﻪ ﺷﻤﺎ ﻣﻲ ﺧﻮاﺳﺘﻴﺪ ،و اﺣﺘﻤﺎﻻ ﺷﻤﺎ اﻧﺘﻈﺎر ﭼﻴﺰي ﺑﻴﺶ از undefinedداﺷﺘﻴﺪ.
ﺑﺮاي اﺻﻼح اﻳﻦ ﻣﻮﺿﻮع ،ﺷﻤﺎ ﺑﺎﻳﺴﺘﻲ ﺑﻪ دﻳﺒﺎگ در ﺳﻤﺖ ﻛﻼﻳﻨﺖ ﺑﺮاي اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﭙﺮدازﻳﺪ .ﺑﺮاي اﻳﻦ ﻛﺎر ﺑﺎﻳﺪ از
ﻗﺎﺑﻠﻴﺖ دﻳﺒﺎگ اﺳﻜﺮﻳﭙﺖ ﻣﻮﺟﻮد در IEاﺳﺘﻔﺎده ﻛﻨﻴﺪ.
-1ﺑﺮاي اﻳﺠﺎد ﻳﻚ ﺟﻠﺴﻪ دﻳﺒﺎگ ﺑﺮاي ﻳﻚ ﺻﻔﺤﻪ ،ASP.NETﺑﻪ ﺻﻔﺤﻪ ي ﺑﺮﻧﺎﻣﻪ ﻣﻮرد ﻧﻈﺮ رﻓﺘﻪ و ﻃﺒﻖ ﺷﻜﻞ
زﻳﺮﮔﺰﻳﻨﻪ Script Debugger Viewرا در IEاﻧﺘﺨﺎب ﻛﻨﻴﺪ.
Visual در اﻳﻨﺠﺎ ﺑﺎ دو ﮔﺰﻳﻨﻪ روﺑﺮو ﻣﻲ ﺷﻮﻳﺪ اﮔﺮ Openرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ،ﻓﻮراً ﺷﺮوع ﺑﻪ اﺳﺘﻔﺎده از
Visual Studio.NETﺑﻪ ﻣﻨﻈﻮر دﻳﺒﺎگ ﺧﻮاﻫﻴﺪ ﻛﺮد ﻫﻤﺎﻧﻄﻮر ﻛﻪ در ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺑﻴﻨﻴﺪ .اﮔﺮ
Visual Studio.NETﺑﺎز ﺷﻮد ﻣﻲ ﺗﻮاﻧﻴﺪ ﺷﺮوع ﺑﻪ دﻳﺒﺎگ ﻛﻨﻴﺪ ﻳﺎ اﻳﻨﻜﻪ ﻳﻚ ﻧﻤﻮﻧﻪ ﺟﺪﻳﺪ از
Studio.NETرا ﺑﺮاي ﺷﺮوع دﻳﺒﺎگ اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺑﺎ اﻧﺘﺨﺎب ،Break at Next Statementدر
ﺣﻴﻦ اﺟﺮاي اﺳﻜﺮﻳﭙﺖ ﺻﻔﺤﻪ ﻫﻴﭻ اﺗﻔﺎﻗﻲ رخ ﻧﺨﻮاﻫﺪ داد.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 128ﻓﺼﻞ 5
-2در وﻳﮋوال اﺳﺘﻮدﻳﻮ ﭘﻨﺠﺮه Scrit Explorerﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .اﮔﺮ ﻃﺮح ﺑﻨﺪي ﭘﻨﺠﺮه ﺷﻤﺎ ﺑﻪ
ﺻﻮرت ﺗﻨﻈﻴﻤﺎت ﭘﻴﺶ ﻓﺮض ﺑﺎﺷﺪ ،در اﻳﻦ ﺻﻮرت ﭘﻨﺠﺮه Scrit Explorerﺑﺎﻳﺴﺘﻲ در ﺳﻤﺖ راﺳﺖ
ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ.
-3در ﭘﻨﺠﺮه ،Scrit Explorerاﮔﺮ ﺑﻪ ﺗﻨﻬﺎ ﺻﻔﺤﻪ ASPXﻣﻮﺟﻮد در ﻟﻴﺴﺖ ﺗﻮﺟﻪ ﻛﻨﻴﺪ ﺧﻮاﻫﻴﺪ دﻳﺪ ﻛﻪ
ﺻﻔﺤﻪ ي در ﺣﺎل اﺟﺮاي ﻓﻌﻠﻲ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺎ اﻧﺘﺨﺎب ﺻﻔﺤﻪ ﻣﻮرد ﻧﻈﺮ ﻛﺪ ﺻﻔﺤﻪ را ﺧﻮاﻫﻴﺪ دﻳﺪ .ﻣﻲ ﺑﻴﻨﻴﺪ ﻛﻪ ﺑﺴﻴﺎر
ﺷﺒﻴﻪ ﺑﻪ ﺻﻔﺤﻪ زﻣﺎن ﻃﺮاﺣﻲ و ﺗﻮﺳﻌﻪ ﻣﻲ ﺑﺎﺷﺪ .ﺑﺰرﮔﺘﺮﻳﻦ ﺗﻔﺎوت اﻳﻦ اﺳﺖ ﻛﻪ اﻛﻨﻮن ﻣﻲ ﺗﻮاﻧﻴﺪ ﻧﻘﺎط ﺗﻮﻗﻒ اﺟﺮا
را در آن ﺗﻨﻈﻴﻢ ﻛﻨﻴﺪ و ﻣﻘﺪار ﻣﺘﻐﻴﺮﻫﺎي ﻣﻮﺟﻮد را ﺑﻪ روش ﻛﺪ ﻫﺎي ﺳﻤﺖ ﺳﺮور اﻣﺘﺤﺎن ﻛﻨﻴﺪ.
-4در داﺧﻞ ﭘﻨﺠﺮه وﻳﺮاﻳﺶ ،ﺑﻪ اﺑﺘﺪاي ﺗﺎﺑﻊ DoSomeWorkرﻓﺘﻪ و ﻛﻠﻴﺪ F9را ﻓﺸﺎر دﻫﻴﺪ و ﻳﺎ ﺑﺮ روي ﻧﻮار
ﺧﺎﻛﺴﺘﺮي در ﺳﻤﺖ ﭼﭗ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ﺗﺎ در آن ﺧﻂ ﻳﻚ ﻧﻘﻄﻪ ﺗﻮﻗﻒ اﺟﺮا اﻳﺠﺎد ﺷﻮد .ﭘﻨﺠﺮه وﻳﺮاﻳﺶ ﺑﺎﻳﺴﺘﻲ
ﻣﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ ﺑﺎﺷﺪ:
ﻓﺼﻞ 129 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
-5ﺣﺎل ﺑﻪ ﻧﻤﻮﻧﻪ IEدر ﺣﺎل اﺟﺮا ،رﻓﺘﻪ و ﺑﺮ روي ﻛﻠﻴﺪ Submit Valueﻛﻠﻴﻚ ﻛﻨﻴﺪ .وﻳﮋوال اﺳﺘﻮدﻳﻮ
ﺑﺎﻳﺴﺘﻲ ﺑﻪ ﺻﻮرت ﺧﻮدﻛﺎر ﻓﻌﺎل ﺷﺪه و زﻣﺎﻧﻲ ﻛﻪ ﺑﻪ ﻧﻘﻄﻪ ﺗﻮﻗﻒ اﺟﺮا رﺳﻴﺪ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ را ﻣﺘﻮﻗﻒ ﻛﻨﺪ .اﻳﻦ ﺧﻂ
ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ ﺑﻪ ﺻﻮرت رﻧﮕﻲ ﻣﺸﺨﺺ ﺧﻮاﻫﺪ ﺷﺪ.
-6ﺑﺮاي رﻓﺘﻦ ﺑﻪ ﺧﻂ ﺑﻌﺪي ﻛﻠﻴﺪ F10را اﻧﺘﺨﺎب ﻛﻨﻴﺪ .ﺣﺎﻻ ﺧﻂ ﺑﻌﺪي رﻧﮕﻲ ﺧﻮاﻫﺪ ﺷﺪ .ﺑﺎ ﻗﺮار دادن اﺷﺎره ﮔﺮ
ﻣﻮس ﺑﺮ روي ﻣﺘﻐﻴﺮ cntrlﻛﻪ در ﺧﻄﻲ ﻛﻪ در ﺣﺎل ﺧﻮاﻧﺪه ﺷﺪن اﺳﺖ:
;)”var cntrl = document.getElementById(“txtInput
ﻳﻚ ﺟﻌﺒﻪ ﻣﺤﺎوره ﻛﻮﭼﻚ ﻧﻤﺎﻳﺶ داده ﺧﻮاﻫﺪ ﺷﺪ ،اﻳﻦ ﺟﻌﺒﻪ ،ﻣﺘﻐﻴﺮ cntrlرا ﺑﺎ ﻳﻚ ﮔﺰﻳﻨﻪ ﺑﺮاي ﺑﺴﻂ ﻣﻘﺪار
ﻣﺘﻐﻴﺮ ﺑﻮﺳﻴﻠﻪ ﻛﻠﻴﻚ ﺑﺮ روي ﻧﻤﺎد +ﻧﺸﺎن ﻣﻲ دﻫﺪ) .ﺷﻜﻞ زﻳﺮ را ﻣﺸﺎﻫﺪه ﻛﻨﻴﺪ(
ﻛﻠﻴﻚ ﺑﺮ روي ﻧﻤﺎد +ﺑﻪ ﺗﻮﺳﻌﻪ دﻫﻨﺪه اﺟﺎزه ﻣﻲ دﻫﺪ ﺗﺎ ﻣﻘﺪار ﻣﺘﻐﻴﺮ را ﺑﺮرﺳﻲ ﻛﺮده و ﺧﺼﻮﺻﻴﺎت آن را در
وﺿﻌﻴﺖ ﻓﻌﻠﻲ ﺗﻤﺎﺷﺎ ﻛﻨﺪ .اﻳﻦ روش ﺑﺮرﺳﻲ ﻣﺘﻐﻴﺮﻫﺎ ،ﺑﺴﻴﺎر ﺷﺒﻴﻪ دﻳﺒﺎگ ﻛﺪﻫﺎي ﺳﻤﺖ ﺳﺮور ﻣﻲ ﺑﺎﺷﺪ.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 130ﻓﺼﻞ 5
ﺑﺎ ﻛﻠﻴﻚ راﺳﺖ ﺑﺮ روي ﻣﺘﻐﻴﺮ ،cntrlﻣﻨﻮﻳﻲ ﻇﺎﻫﺮ ﻣﻲ ﺷﻮد ﻛﻪ ﺷﺒﻴﻪ ﺑﻪ ﻣﻨﻮي اراﺋﻪ ﺷﺪه در ﻛﺪﻫﺎي ﺳﻤﺖ ﺳﺮور
ﻣﻲ ﺑﺎﺷﺪ .ﻣﻜﺎﻧﻴﺴﻢ دﻳﺒﺎگ ﻫﺎي ﺳﻨﺘﻲ ﻣﺎﻧﻨﺪ Add watchﺑﺮاي اﺿﺎﻓﻪ ﻛﺮدن ﻣﺘﻐﻴﺮ cntrlﺑﻪ ﭘﻨﺠﺮه ،Watch
در ﻗﺴﻤﺖ ﭘﺎﻳﻴﻦ ﺻﻔﺤﻪ در دﺳﺘﺮس ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﻣﻮﺿﻮع را در اداﻣﻪ ﻓﺼﻞ ﺑﻴﺸﺘﺮ ﺗﻮﺿﻴﺢ ﺧﻮاﻫﻴﻢ داد .ﻫﻤﻴﻨﻄﻮر،
ﺗﻮﺳﻌﻪ دﻫﻨﺪه ﻣﻲ ﺗﻮاﻧﺪ ﭘﻨﺠﺮه Quick watchرا ﺑﺎز ﻛﻨﺪ ﻛﻪ اﺟﺎزه ﺑﺎز ﻛﺮدن ﻳﻚ ﺟﻌﺒﻪ ﻣﺤﺎوره ﻛﻪ ﺑﺮاي
ﺑﺮرﺳﻲ آﺳﺎﻧﺘﺮ ﻣﺤﺘﻮﻳﺎت ﻣﺘﻐﻴﺮﻫﺎ ﺗﻬﻴﻪ ﺷﺪه اﺳﺖ را ﻣﻲ دﻫﺪ .اﻳﻦ ﭘﻨﺠﺮه ﺷﺒﻴﻪ ﺑﻪ ﭘﻨﺠﺮه watchﻣﻲ ﺑﺎﺷﺪ اﻣﺎ ﻳﻚ
روش ﻣﺴﺘﻘﻴﻢ و ﺑﺮﺗﺮي ﺑﺮاي ﻛﺎر ﺑﺮ روي ﻣﺘﻐﻴﺮ ﺧﺎﺻﻲ را ﻣﻲ دﻫﺪ .ﺗﻨﻬﺎ ﻫﺪف اﻳﻦ ﭘﻨﺠﺮه ﻧﻤﺎﻳﺶ ﻣﺤﺘﻮﻳﺎت ﻣﺘﻐﻴﺮ
اﻧﺘﺨﺎب ﺷﺪه ﻣﻲ ﺑﺎﺷﺪ وﮔﺮﻧﻪ ﻋﻤﻠﻴﺎت آن ﻫﻤﺎﻧﻨﺪ ﭘﻨﺠﺮه Watchﻣﻲ ﺑﺎﺷﺪ .ﺗﻨﻬﺎ ﺗﻔﺎوت واﻗﻌﻲ آﻣﺎده ﺳﺎزي ﻛﻠﻴﺪ
Reevaluateاﺳﺖ ﻛﻪ اﺟﺎزه وارد ﻛﺮدن ﻣﺘﻐﻴﺮ ﺟﺪﻳﺪ داﺧﻞ ﻓﻴﻠﺪ textرا ﻣﻲ دﻫﺪ.
-1دوﺑﺎره ﻛﻠﻴﺪ F10را ﺑﺮاي ﭘﻴﺸﺮوي در ﻛﺪ ﺑﻪ ﺧﻂ ﺑﻌﺪي اﻧﺘﺨﺎب ﻛﻨﻴﺪ .اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﺎﻳﺴﺘﻲ در ﺧﻄﻲ ﺑﺎ
ﻣﺤﺘﻮﻳﺎت زﻳﺮ ﺗﻮﻗﻒ ﻛﺮده ﺑﺎﺷﺪ:
;number++
-2ﻣﻮس را ﺑﺮ روي ﻣﺘﻐﻴﺮ numberﻗﺮار دﻫﻴﺪ .دﻳﺒﺎﮔﺮ ﺑﺎﻳﺴﺘﻲ ﻫﻤﺎﻧﻨﺪ ﺷﻜﻞ زﻳﺮ ﻣﻘﺪار ﻣﺘﻐﻴﺮ numberرا ﻧﺸﺎن
دﻫﺪ .ﻣﻌﻤﻮﻻً ﻣﻘﺪاري ﻛﻪ اﻧﺘﻈﺎر ﻣﻲ رود در ﻣﺘﻐﻴﺮ numberﺑﺎﺷﺪ ﺑﺮاﺑﺮ ﺑﺎ ﻣﺤﺘﻮاي ﻛﻨﺘﺮل textboxﻣﻮﺟﻮد در
ﺻﻔﺤﻪ ﻣﻲ ﺑﺎﺷﺪ.
ﻓﺼﻞ 131 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
-3دوﺑﺎره ﻛﻠﻴﺪ F10را ﺑﺮاي رﻓﺘﻦ اﺟﺮاي ﺑﺮﻧﺎﻣﻪ ﺑﻪ ﺧﻂ ﺑﻌﺪي اﻧﺘﺨﺎب ﻛﻨﻴﺪ .اﻛﻨﻮن دﻳﺒﺎﮔﺮ ﺑﺎﻳﺴﺘﻲ در ﺧﻂ زﻳﺮ
ﻣﺘﻮﻗﻒ ﺷﺪه ﺑﺎﺷﺪ:
;)var newValue = DoSomeMoreWork(number
ﺑﺮاي ﻧﻤﺎﻳﺶ ﻣﻘﺪار ﻓﻌﻠﻲ ،ﻣﻮس را ﺑﺮ روي ﻣﺘﻐﻴﻴﺮ numberﺑﺒﺮﻳﺪ .اﺣﺘﻤﺎﻻ ﭼﻴﺰي ﺷﺒﻴﻪ ﺷﻜﻞ زﻳﺮ ﻧﻤﺎﻳﺶ داده
ﺷﻮد:
اﻛﻨﻮن ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺒﻴﻨﻴﺪ ﻛﻪ ﻣﻘﺪار ﻛﺪام ﻣﺘﻐﻴﺮ ﻧﺎﻣﻌﺘﺒﺮ ﻣﻲ ﺑﺎﺷﺪ .ﻣﻌﻠﻮم ﻣﻲ ﺷﻮد ﻛﻪ ﻣﻘﺪار numberﻳﻚ ﻣﻘﺪار
ﻣﺘﻨﻲ ﺑﺎ ﻣﻘﺪار testﺑﻮده اﺳﺖ .ﻣﺮﺣﻠﻪ ﺑﻌﺪي اﺟﺮا اﻧﺠﺎم ﻋﻤﻠﻴﺎت رﻳﺎﺿﻲ ﺑﺮ روي ﻣﻘﺪار رﺷﺘﻪ اي ﻣﻲ ﺑﺎﺷﺪ ،ﻛﻪ در
ﺣﻘﻴﻘﺖ ﻧﺎﻣﻌﺘﺒﺮ اﺳﺖ .ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﻫﻤﺎﻧﻨﺪ زﺑﺎﻧﻬﺎي VBو C#ﻧﻴﺴﺖ .اﻳﻦ ﻋﻤﻠﻴﺎت ﻇﺎﻫﺮاً ﻧﺎﻣﻌﺘﺒﺮ ،ﻫﻴﭻ اﺳﺘﺜﻨﺎﻳﻲ را
اﻳﺠﺎد ﻧﻤﻲ ﻛﻨﺪ ،اﻣﺎ ﻣﻘﺪار ﻣﺘﻐﻴﺮ numberﺑﺎ undefinedﻣﻘﺪار دﻫﻲ ﻣﻲ ﺷﻮد ،ﻛﻪ دﻗﻴﻘﺎً ﻫﻤﺎن ﭼﻴﺰي ﻣﻲ
ﺑﺎﺷﺪ ﻛﻪ ﺷﻤﺎ در ﺧﺮوﺟﻲ ﻣﺮورﮔﺮﺗﺎن ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ.
-4ﻛﻠﻴﺪ F5را اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﻳﺎ اﻳﻨﻜﻪ دﻛﻤﻪ Playرا ﺑﺮاي اﺟﺮاي ﻣﻌﻤﻮﻟﻲ ﺑﺮﻧﺎﻣﻪ ﻛﻠﻴﻚ ﻛﻨﻴﺪ ،ﻫﻤﺎن ﻧﺘﻴﺠﻪ اي را
ﻛﻪ ﻗﺒﻼً دﻳﺪﻳﺪ ﻇﺎﻫﺮ ﺧﻮاﻫﺪ ﺷﺪ.
ﺷﻤﺎ ﺑﺎ ﻣﻮﻓﻘﻴﺖ دﻳﺒﺎگ را ﺑﻪ اﺗﻤﺎم رﺳﺎﻧﺪﻳﺪ و ﻣﺘﻮﺟﻪ ﭼﺮاﻳﻲ رﻓﺘﺎر ﻣﺮورﮔﺮ ﺷﺪﻳﺪ .دﻳﺒﺎگ ﺑﻪ اﻳﻦ روش ﺑﺴﻴﺎر ﻣﻔﻴﺪ
ﻣﻲ ﺑﺎﺷﺪ و ﺑﺮﻧﺎﻣﻪ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﺑﺎ ﺟﺰﺋﻴﺎت ﺑﻴﺸﺘﺮي ﻣﻮرد ﺑﺮرﺳﻲ ﻗﺮار ﮔﻴﺮﻧﺪ.
اﺳﺘﻔﺎده از ﭘﻨﺠﺮه Watch
ﻫﻤﺎن ﻃﻮري ﻛﻪ ﻗﺒﻼ اﺷﺎره ﺷﺪ ،در زﻣﺎن دﻳﺒﺎگ ،ﺗﻮﺳﻌﻪ دﻫﻨﺪه ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ راﺣﺘﻲ ﻣﻮس را ﺑﺮ روي ﻣﺘﻐﻴﺮ ﻗﺮار
داده و ﻣﻘﺪار آن را ﻣﺸﺎﻫﺪه ﻛﻨﺪ .اﻣﺎ اﻧﺠﺎم اﻳﻦ ﻛﺎر ﺑﺮاي ﺑﺮﺧﻲ از ﻣﺘﻐﻴﺮﻫﺎ و ﺛﺎﺑﺘﻬﺎ در ﻫﺮ ﺧﻂ ﻛﻪ ﻛﺪ اﺟﺮا ﻣﻲ ﺷﻮد
ﻣﻲ ﺗﻮاﻧﺪ ﺳﻨﮕﻴﻦ ﺑﺎﺷﺪ .اﻣﺎ ﺷﻤﺎ ﮔﺰﻳﻨﻪ ﻫﺎي دﻳﮕﺮي ﻧﻴﺰ دارﻳﺪ.
ﻫﻤﺎﻧﻨﺪ ﺗﻜﻨﻴﻚ دﻳﺒﺎگ ﺳﻤﺖ ﺳﺮور ،ﻣﻲ ﺗﻮاﻧﻴﺪ از Watchﺑﺮاي ﻣﺸﺎﻫﺪه ﻣﻘﺪار ﻣﺘﻐﻴﺮﻫﺎ و ﻓﻌﻞ و اﻧﻔﻌﺎل ﻫﺎي آن ﻫﺎ
ﺑﺎ ﺑﺮﻧﺎﻣﻪ ﺗﺎن اﺳﺘﻔﺎده ﻛﻨﻴﺪ.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 132ﻓﺼﻞ 5
ﺑﺎ اﺳﺘﻔﺎده از ﻣﺜﺎل ﻗﺒﻠﻲ ،در ﺣﺎﻟﺖ دﻳﺒﺎگ ﺑﺮ روي numberﻛﻠﻴﻚ راﺳﺖ ﻛﻨﻴﺪ .ﺑﺎ اﻧﺠﺎم اﻳﻦ ﻛﺎر ﻣﻨﻮﻳﻲ ﻇﺎﻫﺮ ﻣﻲ
ﺷﻮد .از ﻣﻨﻮ ﮔﺰﻳﻨﻪ Add Watchرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ ﻛﻪ دراﻳﻨﺼﻮرت ﻣﺘﻐﻴﺮ numberرا ﺑﻪ ﭘﻨﺠﺮه watchاﺿﺎﻓﻪ
ﻣﻲ ﻛﻨﺪ .ﭘﻨﺠﺮه watchﺑﻪ ﺻﻮرت ﭘﻴﺶ ﻓﺮض درﭘﺎﻳﻴﻦ ،ﻗﺴﻤﺖ ﭼﭗ ﻣﺤﻴﻂ وﻳﮋوال اﺳﺘﻮدﻳﻮ ﻗﺮار دارد .ﻛﻪ در
ﺷﻜﻞ زﻳﺮ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻣﺸﺎﻫﺪ ﻛﻨﻴﺪ.
ﻣﺸﺎﻫﺪه ﻣﻲ ﻛﻨﻴﺪ ﻛﻪ ﻣﺘﻐﻴﺮ numberﻣﻘﺪار undefinedرا ﻧﺸﺎن ﻣﻲ دﻫﺪ .ﺑﺎ دوﺑﺎر ﻓﺸﺮدن F10ﻣﻘﺪار ﻣﺘﻐﻴﺮ
numberﺗﻐﻴﻴﺮ ﭘﻴﺪا ﻣﻲ ﻛﻨﺪ و ﻣﺘﻐﻴﺮ numberداﺧﻞ ﭘﻨﺠﺮه Watchﻧﻴﺰ ﺑﻪ روز ﻣﻲ ﺷﻮد .ﭼﻨﺪﻳﻦ آﻳﺘﻢ ﻣﻲ
ﺗﻮاﻧﻨﺪ ﺑﻪ ﭘﻨﺠﺮه watchاﺿﺎﻓﻪ ﮔﺮدﻧﺪﻛﻪ ﺗﻮﺳﻌﻪ دﻫﻨﺪه را ﻗﺎدر ﺑﻪ ﭘﻴﮕﻴﺮي ﻣﻘﺎدﻳﺮ ﻣﺘﻐﻴﺮﻫﺎ ﻣﻲ ﻛﻨﺪ.
ﻓﺼﻞ 133 5 ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax
ﻋﻼﻣﺖ ﺳﻮال اﺧﺘﺼﺎر printو ﻳﺎ displayﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺗﻜﻨﻴﻚ ﻳﻚ روش ﺑﺴﻴﺎر ﻣﻔﻴﺪ ﺑﺮاي ارزﻳﺎﺑﻲ
وﺿﻌﻴﺖ ﻫﺎي ﻣﺨﺘﻠﻒ داﺧﻞ ﺑﺮﻧﺎﻣﻪ ﺗﺎن ﻣﻲ ﺑﺎﺷﺪ.
ﺧﻄﺎﻳﺎﺑﻲ ﺑﺮﻧﺎﻣﻪ ﻫﺎي Ajax 134ﻓﺼﻞ 5
ﻓﺼﻞ 135 6 ﺑﺮﻧﺎﻣﻪ chatRoom
در اﻳﻦ ﻓﺼﻞ اﻳﺠﺎد ﻳﻚ chatroomرا ﺑﺎ ﻛﻤﻚ Ajaxﺑﺮرﺳﻲ ﺧﻮاﻫﻴﻢ ﻛﺮد.ﻛﺪﻫﺎي ﻛﺎﻣﻞ اﻳـﻦ ﺑﺮﻧﺎﻣـﻪ در CD
ﻛﺘـﺎب در ﻣــﺴﻴﺮ project\chatو ﺟـﺪول ﻫــﺎي آن در ﻣــﺴﻴﺮ project\database\chatroom
ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻳﻚ chatroomﻋﻤﻮﻣﻲ اﺳﺖ ،ﻳﻌﻨﻲ ﻫﺮﻛﺎرﺑﺮ ﺑﺎ داﺷﺘﻦ ﻳﻚ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي وارد ﻣﺤـﻴﻂ ارﺳـﺎل ﭘﻴـﺎم
ﻣﻲ ﺷﻮد و ﻣﻲ ﺗﻮاﻧـﺪ ﭘﻴـﺎم ﻫـﺎي ﺧـﻮد را ارﺳـﺎل ﻛﻨـﺪ .ﭘﻴـﺎم ارﺳـﺎل ﺷـﺪه ﺑـﺮاي ﺗﻤـﺎﻣﻲ ﻛـﺎرﺑﺮاﻧﻲ ﻛـﻪ ﻫﻤﺰﻣـﺎن در
chatroomﺣﻀﻮر داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﻗﺎﺑﻞ روﻳﺖ اﺳﺖ .ﺑﻄﻮر ﻛﻠﻲ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﻣﻜـﺎن ارﺳـﺎل ﭘﻴـﺎم ﺑـﻪ ﻳـﻚ ﻛـﺎرﺑﺮ
ﺧﺎص ﺑﻪ ﮔﻮﻧﻪ اي ﻛﻪ دﻳﮕﺮ ﻛﺎرﺑﺮان ﻧﺘﻮاﻧﻨﺪ آن ﭘﻴﺎم را ﻣﺸﺎﻫﺪه ﻛﻨﻨـﺪ وﺟـﻮد ﻧـﺪارد .ﻛـﺎرﺑﺮان در ﺻـﻮرت ﻧﺪاﺷـﺘﻦ
ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻣﻲ ﺗﻮاﻧﻨﺪ ﻳﻚ ﺷﻨﺎﺳﻪ ﺑﺮاي ﺧﻮد اﻳﺠﺎد ﻛﻨﻨﺪ.
در ﺳﺎﻳﺖ ﻟﻴﺴﺘﻲ از ﻛﺎرﺑﺮان ﻓﻌﺎل در chatroomﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد ،ﻫﺮﻛﺎرﺑﺮ ﺑﺎ ورود ﺑـﻪ chatroomﻣـﻲ
ﺗﻮاﻧﺪ اﻳﻦ ﻟﻴﺴﺖ ﻛﺎرﺑﺮان را ﻣﺸﺎﻫﺪه ﻧﻤﺎﻳﺪ .ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑﺮ روي آﻳﻜﻮن ﻫﺮ ﻛﺎرﺑﺮ از ﻟﻴـﺴﺖ ﻧﻤـﺎﻳﺶ داده ﺷـﺪه،
اﻃﻼﻋﺎت ﺷﺨﺼﻲ آن ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻓﺮض ﻛﻨﻴﺪ ﺑﺨﻮاﻫﻴﺪ اﻳﻦ chatroomرا ﺑﻄﻮر ﻣﻌﻤﻮل در وب ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳﺴﻲ ﻛﻨﻴﺪ ،ﻫﺮ زﻣﺎن ﻛـﻪ ﭘﻴـﺎﻣﻲ از ﺳـﻤﺖ
ﻳﻚ ﻛﺎرﺑﺮ ﺑﻪ ﻛﺎرﺑﺮ دﻳﮕﺮي ارﺳﺎل ﻣﻲ ﺷﻮد ﺑﺮاي ﻧﻤﺎﻳﺶ ﭘﻴﺎم ﺟﺪﻳﺪ ﺑﺎﻳﺪ ﺻﻔﺤﻪ ي ﮔﻴﺮﻧﺪه ﭘﻴﺎم دوﺑـﺎره ﺑﺎرﮔـﺬاري
ﺷﻮد ﻳﺎ زﻣﺎﻧﻴﻜﻪ ﻳﻚ ﻛﺎرﺑﺮ ﺟﺪﻳﺪ ﺑﻪ ﺳﺎﻳﺖ وارد ﻣﻲ ﺷﻮد ﺑﺎﻳﺪ ﻟﻴـﺴﺖ ﻛـﺎرﺑﺮان ﻓﻌـﺎل دوﺑـﺎر ﺑﺎرﮔـﺬاري ﺷـﻮد .اﻳـﻦ
ﻋﻤﻠﻴﺎت در ﭼﻨﻴﻦ ﺑﺮﻧﺎﻣﻪ ي ﺧﻴﻠﻲ ﺧﺴﺘﻪ ﻛﻨﻨﺪه اﺳﺖ در ﻧﺘﻴﺠﻪ ﻧﻮﺷﺘﻦ اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﺼﻮرت ﺑﺮﻧﺎﻣﻪ ﻧﻮﻳـﺴﻲ ﻣﻌﻤـﻮل وب
ﻳﻚ ﺗﺼﻤﻴﻢ ﻧﺎدرﺳﺖ اﺳﺖ.
ﺟﺪاول ﻣﻮﺟﻮد در ﺑﺮﻧﺎﻣﻪ ChatRoom
ﺗﺎ اﻳﻨﺠﺎ ﺗﻘﺮﻳﺒﺎ ﺑﺎ ﺷﻜﻞ ﻛﻠﻲ ﺑﺮﻧﺎﻣﻪ آﺷﻨﺎ ﺷﺪﻳﺪ اﻣﺎ ﻣﺮﺣﻠﻪ ﺑﻌﺪ اﻳﺠﺎد ﺟﺪول ﻫﺎي ﻣﻮرد ﻧﻴﺎز ﺑﺮاي اﻳﻦ ﺑﺮﻧﺎﻣـﻪ اﺳـﺖ .ﺑـﺎ
ﻧﮕﺎﻫﻲ ﺑﻪ ﻣﻄﺎﻟﺐ ﺑﺎﻻ ﻣﻲ ﺗﻮان ﻣﺘﻮﺟﻪ ﺷﺪ ﻛﻪ ﻧﻴﺎز ﺑﻪ ﺟﺪوﻟﻲ ﺑـﺮاي ﻧﮕﻬـﺪاري اﻃﻼﻋـﺎت ﻛـﺎرﺑﺮي از ﺟﻤﻠـﻪ ﺷﻨﺎﺳـﻪ
ﻛﺎرﺑﺮي ،ﻣﻲ ﺑﺎﺷﺪ .اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﺑﺎﻳﺪ ﻫﻨﮕﺎم اﻳﺠﺎد ﻳﻚ ﺷﻨﺎﺳﻪ ﺑﺮاي ﻛـﺎرﺑﺮ از او درﺧﻮاﺳـﺖ ﺷـﻮد و در ﺟـﺪول
ﺛﺒﺖ ﺷﻮد .اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز از ﻳﻚ ﻛﺎرﺑﺮ را ﻣﻲ ﺗﻮان ﺑﻌﻨﻮان ﻓﻴﻠﺪ ﻫﺎي ﺟﺪول در ﻧﻈﺮ ﮔﺮﻓـﺖ .ﻓﻴﻠـﺪﻫﺎي داده اي
ﻛﻪ ﺑﺮاي ﻳﻚ ﻛﺎرﺑﺮ ﺑﻄﻮر ﻣﻌﻤﻮل ﻧﻴﺎز اﺳﺖ در ﺟﺪول 7-1آورده ﺷﺪه اﺳﺖ .ﻣﺎ ﻳﻚ ﺟـﺪوﻟﻲ ﺑـﻪ ﻧـﺎم userﺑـﺎ 8
ﻓﻴﻠﺪ داده اي ﺑﺮاي ﻧﮕﻬﺪاري اﻃﻼﻋﺎت ﻛﺎرﺑﺮان در ﻧﻈﺮﮔﺮﻓﺘﻪ اﻳﻢ.
-ﻓﻴﻠﺪ IDﺷﻤﺎره ﻣﻨﺤﺼﺮ ﺑﻔﺮدي اﺳـﺖ ﻛـﻪ ﺑـﻪ ﻛـﺎرﺑﺮ در ﺟـﺪول ﺗﺨـﺼﻴﺺ داده ﻣـﻲ ﺷـﻮد .اﻳـﻦ ﻓﻴﻠـﺪ ﺑـﺼﻮرت
ﺧﻮردﻛﺎر ﻣﻘﺪار دﻫﻲ ﻣﻲ ﺷﻮد)ﺑﻌﻨﻮان ﻛﻠﻴﺪ اﺻﻠﻲ(.
-ﻓﻴﻠﺪ usernameو passwordﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻓﺮد و رﻣﺰﻋﺒﻮر در ﺳﻴﺴﺘﻢ chatﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﺑـﻪ ﻫﻨﮕـﺎم
ورود ﺑﻪ ﺳﺎﻳﺖ ﺑﻪ آن ﻫﺎ ﻧﻴﺎز ﻣﻲ ﺑﺎﺷﺪ.
ﺑﺮﻧﺎﻣﻪ chatRoom 136ﻓﺼﻞ 6
)varchar(50 senderId
)varchar(50 message
datetime date
auto_increment )int(10 *Id
ﺟﺪول 7-2ﻓﻴﻠﺪﻫﺎي ﺟﺪول ﭘﻴﺎم
ﭼﮕﻮ ﻧﮕﻲ ﭘﻴﺎده ﺳﺎزي ChatRoom
در اﻳﻦ ﻣﺮﺣﻠﻪ از ﻛﺎر ﺑﺎﻳﺪ ﺑﻪ ﻃﺮاﺣﻲ ﺑﺮﻧﺎﻣﻪ ﺑﭙﺮدازﻳﺪ .در ﻣﺮﺣﻠـﻪ اول ﺑﺎﻳـﺪ ﻋﻤﻠﻴـﺎت اﺟﺮاﻳـﻲ در ﺑﺮﻧﺎﻣـﻪ را ﺷﻨﺎﺳـﺎﻳﻲ
ﻛﻨﻴﺪ .اﻳﺠﺎد ﻳﻚ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ،ورود ﺑﻪ ﺳﺎﻳﺖ ،ارﺳﺎل ﭘﻴﺎم ،ﻣﺸﺎﻫﺪه ﻟﻴﺴﺘﻲ از ﻛﺎرﺑﺮان ﻓﻌـﺎل ،ﻣـﺸﺎﻫﺪه اﻃﻼﻋـﺎت
ﻛﺎرﺑﺮان ،درﻳﺎﻓﺖ ﭘﻴﺎم و ﺧﺮوج از ﺳﺎﻳﺖ ﻋﻤﻠﻴﺎﺗﻲ ﻫﺴﺘﻨﺪ ﻛﻪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ اﻧﺠﺎم ﻣﻲ ﮔﻴﺮﻧﺪ.
در ﻣﺮﺣﻠﻪ ﺑﻌﺪ ﺑﺎﻳﺪ ﻋﻤﻠﻴﺎت را دﺳﺘﻪ ﺑﻨﺪي ﻛﻨﻴﺪ ﺗﺎ ﺑﺪاﻧﻴﺪ در ﻫﺮ ﺻﻔﺤﻪ اي ﻛﻪ ﻃﺮاﺣﻲ ﻣﻲ ﻛﻨﻴﺪ ﭼـﻪ ﻋﻤﻠﻴـﺎﺗﻲ اﺟـﺮا
ﺷﻮد و ﺗﻌﺪاد ﺻﻔﺤﺎت ﻣﻮرد ﻧﻴﺎز ﺑﺮﻧﺎﻣﻪ ﭼﻪ ﺗﻌﺪاد اﺳﺖ .اﻳﻦ دﺳﺘﻪ ﺑﻨﺪي ،ﺑﻪ ﻣﺠﻤﻮﻋﻪ ﻋﻤﻠﻴﺎت ﻣـﺸﺎﺑﻪ و ﻳـﺎ ﻣـﺮﺗﺒﻂ ﺑـﺎ
ﻳﻜﺪﻳﮕﺮ ،ﻧﻈﺮ و ﺗﻔﻜﺮ ﻃﺮاح ﺳﺎﻳﺖ ﺑﺴﺘﮕﻲ دارد .دﺳﺘﻪ ﺑﻨﺪي ﻛﻪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺻﻮرت ﮔﺮﻓﺘﻪ ﺑﺪﻳﻦ ﺷﻜﻞ اﺳﺖ:
-1ورود ﺑﻪ ﺳﺎﻳﺖ و اﻳﺠﺎد ﻳﻚ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي.
ﺑﺮاي اﻳﻨﻜﻪ ﻛﺎرﺑﺮ ﺟﺪﻳﺪ ﻫﻨﮕﺎم ﻣﺮاﺟﻌﻪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ دﭼﺎر ﺳﺮدرﮔﻤﻲ ﻧﺸﻮد اﻳﻦ دو ﺑﺨﺶ در ﻛﻨﺎر ﻫﻢ ذﻛﺮ ﺷـﺪه اﺳـﺖ
ﺗﺎ ﻛﺎرﺑﺮ ﺑﻼﻓﺎﺻﻠﻪ ﺑﻌﺪ از اﻳﺠﺎد ﻳﻚ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﺑﺘﻮاﻧﺪ ﺑﻪ ﺳﺎﻳﺖ وارد ﺷﻮد.
-2ﻣﺠﻤﻮﻋﻪ ﻋﻤﻠﻴﺎت ارﺳﺎل ﭘﻴﺎم ،ﻣﺸﺎﻫﺪه ﻟﻴﺴﺘﻲ از ﻛـﺎرﺑﺮان ﻓﻌـﺎل ،ﻣـﺸﺎﻫﺪه اﻃﻼﻋـﺎت ﻛـﺎرﺑﺮان ،درﻳﺎﻓـﺖ ﭘﻴـﺎم و
ﺧﺮوج از ﺳﺎﻳﺖ را ﻣﻲ ﺗﻮان در ﻳﻚ دﺳﺘﻪ ﻗﺮار داد زﻳﺮا ﺑﻪ ﻧﻈﺮ ﻣﻲ رﺳﺪ ﻫﻤﻪ ي اﻳﻦ ﻋﻤﻠﻴﺎت ﺑﺎﻳـﺪ در ﻳـﻚ ﺻـﻔﺤﻪ
ﻗﺮار ﺑﮕﻴﺮﻧﺪ اﻣﺎ ﺑﺮﺧﻲ از اﻳﻦ ﻋﻤﻠﻴﺎت ﻣﺎﻧﻨﺪ ﻧﻤﺎﻳﺶ ﻟﻴﺴﺖ ﻛﺎرﺑﺮان ﻓﻌﺎل ﻣﺮﺗﺒﻂ ﺑﺎ ﻧﻤﺎﻳﺶ ﭘﻴﺎم ﻫﺎ ﻧﻴﺴﺖ .در اﻳﻦ ﻣﻮرد
ﻫﻨﮕﺎم ﭘﻴﺎده ﺳﺎزي ﺑﻴﺸﺘﺮ ﺑﺤﺚ ﻣﻲ ﻛﻨﻴﻢ.
ﺻﻔﺤﻪLogin.html
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﺑﻴﺎن ﺷﺪ ﻫﺮ دﺳﺘﻪ از ﻋﻤﻠﻴﺎت ﻣﻨﺠﺮ ﺑﻪ ﻃﺮاﺣﻲ ﻳﻚ ﺻﻔﺤﻪ وب ﻣﻲ ﺷـﻮﻧﺪ در ﻧﺘﻴﺠـﻪ ﺑـﺮاي دﺳـﺘﻪ اول
ﻳﻚ ﺻﻔﺤﻪ ورود ﺑﻪ ﺳﺎﻳﺖ ﺑﺎ ﻧﺎم login.htmlاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﺻﻔﺤﻪ داراي دو ﺑﺨﺶ اﺳﺖ:
signup -ﺑﺨﺶ اﻳﺠﺎد ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﺑﺮاي ﻛﺴﺎﻧﻲ ﻛﻪ usernameﻧﺪارﻧﺪ.
signon -ﺑﺨﺶ ورود ﺑﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺮاي ﻛﺎرﺑﺮاﻧﻲ ﻛﻪ داراي usernameﻣﻲ ﺑﺎﺷﻨﺪ.
ﺑﺮﻧﺎﻣﻪ chatRoom 138ﻓﺼﻞ 6
در ﺷﻜﻞ ،7-1ﻧﻤﺎي از ﻃﺮاﺣﻲ اﻳﻦ ﺻﻔﺤﻪ را ﻣﺸﺎﻫﺪه ﻣﻲ ﻧﻤﺎﻳﺪ .اﻳﻦ ﺻﻔﺤﻪ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻃﺮاﺣﻲ ﺷﻤﺎ ﻣﺘﻔﺎوت ﭘﻴـﺎده
ﺳﺎزي ﺷﻮد.
در اﻳﻦ ﻗﺴﻤﺖ ﺑﻪ ﻧﻮﺷﺘﻦ ﻛﺪﻫﺎي ﻣﻮرد ﻧﻴﺎز اﻳﻦ ﺑﺨﺶ ﻫﺎ ﻣﻲ ﭘﺮدازﻳﻢ .ﻛﺎرﺑﺮ در ﺻﻮرت ﻧﺪا ﺷـﺘﻦ usernameﺑـﺎ
وارد ﻛﺮدن اﻃﻼﻋﺎت ﺷﺨﺼﻲ ﺧﻮد و signupﻛﺮدن ﻣﻲ ﺗﻮاﻧﺪ ﻳﻚ usernameﺑـﺮاي ﺧـﻮد اﻳﺠـﺎد ﻛﻨـﺪ .ﺑـﺎ
ﻓﺸﺮده ﺷﺪن دﻛﻤﻪ signupﺑﺎﻳﺪ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﺑﻪ ﺟﺪول userاﺿﺎﻓﻪ ﺷﻮد .ﭘﺲ ﺑﺎ ﻓﺸﺮدن دﻛﻤـﻪ signup
ﺑﺎﻳﺪ ﻋﻤﻠﻴﺎﺗﻲ اﻧﺠﺎم ﮔﻴﺮد ﻛﻪ ﻣﺎ اﺟﺮاي آن ﻋﻤﻠﻴﺎت را ﺑﺎ اﺟﺮاي ﺗﺎﺑﻊ )( signUpﻣﺤﻘﻖ ﻣﻲ ﺳﺎزﻳﻢ اﻣﺎ ﻣﺮﺣﻠﻪ ﺑﻌـﺪ
ﺑﺎﻳﺪ ﺗﺼﻤﻴﻢ ﺑﮕﻴﺮﻳﻢ اﻳﻦ ﺗﺎﺑﻊ ﭼﻪ ﻋﻤﻠﻴﺎﺗﻲ را ﺑﺮاي ﻣﺎ اﻧﺠﺎم دﻫﺪ .در اﻳﻨﺠﺎ ﻣﺎ ﻗﺼﺪ دارﻳﻢ اﻃﻼﻋﺎت ﻛﺎرﺑﺮان ﺑـﺼﻮرت
Ajaxﺑﻪ ﺳﺮور ارﺳﺎل ﺷﻮد ﺗﺎ آن ﺟﺎ اﻳﻦ اﻃﻼﻋﺎت ﺑﻪ ﺟﺪول ﻛﺎرﺑﺮان اﺿﺎﻓﻪ ﮔﺮدد .ﺑﺮاي ارﺳﺎل اﻃﻼﻋﺎت ﺑﻪ ﺳﺮور
در ﺗﻤﺎم ﻃﻮل اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻣﺘﺪ GETاﺳﺘﻔﺎده ﻣﻲ ﺷﻮد .اﺑﺘـﺪا ﻣﻘـﺎدﻳﺮ داده اي درون ﻓـﺮم ﺛﺒـﺖ ﻧـﺎم را ﺑـﻪ ﻣﺘﻐﻴﺮﻫـﺎي
ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﻧﺘﺴﺎب ﻣﻲ دﻫﻴﻢ .ﺑﻪ ﻫﺮ ﻋﻨﺼﺮ ﺑﺮ روي ﺻﻔﺤﻪ ﻳـﻚ Idﻧـﺴﺒﺖ ﻣـﻲ دﻫـﻴﻢ ﺗـﺎ ﺑﺘـﻮاﻧﻴﻢ ﺑـﺎ اﺳـﺘﻔﺎده از
دﺳﺘﻮر document.getElementById(id).valueﺑﻪ ﻣﻘﺪار آن ﻋﻨﺼﺮ دﺳﺘﺮﺳﻲ داﺷﺘﻪ ﺑﺎﺷﻴﻢ.
ﻫﻤﺎن ﻃﻮر ﻛﻪ ﮔﻔﺘﻪ ﺷﺪ در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از ﻣﺘﺪ GETﺑﺮاي ارﺳﺎل اﻃﻼﻋﺎت ﺑﻪ ﺳﻤﺖ ﺳﺮور اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ﺑﻪ ﻫﻤـﻴﻦ
ﺧﺎﻃﺮ ﺑﺎﻳﺪ ﺑﻪ ﻧﺎم ﺻﻔﺤﻪ اي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ در ﺳﻤﺖ ﺳﺮور اﺟﺮا ﺷﻮد اﻳﻦ اﻃﻼﻋﺎت را اﺿﺎﻓﻪ ﻛﻨـﻴﻢ در ﻧﺘﻴﺠـﻪ ﻳـﻚ
رﺷﺘﻪ ﺑﻪ ﻧﺎم sndﺑﺎ ﻣﻘﺎدﻳﺮ ﻣﺘﻐﻴﺮﻫﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ.
var snd = '?textSignupUserName=' + textSignupUserName
+'&textName=' + textName + '&textLastName=' +
textLastName +'&signupPassword=' + signupPassword
'=+'&textAge=' + textAge + '&selectGender
;+ selectGender +'&textAge=' + textAge
در ﻧﻈﺮ ﺑﮕﻴﺮﻳﺪ ﻛﻪ ﺑﺮاي ارﺳﺎل اﻃﻼﻋﺎت ﺑـﻪ ﺳـﺮور و درﻳﺎﻓـﺖ ﺟـﻮاب از ﺳـﺮور ﺑـﺎ اﺳـﺘﻔﺎده از روش Ajaxﻳـﻚ
ﻛﻼس ﺑﻪ ﻧﺎم Asynchronousﻧﻮﺷﺘﻪ اﻳﻢ .از ﻛﻼس Asynchronousﻳﻚ ﺷﻲ اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ و ﺻـﻔﺤﻪ
ﻣﻮرد ﻧﻈﺮ در ﺳﺮور را ﺑﻪ ﻫﻤﺮاه آن رﺷﺘﻪ ﺗﻮﻟﻴﺪي در ﻗﺴﻤﺖ ﻗﺒﻞ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﻢ.
;)(Asynchronous = new Asynchronous
ﻣﺘﺪي در اﻳﻦ ﻛﻼس ﺑﺮاي ﻓﺮاﺧﻮاﻧﻲ ﺻﻔﺤﻪ از ﺳﻤﺖ ﺳﺮور ﺑﻪ ﻧﺎم callﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ .ﻣﺘﺪ callﺑـﺮاي اﺷـﻴﺎ
ﻛﻼس داراي ﺳﻪ ﭘﺎراﻣﺘﺮ اﺳﺖ ﻛﻪ ﭘﺎراﻣﺘﺮ اول آن ﻧﺎم ﺻﻔﺤﻪ ي اﺳﺖ ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ در ﺳـﻤﺖ ﺳـﺮور اﺟـﺮا ﺷـﻮد
ﭘﺎراﻣﺘﺮ دوم ﻳﻚ ﻣﻘﺪار ﺗﻬﻲ اﺳﺖ و ﭘﺎراﻣﺘﺮ ﺳﻮم ﻧﺎم روش ارﺳﺎل اﻃﻼﻋﺎت ﺑﻪ ﺳﺮور ﻣﻲ ﺑﺎﺷﺪ.
;)'Asynchronous.call('SignUp.php'+snd,'','GET
}
در اﻳﻦ ﺟﺎ ﺑﻬﺘﺮ اﺳﺖ ﻛﻼس Asynchronousرا ﺑﺮرﺳﻲ ﻛﻨﻴﻢ .ﻛﻼس Asynchronousﻛﻼﺳﻲ اﺳﺖ ﻛﻪ
در ﺟﺎوااﺳﻜﺮﻳﭙﺖ ﺗﻌﺮﻳﻒ ﻣﻲ ﺷﻮد و ﺗﻮاﺑﻊ ﻻزم ﺑﺮاي ﻛﺎر ﺑﺎ ﺷﻲ XmlHttpRequestرا درﻛﻨﺎر ﻫﻢ ﻗﺮار ﻣـﻲ
دﻫﺪ اﻳﻦ ﻛﻼس را در ﻳﻚ ﻓﺎﻳﻞ دﻳﮕﺮ ﺑﻪ ﻧﺎم Asynchronous.jsﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ .ﺑﺮاي ﺗﻌﺮﻳﻒ ﻛﻼس در
ﺟﺎوااﺳﻜﺮﻳﭙﺖ اﺑﺘﺪا ﻳﻚ ﺗﺎﺑﻊ ﺑﺎ ﻧﺎم ﻛﻼس ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ .اﻳﻦ ﺗﺎﺑﻊ در واﻗﻊ ﺳﺎزﻧﺪه ﻛﻼس اﺳﺖ.
{ ) (function Asynchronous
//...
}
ﺑﺮاي ﺗﻌﺮﻳﻒ ﻣﺘﺪ ﻫﺎ ي ﻛﻼس از ﻛﻠﻤﻪ prototypeاﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ ﺑﺪﻳﻦ ﺻﻮرت:
;ﻧﺎم ﻳﻚ ﺗﺎﺑﻊ = ﻧﺎم ﻣﺘﺪ.prototype.ﻧﺎم ﻛﻼس
ﻣﺘﺪ ﻛﻼس را ﺑﻪ ﻧﺎم ﻳﻚ ﺗﺎﺑﻊ ﻧﺴﺒﺖ ﻣﻲ دﻫﻴﻢ ﻛﻪ درﻧﺘﻴﺠﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﺘﺪ ﻣﻮﺟﺐ ﻓﺮاﺧﻮاﻧﻲ آن ﺗﺎﺑﻊ ﻣﻲ ﺷﻮد.
اﻳﻦ ﺗﻌﺮﻳﻒ ﻫﺎ ﺧﺎرج از ﺗﺎﺑﻊ ﺳﺎزﻧﺪه و ﻣﺠﺰا ﻧﻮﺷﺘﻪ ﻣﻲ ﺷﻮﻧﺪ.
ﻣﻲ ﺗﻮان ﻣﺘﺪﻫﺎ را ﺑﺼﻮرت دﻳﮕﺮ ﻧﻴﺰ ﺗﻌﺮﻳﻒ ﻛﺮد ،ﻣﺘﺪﻫﺎ را ﺑﺪون ﻛﻠﻤﻪ prototypeدر داﺧﻞ ﺳـﺎزﻧﺪه ﻛـﻼس
ﺑﻪ ﻧﺎم ﻳﻚ ﺗﺎﺑﻊ ﻧﺴﺒﺖ داد اﻣﺎ ﺗﻔﺎوﺗﻲ ﺑﻴﻦ اﻳﻦ دو روش اﺳﺖ .در روش اول ﻣﺘﺪﻫﺎي ﻛﻼس ﺑﺼﻮرت ﻣﺸﺘﺮك ﺑـﺮاي
ﺗﻤﺎم ﻧﻤﻮﻧﻪ ﻫﺎي ﻛﻼس اﺳﺘﻔﺎده ﻣﻲ ﺷﻮﻧﺪ اﻣﺎ در روش دوم ﻫﺮ ﻧﻤﻮﻧﻪ ﻛﻼس از ﻫﺮ ﺗﺎﺑﻊ ﻣـﺮﺗﺒﻂ ﺑـﻪ اﻳـﻦ ﻣﺘـﺪﻫﺎ ﻳـﻚ
ﻛﭙﻲ ﻣﻲ ﮔﻴﺮد .در اﻳﻦ ﻛﻼس ﻣﺎ 5ﺗﺎ ﻣﺘﺪ ﺑﺪﻳﻦ ﺷﻜﻞ ﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ.
ﺑﺮﻧﺎﻣﻪ chatRoom 140ﻓﺼﻞ 6
;Asynchronous.prototype.loading = Asynchronous_loading
;Asynchronous.prototype.loaded = Asynchronous_loaded
;Asynchronous.prototype.interactive = Asynchronous_interactive
;Asynchronous.prototype.complete = Asynchronous_complete
;Asynchronous.prototype.call = Asynchronous_call
ﻣﺘﺪ completeرا ﺑﺎ ﻳﻚ ﺗﺎﺑﻌﻲ ﻣﺮﺗﺒﻂ ﻣﻲ ﺳﺎزﻳﻢ ﻛﻪ داراي ﭼﻬﺎر ﺗﺎ ﭘﺎراﻣﺘﺮ اﺳﺖ .اﻳﻦ ﻣﺘﺪ زﻣﺎﻧﻲ اﺟﺮا ﻣﻲ ﺷـﻮد
و ﻣﻮﺟﺐ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ ﻣﺮﺗﺒﻂ ﺑﻪ ﺧﻮد ﻣﻲ ﺷﻮد ﻛﻪ درﺧﻮاﺳﺖ در ﺳﺮور اﺟﺮا ﺷﺪه ﺑﺎﺷﺪ و اﻃﻼﻋﺎت ﺑﺮاي ﻛﻼﻳﻨﺖ
ارﺳﺎل ﺷﻮد .در ﺳﺎزﻧﺪه ﻛﻼس ﻳﻚ ﻋﻀﻮ داده اي ﺑﻪ ﻧﺎم _xmlhttpﺗﻌﺮﻳﻒ ﻣﻲ ﻛﻨﻴﻢ ﻛﻪ ﺑﻪ ﻳﻚ ﻧﻤﻮﻧـﻪ از ﺷـﻲ
XMLHttpRequestﻧﺴﺒﺖ داده ﻣﻲ ﺷﻮد .ﻻزم ﺑﺬﻛﺮ اﺳﺖ ﻛـﻪ ﺑـﺮاي دﺳﺘﺮﺳـﻲ ﺑـﻪ اﻋـﻀﺎي داده اي در ﻳـﻚ
ﻛﻼس ﺑﺎﻳﺪ از ﻛﻠﻤﻪ ﻛﻠﻴﺪي thisاﺳﺘﻔﺎده ﺷﻮد.
) (function Asynchronous
{
;)(this._xmlhttp = new XmlHttpRequest
}
function XmlHttpRequest()
{
if(window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
var msxmls = new Array(
'Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0',
'Msxml2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i = 0; i < msxmls.length; i++)
{
try
{
return new ActiveXObject(msxmls[i]);
} catch (e)
{
}
}
}
throw new Error("Could not instantiate XMLHttpRequest");
}
ﺑﻌــﺪ از ﻓﺮاﺧــﻮاﻧﻲ اﻳــﻦ ﻣﺘــﺪ ﺗــﺎﺑﻊ. ﺑــﺮاي اﻳﺠــﺎد ﻳــﻚ درﺧﻮاﺳــﺖ در ﺳــﻤﺖ ﻛﻼﻳﻨــﺖ ﻣــﻲ ﺑﺎﺷــﺪcall ﻣﺘــﺪ
Asynchronous ﺑﺮاي اﻳﻨﻜﻪ ﻧﻤﻮﻧﻪ ﻫﺎي ﻣﺘﻌـﺪد از ﻛـﻼس. ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮدAsynchronous_call
ﺗﻌﺮﻳﻒ ﻛﺮدﻳﻢ ﻛﻪ ﺑﻪ ﺷﻲ ﺟﺎري ﻣـﺮﺗﺒﻂ ﻣـﻲ ﺷـﻮد درinstance ﺑﺘﻮاﻧﻨﺪ ﺑﺎ ﻳﻜﺪﻳﮕﺮ ﻛﺎر ﻛﻨﻨﺪ ﻳﻚ ﻣﺘﻐﻴﺮ ﺑﻪ ﻧﺎم
. ﺟﺪاﮔﺎﻧﻪ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮدAsynchronous_call ﺗﺎﺑﻊ،اﻳﻦ ﺻﻮرت ﺑﺮاي درﺧﻮاﺳﺖ ﻫﺎي ﻣﺘﻔﺎوت
function Asynchronous_call(url,send,method)
{
var instance = this;
this._xmlhttp.open(method, url, true);
this._xmlhttp.onreadystatechange = function()
{
switch(instance._xmlhttp.readyState)
{
case 1:
instance.loading();
break;
case 2:
instance.loaded();
ﺑﺮﻧﺎﻣﻪ chatRoom 142ﻓﺼﻞ 6
;break
case 3:
;)(instance.interactive
;break
case 4:
{try
instance.complete(instance._xmlhttp.status,
instance._xmlhttp.statusText,
instance._xmlhttp.responseText,
;)instance._xmlhttp.responseXML
{)}catch(e
;) ''instance.complete('','','Error',
;}break
}
}
;)this._xmlhttp.send(send
}
ﺑﺮاي اﺳﺘﻔﺎده از ﻛﻼس Asynchronousﺑﺎﻳﺪ اﻳﻦ ﻛﻼس ﺑﻪ ﺻﻔﺤﻪ وب اﺿﺎﻓﻪ ﮔﺮدد اﻳﻦ ﻋﻤﻠﻴﺎت را ﺑﺎ دﺳـﺘﻮر
زﻳﺮ اﻧﺠﺎم ﻣﻲ دﻫﻴﻢ.
"<script type="text/javascript
>src="Java_script/Asynchronous.js"></script
رﺷﺘﻪ sndﺑﻪ ﻧﺎم ﺻﻔﺤﻪ ﻣﻮرد ﻧﻈﺮ اﻟﺤـﺎق ﻣـﻲ ﺷـﻮد .ﺑﻌـﺪ از ﻓﺮاﺧـﻮاﻧﻲ ﺻـﻔﺤﻪ signUp.phpﺗﻮﺳـﻂ دﺳـﺘﻮر
)' asynchronous.call('SignUp.php'+snd,'','GETاﻃﻼﻋﺎت ﻛـﺎرﺑﺮ ﺑـﻪ ﺳـﺮور و اﻳـﻦ
ﺻﻔﺤﻪ ارﺳﺎل ﻣﻲ ﺷﻮد .در اﻳﻦ ﺻﻔﺤﻪ ﻣﺎ ﺑﺎﻳﺪ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ را درﻳﺎﻓﺖ و ﺑﻌﺪ از اﻳﻨﻜﻪ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﭼـﻚ ﺷـﺪ
ﻛﻪ ﺗﻜﺮاري ﻧﺒﺎﺷﺪ ﺑﻪ ﺟﺪول userاﺿﺎﻓﻪ ﺷﻮد .در اﻳﻦ ﺟﺎ ﺑﻪ ﺑﺮرﺳﻲ ﻛﺪ ﺻﻔﺤﻪ signup.phpﻣﻲ ﭘﺮدازﻳﻢ.
<?php
در اﻳﻦ ﻗﺴﻤﺖ اﻃﻼﻋـﺎت ﻛـﺎرﺑﺮ ﻛـﻪ از ﺳـﻤﺖ ﻛﻼﻳﻨـﺖ ارﺳـﺎل ﺷـﺪه ،درﻳﺎﻓـﺖ ﻣـﻲ ﺷـﻮد و در ﻣﺘﻐﻴﺮﻫـﺎي ﻣـﺮﺗﺒﻂ
ﻧﮕﻬﺪاري ﻣﻲ ﺷﻮد.
;]'$UserName=$_GET['textSignupUserName
;]'$FirstName =$_GET['textName
;]'$LastName =$_GET['textLastName
;]'$Password =$_GET['signupPassword
;]'$Age =$_GET['textAge
;]'$Gender =$_GET['selectGender
دﺳـﺘﻮر )''mysql_connect('localhost','root', ﻣﺮﺣﻠﻪ ﺑﻌﺪ اﺗﺼﺎل ﺑﻪ ﺑﺎﻧﻚ اﻃﻼﻋـﺎﺗﻲ اﺳـﺖ ﻛـﻪ ﺑـﺎ
اﻧﺠﺎم ﻣﻲ ﺷﻮد .ﭘﺎراﻣﺘﺮ اول اﻳﻦ دﺳﺘﻮر آدرس ﺳﺮوﻳﺲ دﻫﻨﺪه وب اﺳﺖ ﭘﺎراﻣﺘﺮ دوم ﻧﺎم ﻛـﺎرﺑﺮي ﺑـﺮاي اﺗـﺼﺎل ﺑـﻪ
ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ و ﭘﺎراﻣﺘﺮ ﺳﻮم اﻳﻦ دﺳﺘﻮر رﻣﺰ ﻋﺒﻮر ﺑﺮاي اﺗﺼﺎل ﻣﻲ ﺑﺎﺷﺪ.
ﻓﺼﻞ 143 6 ﺑﺮﻧﺎﻣﻪ chatRoom
ﺑﻌﺪ از اﺗﺼﺎل ﺑﻪ ﺳﺮور ﺑﺎﻳﺪ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﻣﻮرد ﻧﻈﺮ را اﻧﺘﺨﺎب ﻛﻨﻴﻢ.
;)mysql_select_db('chatroom',$link
در اﻳﻦ ﻣﺮﺣﻠﻪ ﻳﻚ دﺳﺘﻮر ﭘﺮس و ﺟﻮ ﺑﺮاي ﺑﺮرﺳﻲ ﺗﻜﺮاري ﻧﺒﻮدن ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻣﻲ ﻧﻮﻳﺴﻴﻢ.
// search for Duplicate userName.
;"'$cmd = "Select id from User where UserName='$UserName
'$q.="'$UserName','$FirstName','$LastName','$Password
;")',$Age,'$Gender
;)$res = mysql_query($q,$link
)if (!$res
اﮔﺮ ﺧﻄﺎﻳﻲ ﺣﻴﻦ اﺟﺮاي دﺳﺘﻮر insertرخ دﻫﺪ دﺳﺘﻮر)( echo mysql_errorﺗﻮﺿـﻴﺤﺎت ﺧﻄـﺎ را
ﺑﺮ روي ﺻﻔﺤﻪ وب ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
;)(echo mysql_error
else
;echo 200
;)mysql_close($link
>?
chatRoom ﺑﺮﻧﺎﻣﻪ 6 ﻓﺼﻞ 144
ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮرات ﻗﺒﻞ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﺑﻪ ﺟـﺪول ﻛـﺎرﺑﺮان اﺿـﺎﻓﻪ ﺷـﺪ اﻣـﺎ ﻣـﺪﻳﺮﻳﺘﻲ ﺑـﺮاي ﺻـﺤﺖ اﻃﻼﻋـﺎت
ﭘـﺲ. ﺑﺎﻳـﺪ ﻋـﺪد ﺑﺎﺷـﺪage ﺑﺎﺷﺪ و ﻳﺎ اﻳﻨﻜﻪ ﻓﻴﻠـﺪemail ﺑﺼﻮرت ﻳﻚ آدرسemail ﻧﺪاﺷﺘﻴﻢ ﻣﺜﻼ اﻳﻨﻜﻪ ﻓﻴﻠﺪ
در ﻗﺴﻤﺖ دﻳﮕﺮ ﺑﺮﻧﺎﻣﻪ ﻣﻜﺎﻧﻲ ﺑﺮاي ورود. اﺣﺴﺎس ﻣﻲ ﺷﻮد،ﻧﻴﺎز ﺑﻪ ﻗﺴﻤﺖ ﻛﺪي ﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺑﺮ روي اﻳﻦ ﻓﻴﻠﺪﻫﺎ
واردchatroom ﻛﺎرﺑﺮ ﺑﺎ ﺗﺎﻳﭗ ﻛﺮدن ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي و رﻣﺰ ﻋﺒﻮر ﺧﻮد ﻣﻲ ﺧﻮاﻫﺪ ﺑﻪ ﺑﺮﻧﺎﻣﻪ.ﺑﻪ ﺳﺎﻳﺖ ﻗﺮار دارد
اﻳـﻦ ﺗـﺎﺑﻊ. در ﻧﺘﻴﺠﻪ ﻧﻴﺎز ﺑﻪ ﺗﺎﺑﻌﻲ ﺑﺮاي ارﺳﺎل اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﺑﻪ ﺳﺮور ﺑﺮاي ﺑﺮرﺳﻲ ﺻﺤﺖ اﻃﻼﻋـﺎت دارﻳـﻢ.ﺷﻮد
. ارﺳﺎل ﻣﻲ ﻛﻨﺪSignOn.php اﻃﻼﻋﺎت وارد ﺷﺪه ﺗﻮﺳﻂ ﻛﺎرﺑﺮ را ﺑﻪ ﺻﻔﺤﻪ
function signOn(e){
if (responseText == '200'){
window.location.href = "./HomePage.html";
}
else{
textSignupUserName.parentNode.insertBefore(
errorMsg, textSignupUserName );
textSignupUserName.parentNode.insertBefore(
errorMsg, textSignupUserName );
}
}
ﻓﺼﻞ 145 6 ﺑﺮﻧﺎﻣﻪ chatRoom
ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن دﻛﻤﻪ loginﺻﻔﺤﻪ signon.phpﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷـﻮد .در اﻳـﻦ ﺻـﻔﺤﻪ اﺑﺘـﺪا ﺟـﺴﺘﺠﻮ ﻣـﻲ
ﺷﻮد ﻛﻪ ﻛﺎرﺑﺮي ﺑﺎ usernameو passwordوارد ﺷﺪه دارﻳﻢ ،ﻛﻪ ﺑﻪ ﺳﺎﻳﺖ وارد ﻧﺸﺪه اﺳـﺖ .در اﻳﻨـﺼﻮرت
sessionرا اﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ و ﻣﺘﻐﻴﺮ آن را ﺑﻪ Usernameاﻧﺘﺴﺎب ﻣﻲ دﻫﻴﻢ:
<?php
;]'$UserName=$_GET['textUserName
;]'$Password =$_GET['signOnPassword
;)''$link = mysql_connect('localhost' ,'root',
;)mysql_select_db('chatroom',$link
ﻳﻚ ﭘﺮس و ﺟﻮ ﺑﺮاي اﻳﻨﻜﻪ ﺑـﺪاﻧﻴﻢ ﻛـﺎرﺑﺮي ﺑـﺎ ﻣﺸﺨـﺼﺎت وارد ﺷـﺪه وﺟـﻮد دارد در ﺣﺎﻟﻴﻜـﻪ ﻓﻌـﺎل ﻧﺒﺎﺷـﺪ ﻳﻌﻨـﻲ
Status=0ﺑﺎﺷﺪ.
// search for Valid userName & PassWord.
$cmd = " Select id,userName from user where
'UserName='$UserName' and Password='$Password
;"and Status=0
;)$res = mysql_query($cmd,$link
;)$r=mysql_fetch_array($res
) if( mysql_num_rows($res)==0
{
;"echo "Invalid Username & Password
;)(exit
}
Sessionرا ﺑﺎز ﻣﻲ ﻛﻨﻴﻢ و ﻣﺘﻐﻴﺮ Sessionرا ﺑﺎ ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﻣﻘﺪار ﻣﻲ دﻫﻴﻢ.
;)(Session_start
;]$_SESSION['UserName'] = $r[1
وﺿﻌﻴﺖ ﻛﺎرﺑﺮ ﻫﻨﮕﺎم ورود ﺑﻪ ﺳﺎﻳﺖ از ﺣﺎﻟﺖ ﻏﻴﺮ ﻓﻌﺎل ﺑﻪ ﻓﻌﺎل ﺗﻐﻴﻴﺮ ﻣﻲ ﻛﻨﺪ ﻳﻌﻨﻲ ﻓﻴﻠﺪ statusرا 1ﻣﻲ ﻛﻨﻴﻢ.
$q = "update User set status=1 where
;" 'UserName='$UserName
;)$updateRes = mysql_query($q,$link
;'echo '200
;)mysql_close($link
>?
در اﻳﻦ ﺟﺎ ﻃﺮاﺣﻲ و ﭘﻴﺎده ﺳﺎزي دﺳﺘﻪ اول ﺑﻪ ﭘﺎﻳﺎن رﺳﻴﺪ اﻣﺎ ﻫﻤﺎن ﻃـﻮر ﻛـﻪ ﻗـﺒﻼ اﺷـﺎره ﻛـﺮدﻳﻢ دﺳـﺘﻪ دوم ﺷـﺎﻣﻞ
ﻣﺠﻤﻮﻋﻪ ﻋﻤﻠﻴﺎت ارﺳﺎل ﭘﻴﺎم ،ﻣﺸﺎﻫﺪه ﻟﻴﺴﺘﻲ از ﻛﺎرﺑﺮان ﻓﻌﺎل ،ﻣﺸﺎﻫﺪه اﻃﻼﻋﺎت ﻛﺎرﺑﺮان ،درﻳﺎﻓﺖ ﭘﻴﺎم و ﺧﺮوج از
ﺳﺎﻳﺖ ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﻋﻤﻠﻴﺎت ﺑﻄﻮر ﻣﺠﺰاي ﺑﺎﻳﺪ اﺟﺮا ﺷﻮﻧﺪ وﻟﻲ ﻣﺠﻤﻮﻋﻪ اﻳﻦ ﻋﻤﻠﻴﺎت ﺑﺎﻳﺪ ﻗﺎﺑﻞ دﺳﺘﺮس ﺑـﻪ آﺳـﺎﻧﻲ
ﺑﺮاي ﻛﺎرﺑﺮان ﺑﺎﺷﺪ .ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ ﻫﺮ ﻋﻤﻠﻴﺎت را ﺑﻄﻮر ﺟﺪاﮔﺎﻧﻪ ي اﺟﺮا ﻛﻨـﻴﻢ و ﺗﻤـﺎﻣﻲ ﻣﺠﻤﻮﻋـﻪ ﻋﻤﻠﻴـﺎت در
ﺑﺮﻧﺎﻣﻪ chatRoom 146ﻓﺼﻞ 6
ﻳﻚ ﺻﻔﺤﻪ ﻗﺎﺑﻞ دﺳﺘﺮس ﺑﺎﺷﺪ ﺑﺎﻳﺪ ﺑﺘﻮاﻧﻴﻢ ﺻﻔﺤﻪ را ﺑﻪ ﭼﻨﺪ ﺑﺨﺶ ﺗﻘﺴﻴﻢ ﻛﻨـﻴﻢ ﻛـﻪ ﻫـﺮ ﺑﺨـﺶ ﻳـﻚ ﺻـﻔﺤﻪ وب
ﺟﺪاﮔﺎﻧﻪ اي ﺑﺎﺷﺪ.
ﺑﺮاي ﻋﻤﻠﻲ ﻛﺮدن اﻳـﻦ اﻳـﺪه در htmlاز > <iframeاﺳـﺘﻔﺎده ﻣـﻲ ﻛﻨـﻴﻢ <iframe> .ﺑـﺮاي ﻧﻤـﺎﻳﺶ ﻳـﻚ
ﺻﻔﺤﻪ ﺑﻌﻨﻮان ﺑﺨﺸﻲ در ﻳﻚ ﺻﻔﺤﻪ دﻳﮕﺮ اﺳﺘﻔﺎده ﻣﻲ ﺷـﻮد .از > <iframeزﻣـﺎﻧﻲ اﺳـﺘﻔﺎده ﻣـﻲ ﺷـﻮد ﻛـﻪ ﻣـﻲ
ﺧﻮاﻫﻴﻢ ﻃﺮح ﻛﻠـﻲ ﺳـﺎﻳﺖ ﺛﺎﺑـﺖ ﺑﺎﺷـﺪ و ﺗﻐﻴﻴﺮاﺗـﻲ در ﺑﺨـﺸﻲ از ﺳـﺎﻳﺖ ﻫـﺮ زﻣـﺎن ﻛـﻪ ﻧﻴـﺎز ﺑﺎﺷـﺪ روي دﻫـﺪ .ﺑـﺎ
> <iframeﻣﻲ ﺗﻮان ﻋﻤﻠﻴﺎﺗﻲ ﻛـﻪ ﻣﺠـﺰا ﺑﺎﺷـﻨﺪ ﺑـﺎ Ajaxرا در ﺻـﻔﺤﺎت ﻣﺘﻔـﺎوت ﻗـﺮار داد .ﺗـﮓ iframe
داراي ﺧﺎﺻﻴﺘﻲ ﺑﻪ ﻧﺎم srcاﺳﺖ ﻛﻪ در آن ﻣﺴﻴﺮ ﺻﻔﺤﻪ اي ﻛﻪ ﻣـﻲ ﺧـﻮاﻫﻴﻢ در iframeﻧﻤـﺎﻳﺶ داده ﺷـﻮد را
ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﻴﻢ.
ﺻﻔﺤﻪ homepage.html
در ﻗــﺴﻤﺖ titleاﻳــﻦ ﺻــﻔﺤﻪ ﺷﻨﺎﺳــﻪ ﻛــﺎرﺑﺮي ،ﻛــﺎرﺑﺮ وارد ﺷــﺪه ﺑــﻪ ﺳــﺎﻳﺖ ﻧﻤــﺎﻳﺶ داده ﻣــﻲ ﺷــﻮد .ﺗــﺎﺑﻊ
setTitleﺑﻌﺪ از ﻓﺮاﺧﻮاﻧﻲ ﺻﻔﺤﻪ GetInfo.phpﻋﻨﻮان ﺻﻔﺤﻪ homepage.htmlرا ﺗﻐﻴﻴﺮ ﻣﻲ دﻫﺪ.
{)(function setTitle
;)(asynchronous = new Asynchronous
ﻣﺘﺪ completeزﻣﺎﻧﻲ اﺟﺮا ﻣﻲ ﺷﻮد ﻛﻪ اﻃﻼﻋﺎت از ﺳﺮور درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد .اﻃﻼﻋﺎت درﻳﺎﻓﺖ ﺷـﺪه از ﺳـﺮور
در ﭘﺎراﻣﺘﺮ responseTextﺗﺎﺑﻊ ﻣﺮﺗﺒﻂ ﺑﻪ آن ﻗﺮار ﻣﻲ ﮔﻴﺮد ﻛﻪ ﺣﺎوي usernameﻛﺎرﺑﺮ ﻣﻲ ﺑﺎﺷـﺪ ﻛـﻪ ﻣـﺎ
آن را ﺑﻪ رﺷﺘﻪ اي ﺑﺮاي ﻧﻤﺎﻳﺶ در ﻋﻨﻮان ﺳﺎﻳﺖ اﺿﺎﻓﻪ ﻣﻲ ﻛﻨﻴﻢ.
Asynchronous.complete = function(status, statusText,
{)responseText, responseXML
)if (responseText!=0
document.title= "Welcome "+responseText
else
;)"location.href("login.html
;}
;)'asynchronous.call('GetInfo.php','','GET
}
در ﺻـﻔﺤﻪ GetInfo.phpﺑﻌــﺪ از ﺑﺮرﺳــﻲ ﻣﻮﺟــﻮد ﺑــﻮدن ﺷﻨﺎﺳــﻪ ﻛــﺎرﺑﺮي ) (usernameدر ،session
ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ﺑﺮاي ﻛﻼﻳﻨﺖ ﺑﺎ اﺳﺘﻔﺎده از دﺳﺘﻮر echoارﺳﺎل ﻣﻲ ﺷﻮد.
<?php
;)(session_start
))]'if(isset($_SESSION['UserName
;]'echo $_SESSION['UserName
else
; 'echo '0
>?
ﺻﻔﺤﻪ homepage.htmlﺷﺎﻣﻞ دو ﻗﺴﻤﺖ اﺳﺖ ﻛﻪ ﻫﺮ ﻗﺴﻤﺖ ﻳﻚ > <iframeﻣﻲ ﺑﺎﺷﺪ.
messagebox.html ﺻﻔﺤﻪ
ﻳﻚ ﺻﻔﺤﻪ ﺣﺎوي ﻳﻚ ﻗﺴﻤﺖ ﺑﺮاي ﻧﻮﺷﺘﻦ ﭘﻴﺎم ﻫﺎ و دﻛﻤﻪ ي ﺑﺮاي ارﺳﺎل ﭘﻴﺎم ﻫـﺎ و ﻳـﻚ ﺗـﺼﻮﻳﺮ ﺿـﺮﺑﺪر ﺑـﺮاي
ﺑﺪﻳﻦ. ارﺳﺎل ﺷﻮدTextBox ﭘﻴﺎم داﺧﻞ، ﻣﻲ ﺧﻮاﻫﻴﻢ ﺑﻌﺪ از ﻓﺸﺮده ﺷﺪن دﻛﻤﻪ ارﺳﺎل.ﺧﺮوج از ﺳﺎﻳﺖ ﻣﻲ ﺑﺎﺷﺪ
در اﻳﻦ ﺗﺎﺑﻊ ﻣـﺘﻦ ﭘﻴـﺎم ﺑـﻪ ﺻـﻔﺤﻪ.ﻣﻨﻈﻮر ﺗﺎﺑﻌﻲ ﺑﺪﻳﻦ ﺻﻮرت ﻧﻮﺷﺘﻪ اﻳﻢ ﺗﺎ زﻣﺎﻧﻴﻜﻪ دﻛﻤﻪ ﻓﺸﺮده ﺷﺪ ﻓﺮاﺧﻮاﻧﻲ ﺷﻮد
. ارﺳﺎل ﻣﻲ ﺷﻮدsendMessage.php
function SendMessage(){
asynchronous = new Asynchronous();
asynchronous.complete = function(status, statusText,
responseText, responseXML){
document.getElementById("message").value = "";
document.getElementById("message").focus();
};
}
chatRoom ﺑﺮﻧﺎﻣﻪ 6 ﻓﺼﻞ 148
ﻧﻴﺰ ﭘﻴـﺎم ارﺳـﺎل ﻣـﻲ ﺷـﻮد ﻛـﻪ ﻣﻮﺟـﺐ ﻓﺮاﺧـﻮاﻧﻲ ﺗـﺎﺑﻊEnter ﺑﺮاي ﺳﻬﻮﻟﺖ ﻛﺎر در ﺑﺮﻧﺎﻣﻪ ﺑﺎ ﻓﺸﺮده ﺷﺪن دﻛﻤﻪ
. ﻣﻲ ﺷﻮدSendMessagekey
function SendMessagekey(e){
if (e.keyCode == '13'){
asynchronous = new Asynchronous();
asynchronous.complete = function(status,
statusText, responseText, responseXML){
document.getElementById("message").value = "";
document.getElementById("message").focus();
}
};
var mssg = document.getElementById("message").value;
asynchronous.call('sendMessage.php?msg='+mssg,'','GET');
}
ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮ ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد ﺳﭙﺲ ﻣﺘﻦ ﭘﻴـﺎم درﻳﺎﻓـﺖsession اﺑﺘﺪا ازsendMessage.php در ﺻﻔﺤﻪ
در ﺻﻮرﺗﻲ ﻛﻪ ﻋﻤﻠﻴﺎت ﺑﺎ ﻣﻮﻓﻘﻴﺖ ﺻﻮرت ﭘـﺬﻳﺮﻓﺖ.ﻣﻲ ﺷﻮد و ﺗﺎرﻳﺦ درﻳﺎﻓﺖ ﭘﻴﺎم ﻧﻴﺰ از ﺳﻴﺴﺘﻢ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮد
. را ﺑﺮاي ﻛﻼﻳﻨﺖ ﺟﻬﺖ اﻃﻼع از اﻧﺠﺎم ﺷﺪن ﻣﻮﻓﻖ ﻋﻤﻠﻴﺎت ارﺳﺎل ﻣﻲ ﻛﻨﻴﻢ200 ﻣﻘﺪار
<?php
session_start();
$usrName = $_SESSION["UserName"];
$msg = $_GET["msg"];
$date = date("Y-m-d H:i:s");
$link = mysql_connect('localhost','root','');
mysql_select_db("chatroom",$link);
149 6 ﻓﺼﻞ chatRoom ﺑﺮﻧﺎﻣﻪ
$res=mysql_query($q,$link);
if ($res)
echo '200';
mysql_close($link);
?>
. اﺟﺮا ﻣﻲ ﺷﻮدlogout.php ﺻﻔﺤﻪ،logOut در اﻳﻦ ﺻﻔﺤﻪ ﺑﺎ زدن ﻋﻼﻣﺖ ﺿﺮﺑﺪر ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺗﺎﺑﻊ
function logOut(){
asynchronous = new Asynchronous();
asynchronous.complete = function(status,
statusText, responseText, responseXML){
.زﻣﺎ ﻧﻴﻜﻪ ﻛﺎرﺑﺮ از ﺑﺮﻧﺎﻣﻪ ﺧﺎرج ﺷﺪ ﺻﻔﺤﻪ ورود ﺑﻪ ﺳﺎﻳﺖ ﺑﺎر ﻣﻲ ﺷﻮد
if(responseText == '200')
parent.location.href("login.html");
};
asynchronous.call('LogOut.php','','GET');
}
دﺳﺘﻮر ﭘﺎك ﻛـﺮدن.( ﻣﻲ ﺷﻮدstatus=0 اﺑﺘﺪا ﻛﺎرﺑﺮ از ﺣﺎﻟﺖ ﻓﻌﺎل ﺧﺎرج ﻣﻲ ﺷﻮد)ﻓﻴﻠﺪlogout.php در
ﺑﻪ ﻛﻼﻳﻨﺖ ارﺳﺎل ﻣـﻲ200 ﻧﻴﺰ اﺟﺮا ﻣﻲ ﺷﻮد و ﺟﻬﺖ اﻃﻼع ﻛﻼﻳﻨﺖ از اﻧﺠﺎم ﻣﻮﻓﻖ ﺧﺮوج از ﺳﺎﻳﺖsession
.ﺷﻮد
<?php
session_start();
$u = $_SESSION['UserName'];
$link = mysql_connect('localhost','root','');
mysql_select_db("chatroom",$link);
$q=" update User set status=0 where UserName='$u'";
$res = mysql_query($q,$link);
mysql_close($link);
session_destroy();
if($res)
echo '200';
?>
داراي ﻳﻚ ﻗﺴﻤﺘﻲ ﺑﺮاي ﻧﻤﺎﻳﺶ ﭘﻴﺎم ﻫﺎ ﻣـﻲ ﺑﺎﺷـﺪ ﻛـﻪ در واﻗـﻊ ﻳـﻚ ﺻـﻔﺤﻪmessagebox.html ﻫﻤﭽﻨﻴﻦ
.دﻳﮕﺮ اﺳﺖ
<iframe src="message.html" id='List' style=" margin-top:10px;
width:650px;height:420px" ></iframe>
ﺑﺮﻧﺎﻣﻪ chatRoom 150ﻓﺼﻞ 6
ﺻﻔﺤﻪ message.html
ﺻﻔﺤﻪ message.htmlﺻﻔﺤﻪ ي اﺳﺖ ﻛﻪ در داﺧﻞ messagebox.htmlﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
در اﻳﻦ ﺻﻔﺤﻪ ﺑﺼﻮرت ajaxﻫﺮ ﺛﺎﻧﻴﻪ ﺻﻔﺤﻪ showmessage.phpﺑﺮاي ﻧﻤﺎﻳﺶ ﭘﻴﺎم ﻫﺎ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد.
در ﺻﻔﺤﻪ showmessage.phpﭘﻴﺎم ﻫﺎي اﻧﺘﺨﺎب ﻣﻲ ﺷﻮﻧﺪ ﻛﻪ دﻗﻴﻘﺎ در آن ﻟﺤﻈﻪ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮﻧﺪ و ﺳﭙﺲ
ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ .ﺷﻨﺎﺳﻪ ﻛﺎرﺑﺮي ارﺳﺎل ﻛﻨﻨﺪه ﭘﻴﺎم ﺑﺮاي ﺧﻮدش ﺑﻪ رﻧﮓ ﻗﺮﻣﺰ و ﺑﺮاي دﻳﮕﺮ ﻛﺎرﺑﺮان ﺑﻪ رﻧﮓ
آﺑﻲ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد .ﻣﺘﻦ ﭘﻴﺎم ﺟﺪﻳﺪ ﺑﻪ ﻣﺘﻦ ﭘﻴﺎم ﻫﺎي دﻳﮕﺮ ﻛﻪ در داﺧﻞ ﻳﻚ > <spanﺑـﺎ 'id='show
ﻗﺮار دارﻧﺪ ،اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد.
{)(function showMessage
;)(asynchronous = new Asynchronous
asynchronous.complete = function(status,
{)statusText, responseText, responseXML
)if(responseText !=null
=document.getElementById('show').innerHTML +
; responseText
;}
;)'asynchronous.call('showMessage.php','','GET
;)setTimeout(showMessage,1000
}
در ﻳﻚ ﺑﺮﻧﺎﻣﻪ Chatroomﻫﺮ زﻣﺎن اﻣﻜﺎن ﺗﻮﻟﻴﺪ و ارﺳﺎل ﻳﻚ ﭘﻴﺎم ﺟﺪﻳﺪ ﻣﻲ ﺑﺎﺷﺪ ﺑﻪ ﻫﻤﻴﻦ ﻣﻨﻈﻮر ﺑﺎﻳﺪ ﻋﻤﻠﻴـﺎت
ﻧﻤﺎﻳﺶ ﭘﻴﺎم ﻫﺎ ﻣﺘﻨﺎوﺑﺎ در ﻳﻚ ﺑﺎزه زﻣﺎﻧﻲ ﺧﺎص اﺟﺮا ﮔﺮدد .ﺑﺎ اﺳﺘﻔﺎده از ﺗﺎﺑﻊ setTimeoutﻣﻲ ﺗﻮان ﻣـﺸﺨﺺ
ﻛﺮد ﻳﻚ ﻋﻤﻠﻴﺎت ﻣﺸﺨﺺ در ﭼﻪ ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ اﺟﺮا ﺷﻮد .ﭘﺎراﻣﺘﺮ اول اﻳﻦ ﺗﺎﺑﻊ ﻧﺎم ﺗﺎﺑﻌﻲ اﺳﺖ ﻛﻪ ﻣـﻲ ﺧـﻮاﻫﻴﻢ
اﺟﺮا ﺷﻮد و ﭘﺎراﻣﺘﺮ دوم زﻣﺎن اﺟﺮا آن در ﺑﺎزه ﻫﺎي زﻣﺎﻧﻲ) ﺑﺮﺣﺴﺐ ﻫﺰارم ﺛﺎﻧﻴﻪ(
;)setTimeout(showMessage,1000
></script
></head
> <body
><span id='show' style="width:100% ;height:320px"></span
></body
></html
;)''$link = mysql_connect('localhost','root',
151 6 ﻓﺼﻞ chatRoom ﺑﺮﻧﺎﻣﻪ
mysql_select_db("chatroom",$link);
در اﻳﻦ ﺟﺎ ﭘﺮس و ﺟﻮي ﻣﻲ ﻧﻮﻳﺴﻴﻢ ﻛﻪ ﭘﻴﺎم ﻫﺎي ﻛـﻪ ﻫـﻢ اﻛﻨـﻮن درﻳﺎﻓـﺖ ﺷـﺪﻧﺪ اﻧﺘﺨـﺎب ﺷـﻮﻧﺪ ﺗـﺎ ﺑـﺮاي ﺗﻤـﺎﻣﻲ
. اﻧﺠﺎم ﻣﻲ ﮔﻴﺮدecho $str ارﺳﺎل ﭘﻴﺎم ﺑﺎ دﺳﺘﻮر.ﻛﺎرﺑﺮان ارﺳﺎل ﺷﻮﻧﺪ
$res=mysql_query($q,$link);
$row=mysql_fetch_array($res);
$str = NULL;
while ($row){
if ($user == $row[0])
{
$str.="<font style=\"color:#FF0000;\">$row[0]:
</font> $row[1]<br>" ;
}
else
{
$str.="<font style=\"color:#0099FF;\">$row[0]:
</font> $row[1]<br>";
}
$row = mysql_fetch_array($res);
}
echo $str;
mysql_close($link);
?>
.( ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪonline) ﻛﺎرﺑﺮان ﻓﻌﺎلhomepage.html در ﻗﺴﻤﺖ دﻳﮕﺮ ﺻﻔﺤﻪ
<iframe src="userList.html" id='List' style=" background-
color:#FFFFFF;margin-top:0px;width:200px;
border:thin;height:380px" >
</iframe>
اﻳﻦ ﺻـﻔﺤﻪ ﺑـﺮاي ﻧﻤـﺎﻳﺶ ﻟﻴـﺴﺘﻲ از ﻛـﺎرﺑﺮان. ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮدuserList.html ﺻﻔﺤﻪ،در اﻳﻦ ﻗﺴﻤﺖ
اﻣﺎ دﻟﻴـﻞ اﺳـﺘﻔﺎده. اﻧﺠﺎم ﻣﻲ دﻫﺪshowlist.php ﻓﻌﺎل در ﺳﻴﺴﺘﻢ ﻣﻲ ﺑﺎﺷﺪ و اﻳﻦ ﻋﻤﻞ را ﺑﺎ ﻓﺮاﺧﻮاﻧﻲ ﺻﻔﺤﻪ
در اﻳﻦ ﺟﺎ ﺑﺮاي آن اﺳﺖ ﻛﻪ ﻫﺮ ﻟﺤﻈﻪ اﻣﻜـﺎن ورود ﻳـﻚ ﻛـﺎرﺑﺮ ﺟﺪﻳـﺪ ﺑـﻪ ﺳـﺎﻳﺖ و ﻳـﺎsetTimeout از ﺗﺎﺑﻊ
chatRoom ﺑﺮﻧﺎﻣﻪ 6 ﻓﺼﻞ 152
ﻫﻨﮕـﺎﻣﻲ ﻛـﻪ.ﺧﺮوج ﻳﻚ ﻛﺎرﺑﺮ وﺟﻮد دارد در ﻧﺘﻴﺠﻪ اﻳﻦ ﻟﻴﺴﺖ ﻛﺎرﺑﺮان ﻓﻌﺎل ﺑﺎﻳﺪ ﻫﺮ ﭼﻨﺪ ﺛﺎﻧﻴﻪ دوﺑﺎره ﭼﻚ ﺷﻮد
اﺟــﺮا ﻣــﻲ ﺷــﻮد و ﻟﻴــﺴﺖ ﻛــﺎرﺑﺮان را ﻛــﻪ در ﭘــﺎراﻣﺘﺮcomplete ﻟﻴــﺴﺖ ﻛــﺎرﺑﺮان از ﺳــﺮور ارﺳــﺎل ﺷــﻮد ﻣﺘــﺪ
. اﻧﺘﺴﺎب ﻣﻲ دﻫﺪid='divList' < ﺑﺎdiv> ﻗﺮار دارد ﺑﺮاي ﻧﻤﺎﻳﺶ ﺑﻪ ﻣﺤﺘﻮاي ﻳﻚresponseText
function setLIst(){
while($r != NULL)
{
if ($r[6]=='M')
$str.= "<tr > <td> <img
src='Image\m2.ico'></td><td
style=\"cursor:pointer\"
onclick='parent.showInfo
(this)'>$r[1]</td></tr>";
else
$str.= "<tr > <td> <img
src='Image\f2.ico'></td>
<td style=\"cursor:pointer
\"onclick='parent.showInfo
(this)'>$r[1]</td></tr>";
153 6 ﻓﺼﻞ chatRoom ﺑﺮﻧﺎﻣﻪ
$r = mysql_fetch_array($res);
}
$str.="</table>";
echo $str;
mysql_close($link);
?>
ﺟﻬـﺖ ﻧﻤـﺎﻳﺶ ﻣﺸﺨـﺼﺎت،showlist.php ﺑﺎ ﻛﻠﻴﻚ ﻛـﺮدن ﺑـﺮ روي ﺧﺎﻧـﻪ ﻫـﺎي ﺟـﺪول ﺗﻮﻟﻴـﺪي ﺻـﻔﺤﻪ
اﺟــﺮا ﻣــﻲ ﺷــﻮد ﻛــﻪ ﻣﻮﺟــﺐ ﻓﺮاﺧــﻮاﻧﻲ ﺻــﻔﺤﻪshowInfo ﺗــﺎﺑﻊ،ﺷﺨــﺼﻲ ﻛــﺎرﺑﺮان در ﻗــﺴﻤﺖ ﭘــﺎﺋﻴﻦ ﺻــﻔﺤﻪ
<ﺑــﺎdiv> ﻫﻤﭽﻨــﻴﻦ ﻣــﻲ ﺧــﻮاﻫﻴﻢ ﻟﻴــﺴﺖ ارﺳــﺎﻟﻲ از ﺳــﻤﺖ ﺳــﺮور در ﻳــﻚ. ﻣــﻲ ﺷــﻮدuserinfo.php
. ﻗﺮار ﮔﻴﺮدid='UserInfo'
function showInfo(e){
asynchronous = new Asynchronous();
asynchronous.complete = function(status, statusText,
responseText, responseXML){
document.getElementById("UserInfo").innerHTML =
responseText;
};
asynchronous.call('UserInfo.php?UserName='+e.innerHTML,'',
'GET');
}
اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﻣﻮرد ﻧﻈﺮ در ﺟﺪوﻟﻲ ﻗﺮار ﻣـﻲ ﮔﻴـﺮد و ﺑـﺮاي ﻧﻤـﺎﻳﺶ ﺑـﺎ دﺳـﺘﻮرuserinfo.php در ﺻﻔﺤﻪ
. ﺑﻪ ﻛﻼﻳﻨﺖ ارﺳﺎل ﻣﻲ ﺷﻮدecho $str
<?php
$userName=$_GET['UserName'];
$link=mysql_connect('localhost','root','');
mysql_select_db('chatroom',$link);
$str = "<table>";
$str .="<tr><td>FirstName</td> <td> $r[1] </td></tr>" ;
$str .= "<tr><td>LastName</td> <td> $r[2] </td></tr>";
if($r['Gender']=='M')
$str .= "<tr><td>Gender</td> <td>Male</td></tr>";
else
$str .= "<tr><td>Gender</td> <td>Female</td></tr>";
BookStoreﻳﻚ وب ﺳﺎﻳﺖ ﻧﻤﺎﻳﺸﮕﺎه و ﻓﺮوﺷﮕﺎه اﻳﻨﺘﺮﻧﺘﻲ ﻛﺘﺎب ﻣﻲ ﺑﺎﺷﺪ .اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﺑﻴﺸﺘﺮ ﺑﺮاي آﺷﻨﺎﻳﻲ
ﺧﻮاﻧﻨﺪه ﺑﺎ ﭼﮕﻮﻧﮕﻲ اﺳﺘﻔﺎده از Ajaxدر ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺠﺎري ﻣﻲ ﺑﺎﺷﺪ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ از زﺑﺎن PHPﺑﺮاي
ﻛﺪﻧﻮﻳﺴﻲ ﺳﻤﺖ ﺳﺮور اﺳﺘﻔﺎده ﺷﺪه اﺳﺖ .ﻛﺪﻫﺎي ﻛﺎﻣﻞ اﻳﻦ ﺑﺮﻧﺎﻣﻪ در CDﻛﺘﺎب در ﻣﺴﻴﺮ
project\bookstoreو ﺟﺪول ﻫﺎي آن در ﻣﺴﻴﺮ project\database\bookstoreﻣﻮﺟﻮد
ﻣﻲ ﺑﺎﺷﺪ .اﺑﺘﺪا ﺑﻬﺘﺮ اﺳﺖ ﺑﺎ ﻛﻠﻴﺎت و ﻋﻤﻠﻴﺎت اﺟﺮاﻳﻲ ﺑﺮﻧﺎﻣﻪ ﺑﻴﺸﺘﺮ آﺷﻨﺎ ﺷﻮﻳﺪ.
در اﻳﻦ ﭘﺮوژه 3ﻧﻮع ﻛﺎرﺑﺮ ﺗﻌﺮﻳﻒ ﺷﺪه اﺳﺖ:
-1ﻛﺎرﺑﺮ ﻣﺪﻳﺮ ﺳﺎﻳﺖ
-2ﻛﺎرﺑﺮ ﻋﻀﻮ ﺳﺎﻳﺖ
-3ﻛﺎرﺑﺮ ﻣﻴﻬﻤﺎن
ﻋﻤﻠﻴﺎت اﺟﺮاﻳﻲ ﺑﺮﻧﺎﻣﻪ :ﻛﺎرﺑﺮان ﻫﻨﮕﺎم ورود ﺑﻪ ﺳﺎﻳﺖ و ﻣﺸﺎﻫﺪه ﺻﻔﺤﻪ اﺻﻠﻲ ﺳﺎﻳﺖ ﻣﻲ ﺗﻮاﻧﻨﺪ اﻃﻼﻋﺎت ﻣﻮرد ﻧﻴﺎز
ﺧﻮد را در ﻣﻮرد ﻛﺘﺎب ﺟﺴﺘﺠﻮ ﻧﻤﺎﻳﻨﺪ .اﻣﻜﺎن داﻧﻠﻮد ﻛﺮدن ﻓﺎﻳﻞ از وب ﺳـﺎﻳﺖ ﺑـﺮاي ﻛـﺎرﺑﺮان ﻓـﺮاﻫﻢ اﺳـﺖ .اﻳـﻦ
ﻓﺎﻳﻞ ﻫﺎ ﻣﻲ ﺗﻮاﻧﻨﺪ ﻧﺴﺨﻪ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻛﻞ ﻛﺘﺎب ﻳﺎ ﭼﻨﺪ ﻓﺼﻞ ﺑﺮاي ﻧﻤﻮﻧﻪ ﺑﺎﺷﻨﺪ .در ﺻﻮرﺗﻴﻜﻪ ﻛﺎرﺑﺮان ﺑـﺮاي ﺧﺮﻳـﺪ
ﻛﺘﺎﺑﻲ ﺗﻤﺎﻳﻞ داﺷﺘﻪ ﺑﺎﺷﻨﺪ ﺑﺎﻳﺪ ﺑﻪ ﺳﺎﻳﺖ loginﻛﻨﻨﺪ ﺗﺎ ﺑﺘﻮاﻧﻨﺪ ﻛﺘﺎب ﻣﻮرد ﻧﻈﺮ ﺧـﻮد را ﺧﺮﻳـﺪاري ﻧﻤﺎﻳﻨـﺪ .ﺑﻄـﻮر
ﻛﻠﻲ ﺧﺮﻳﺪ ﺑﺪون ﻋﻀﻮﻳﺖ در ﺳﺎﻳﺖ اﻣﻜﺎن ﭘﺬﻳﺮ ﻧﻴﺴﺖ .ﺑﺮاي ورود ﺑﻪ ﺳﺎﻳﺖ ﻧﻴﺎز ﺑﻪ ﻛـﺪﻛﺎرﺑﺮي و رﻣـﺰ ﻋﺒـﻮر ﻣـﻲ
ﺑﺎﺷﺪ .ﻛﺎرﺑﺮاﻧﻲ ﻛﻪ ﻛﺪﻛﺎرﺑﺮي ﻧﺪارﻧﺪ ﻣﻲ ﺗﻮاﻧﻨـﺪ ﺑـﺎ رﻓـﺘﻦ ﺑـﻪ ﺻـﻔﺤﻪ ﺛﺒـﺖ ﻧـﺎم و ﭘـﺮ ﻛـﺮدن ﻓـﺮم ﺛﺒـﺖ ﻧـﺎم ،ﻳـﻚ
ﻛﺪﻛﺎرﺑﺮي ﺑﺮاي ﺧﻮد اﻳﺠﺎد و ﺑﻪ ﺳﺎﻳﺖ وارد ﺷﻮﻧﺪ .در ﻫﻨﮕﺎم ﺛﺒﺖ ﻧﺎم ﺑﻄـﻮر ﭘـﻴﺶ ﻓـﺮض ﻣﻘـﺪار 50000ﺑﻌﻨـﻮان
ﻣﻮﺟﻮدي اوﻟﻴﻪ ﺑﻪ ﻛﺎرﺑﺮان داده ﻣﻲ ﺷﻮد .در زﻣﺎن ورود ﺑﻪ ﺳﺎﻳﺖ اﮔﺮ اﻃﻼﻋﺎت ﻛﺪ ﻛﺎرﺑﺮي ﻳﺎ ﻛﻠﻤﻪ ﻋﺒﻮر اﺷﺘﺒﺎﻫﻲ
وارد ﺷﻮد ﺑﺪون اﻳﻨﻜﻪ ﺻﻔﺤﻪ ﺗﻐﻴﻴﺮي ﻛﻨﺪ ﭘﻴﻐﺎم ﻫﺸﺪاري ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷـﻮد ﻧﻤـﺎﻳﺶ اﻳـﻦ ﭘﻴﻐـﺎم ﺗﻮﺳـﻂ Ajax
ﭘﻴﺎده ﺳﺎزي ﺷﺪه اﺳﺖ.
زﻣﺎﻧﻴﻜﻪ ﻛﺎرﺑﺮ ﺑﻪ ﺳﺎﻳﺖ وارد ﻣﻲ ﺷﻮد ،اﻃﻼﻋﺎت ﺷﺨﺼﻲ ﻛﺎرﺑﺮ ﺑﻪ ﻫﻤﺮاه ﻣﻴﺰان ﻣﻮﺟﻮدﻳﺶ ،ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷـﻮد.
ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﻛﺘﺎب ﻣﻮرد ﻧﻈﺮ ﺧﻮد را در ﻗﺴﻤﺖ ﻣﺸﺨﺺ ،ﺟﺴﺘﺠﻮ ﻛﻨﺪ و ﺑﺎ وارد ﻛﺮدن ﺗﻌﺪاد ﺧﺮﻳـﺪ و ﻓـﺸﺮدن
دﻛﻤﻪ ﺧﺮﻳﺪ ،آن ﻛﺘﺎب را ﺑﻪ ﺳﺒﺪ ﺧﺮﻳﺪ ﺧﻮد اﺿﺎﻓﻪ ﻧﻤﺎﻳﺪ .ﺳﺒﺪ ﺧﺮﻳـﺪ در ﺳـﺎﻳﺖ ﻗﺎﺑـﻞ روﻳـﺖ اﺳـﺖ و ﻛـﺎرﺑﺮ ﻣـﻲ
ﺗﻮاﻧﺪ ﻫﺮ زﻣﺎن ﻧﺴﺒﺖ ﺑﻪ ﺣﺬف ﺧﺮﻳﺪ از ﺳﺒﺪ ﺧﺮﻳﺪ اﻗﺪام ﻧﻤﺎﻳﺪ .در ﭘﺎﻳﺎن ﻋﻤﻠﻴﺎت ﺧﺮﻳﺪ ،ﻛﺎرﺑﺮ ﺑﺎﻳﺪ ﺧﺮﻳـﺪ را ﺗﺎﻳﻴـﺪ
ﻛﻨﺪ در اﻳﻦ ﺻﻮرت ﻣﺒﻠﻎ ﻛﺘﺎب ﻫﺎي ﻣﻮﺟﻮد در ﺳﺒﺪ ﺧﺮﻳﺪ از ﻣﻮﺟﻮدي ﻛﺎرﺑﺮ ﻛﻢ ﻣـﻲ ﺷـﻮد .اﻧﺠـﺎم اﻳـﻦ ﻋﻤﻠﻴـﺎت
ﺑﺼﻮرت Ajaxﻣﻲ ﺑﺎﺷﺪ ﺗﺎ ﺻﻔﺤﻪ دوﺑﺎره ﺑﺎرﮔﺬاري ﻧﺸﻮد .ﻫﻤﭽﻨـﻴﻦ ﻫـﺮ ﻛﺘـﺎب ﻣـﻲ ﺗﻮاﻧـﺪ داراي ﻳـﻚ ﻓﺎﻳـﻞ ﺑـﻪ
ﻣﻨﻈﻮر اراﺋﻪ ﺳﺮﻓﺼﻞ ﻫﺎي ﻛﺘﺎب ﺑﻪ ﻣﺸﺘﺮﻳﺎن ،ﺑﺎﺷﺪ.ﻛﺎرﺑﺮان اﻣﻜﺎن داﻧﻠﻮد اﻳﻦ ﻓﺎﻳﻞ را دارﻧﺪ .ﻛﺎرﺑﺮان ﻣـﻲ ﺗﻮاﻧﻨـﺪ در
ﺳﺎﻳﺖ ﻟﻴﺴﺖ ﻛﺘﺎب ﻫﺎي ﻛﻪ ﻗﺒﻼ ﺗﻮﺳﻂ آن ﻫﺎ ﺧﺮﻳﺪاري ﺷﺪه اﺳﺖ ﺑﻪ ﻫﻤﺮاه ﺗـﺎرﻳﺦ ﺧﺮﻳـﺪ ﻛﺘـﺎب ﻫـﺎ ،را ﻣـﺸﺎﻫﺪه
ﻧﻤﺎﻳﻨﺪ.
ﺑﺮﻧﺎﻣﻪ BookStore 156ﻓﺼﻞ 7
ﻛﺎرﺑﺮان ﻧﻮع دﻳﮕﺮ ،ﻛﺎرﺑﺮان ﻣﻴﻬﻤﺎن ﻫﺴﺘﻨﺪ ﻛﻪ ﺑﺪون داﺷﺘﻦ ﻛـﺪ ﻛـﺎرﺑﺮي ﻣـﻲ ﺧﻮاﻫﻨـﺪ اﻃﻼﻋـﺎﺗﻲ از ﻛﺘـﺎب ﻫـﺎ را
ﺟﺴﺘﺠﻮ و ﻣﺸﺎﻫﺪه ﻳﺎ ﻓﺎﻳﻞ ﻣﺮﺑﻮط ﺑﻪ ﻛﺘﺎب را داﻧﻠﻮد ﻧﻤﺎﻳﻨﺪ .ﻛﺎرﺑﺮ ﻧﻮع ﻣﻴﻬﻤﺎن در ﺻـﻔﺤﻪ اﺻـﻠﻲ ﺳـﺎﻳﺖ ﺷـﺮوع ﺑـﻪ
ﺟﺴﺘﺠﻮي ﻛﺘﺎب ﻣﻲ ﻧﻤﺎﻳﺪ و اﻃﻼﻋﺎت ﻛﺘﺎب درﺧﻮاﺳﺘﻲ او در ﺻﻔﺤﻪ دﻳﮕﺮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
ﻛﺎرﺑﺮ ﻧﻮع دﻳﮕﺮ ﻣﺪﻳﺮ ﺳﺎﻳﺖ ﻣﻲ ﺑﺎﺷﺪ .ﻣﺪﻳﺮ ﺳﺎﻳﺖ ﻣﻲ ﺗﻮاﻧـﺪ ﻟﻴـﺴﺘﻲ از ﻛـﺎرﺑﺮان ﻋـﻀﻮ ﺳـﺎﻳﺖ را ﻣـﺸﺎﻫﺪه ﻧﻤﺎﻳـﺪ.
ﻫﻤﭽﻨﻴﻦ ﻣﻲ ﺗﻮاﻧﺪ اﻃﻼﻋﺎت ﺧﺮﻳﺪ ﻳﻚ ﻛﺎرﺑﺮ ﺧﺎص را ﻣﺸﺎﻫﺪه ،ﺑﺮاي ﻳﻚ ﻛﺎرﺑﺮ ﺧﺎص اﻗﺪام ﺑﻪ ﺷﺎرژ ﻣﻮﺟﻮدﻳﺶ
ﻧﻤﺎﻳﺪ و ﻫﻤﭽﻨﻴﻦ ﻟﻴﺴﺘﻲ از ﺗﺎرﻳﺦ ﻫﺎ و ﻣﻘﺎدﻳﺮ ﺷﺎرژ ﺣﺴﺎب ﻫﺎي ﻣﺸﺘﺮﻳﺎن را ﻣﺸﺎﻫﺪه ﻧﻤﺎﻳـﺪ .ﻫﻤﭽﻨـﻴﻦ اﻣﻜـﺎن اﻧﺠـﺎم
ﻋﻤﻠﻴﺎت اﺿﺎﻓﻪ ﻛﺮدن ،ﺣﺬف ،وﻳﺮاﻳﺶ را ﺑﺮ روي ﻛﺘﺎب ﻫﺎ و اﻣﻜﺎن Uploadﻛﺮدن ﺗﺼﻮﻳﺮ و ﻓﺎﻳﻞ اﻟﻜﺘﺮوﻧﻴﻜـﻲ
ﻛﺘﺎب ﻫﺎ را داراﺳﺖ.
ﺟﺪاول ﻣﻮﺟﻮد در ﺳﻴﺴﺘﻢ
در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﺎ ﻧﻴﺎز ﺑﻪ ﺟﺪول ﻫﺎي ﺑﺮاي ﻧﮕﻬـﺪاري اﻃﻼﻋـﺎت ﻛﺘـﺎب ﻫـﺎ ،اﻃﻼﻋـﺎت ﻛـﺎرﺑﺮان ،اﻃﻼﻋـﺎت ﺧﺮﻳـﺪ و
اﻃﻼﻋﺎت ﺷﺎرژ ﻣﻮﺟﻮدي ﻛﺎرﺑﺮان دارﻳﻢ .در اﻳﻨﺠﺎ ﺑﻪ ﺑﺮرﺳﻲ ﺟﺪول ﻫﺎي ﻻزم در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻣﻲ ﭘﺮدازﻳﻢ.
ﺟﺪول ﻛﺘﺎب
ﺟﺪول ﻛﺘﺎب ،ﺟﺪوﻟﻲ ﺑﺮاي ﻧﮕﻬﺪاري ﻣﺸﺨﺼﺎت ﻛﺘﺎب ﻫﺎ ﻣﻲ ﺑﺎﺷﺪ.
ﺟﺪول ﺳﺒﺪ ﺧﺮﻳﺪ ﺣﺎوي اﻃﻼﻋﺎت اﻗﻼم ﺧﺮﻳﺪ ﻛﺎرﺑﺮان ﻣﻲ ﺑﺎﺷﺪ .اﻃﻼﻋﺎت اﻳﻦ ﺟﺪول ﻣﻮﻗﺘﻲ اﺳﺖ ،ﺗﺎ زﻣـﺎﻧﻲ ﻛـﻪ
ﻛﺎرﺑﺮ ﺧﺮﻳﺪ ﺧﻮد را ﺗﺎﻳﻴﺪ ﻧﻤﺎﻳﺪ .ﺑﻪ ازاي ﻫﺮ ﺧﺮﻳﺪ ﻛﺎرﺑﺮ ﻳﻚ رﻛﻮرد ﺑﻪ اﻳﻦ ﺟﺪول اﺿﺎﻓﻪ ﻣﻲ ﺷﻮد .ﻋﻠـﺖ اﺳـﺘﻔﺎده
از ﺟﺪول ﺳﺒﺪ ﺧﺮﻳﺪ ﺑﻌﻨﻮان ﻳﻚ ﺟﺪول ﻣﻮﻗﺘﻲ اﻳﻦ اﺳﺖ ﻛﻪ اﻳﻦ اﻣﻜﺎن در ﺳـﺎﻳﺖ ﻓـﺮاﻫﻢ اﺳـﺖ ﻛـﻪ ﻛـﺎرﺑﺮ ﺑـﺪون
ﺗﺎﻳﻴﺪ ﺧﺮﻳﺪ از اﻧﺠﺎم ﻛﻞ ﺧﺮﻳﺪ ﻣﻨﺼﺮف ﺷﻮد و از ﺳﺎﻳﺖ ﺧﺎرج ﺷﻮد.
ﺑﻌﺪ از ﻣﺮوري ﺑﺮ ﺑﺮﻧﺎﻣﻪ ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﻃﺮاﺣﻲ ﺳﺎﻳﺖ و ﻧﺤﻮي ﻛﺪﻧﻮﻳﺴﻲ آن ﺑﭙﺮدازﻳﻢ.
ﺑﻬﺘﺮ اﺳﺖ ﺻﻔﺤﻪ اﺻﻠﻲ ﺳﺎﻳﺖ ﻳﻚ ﺻﻔﺤﻪ ﻛﻢ ﺣﺠﻢ ﺑﺎﺷﺪ ﺗﺎ اﻳﻦ ﺻـﻔﺤﻪ ﺑـﻪ ﺳـﺮﻋﺖ loadﺷـﻮد و ﻛـﺎرﺑﺮ ﺑـﺮاي
ﻣﺸﺎﻫﺪه ﺳﺎﻳﺖ ﻣﻨﺘﻈﺮ ﻧﺸﻮد و ﻋﻤﻠﻴﺎت اﺻﻠﻲ ﺳﺎﻳﺖ را ﺑﻪ ﺻﻔﺤﺎت دﻳﮕﺮ ﻣﻨﺘﻘﻞ ﻛﻨـﻴﻢ ﻫﻤﭽﻨـﻴﻦ ﺑـﺮاي آﻧﻜـﻪ ﺻـﻔﺤﻪ
اﺻﻠﻲ ﺳﺎﻳﺖ ﻳﻚ ﻗﺎﻟﺐ ﻣﺸﺨﺺ داﺷﺘﻪ ﺑﺎﺷﺪ ،ﺑﻪ ﻣﺎﻧﻨﺪ ﺷﻜﻞ 8-1ﻃﺮاﺣﻲ ﺷﺪه اﺳـﺖ .اﻣـﺎ ﺑﻬﺘـﺮ اﺳـﺖ در اول ﻛـﺎر
ﻳﻚ دﺳﺘﻪ ﺑﻨﺪي از ﻋﻤﻠﻴﺎت ﻣﻮﺟﻮد در اﻳﻦ ﺑﺮﻧﺎﻣﻪ داﺷﺘﻪ ﺑﺎﺷﻴﻢ ﺗﺎ ﺑﺘﻮاﻧﻴﻢ ﺑﺮ روي ﻃﺮاﺣﻲ ﺻﻔﺤﺎت ﺑﻬﺘﺮ ﻋﻤـﻞ ﻛﻨـﻴﻢ.
ﻋﻤﻠﻴﺎت را ﻧﺴﺒﺖ ﺑﻪ ﻧﻮع ﻛﺎرﺑﺮان ﺗﻘﺴﻴﻢ ﺑﻨﺪي ﻣﻲ ﻛﻨﻴﻢ:
.1ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻛﺎرﺑﺮ ﻧﻮع ﻣﻴﻬﻤﺎن
.2ﻋﻤﻠﻴﺎت ﻣﺸﺘﺮك ﺑﺮاي ﻛﺎرﺑﺮان
.3ﻋﻤﻠﻴﺎت ﻛﺎرﺑﺮ ﻋﻀﻮ ﺳﺎﻳﺖ
.4ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻣﺪﻳﺮ ﺳﺎﻳﺖ
ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻛﺎرﺑﺮ ﻧﻮع ﻣﻴﻬﻤﺎن
اﻳﻦ ﻛﺎرﺑﺮ در ﺻﻔﺤﻪ اﺻﻠﻲ ﺳﺎﻳﺖ ﺗﻨﻬﺎ ﻣﻲ ﺗﻮاﻧﺪ ﻛﺘﺎﺑﻲ را ﺟﺴﺘﺠﻮ ﻧﻤﺎﻳﺪ ﺗﺎ اﻃﻼﻋﺎﺗﻲ از آن ﻛﺘﺎب را ﻣﺸﺎﻫﺪه ﻧﻤﺎﻳـﺪ
و ﻳﺎ ﻓﺎﻳﻞ اﻟﻜﺘﺮوﻧﻴﻜﻲ ﻛﺘﺎب را داﻧﻠﻮد ﻧﻤﺎﻳﺪ در ﻧﺘﻴﺠﻪ در ﺻﻔﺤﻪ اﺻﻠﻲ ﺳﺎﻳﺖ ﻧﻴﺎز ﺑﻪ ﻗﺴﻤﺘﻲ ﺑﺮاي ﺟﺴﺘﺠﻮي ﻛﺘـﺎب
دارﻳﻢ اﻣﺎ ﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ را در ﺻﻔﺤﻪ ي دﻳﮕﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﻢ.
var t = document.form1.select1.options[document.form1
;.select1.selectedIndex].value
;document.getElementById('var1').value=t
}
ﺻﻔﺤﻪ home.htmlاﻃﻼﻋﺎت را از ﻃﺮﻳﻖ> <formو ﺑﺼﻮرت ﻣﺘﺪ GETﺑﻪ ﺻﻔﺤﻪ ViewBook.phpﺑﺮاي
ﺟﺴﺘﺠﻮي ﻛﺘﺎب ارﺳﺎل ﻣﻲ ﻛﻨﺪ .ﭼﻮن ﻧﻮع دﻛﻤﻪ ﺟﺴﺘﺠﻮ Submitﻣﻲ ﺑﺎﺷﺪ اﻃﻼﻋﺎت ﺑﺎ ﻛﻠﻴﻚ ﺷﺪن اﻳﻦ دﻛﻤﻪ
ارﺳﺎل ﻣﻲ ﮔﺮدد .در اﻳﻦ ﺻﻔﺤﻪ ﻣﺘﻐﻴﺮ ﻛﻤﻜﻲ دﻳﮕﺮ ﺑﻪ ﻧﺎم h2ﺑﺎ ' id='var2ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ و ﺑﺮاي آن اﺳﺖ
ﻛﻪ ﺑﺎ ﻣﻘﺪار دﻫﻲ ﺻﻔﺮ ﺑﻪ آن ﺑﺘﻮاﻧﻴﻢ در ﺻﻔﺤﻪ ViewBook.phpﺗـﺎﺑﻊ newsearchرا ﺑـﺎ ﭘـﺎراﻣﺘﺮ ﺻـﻔﺮ ﺑـﻪ
ﻣﻨﻈﻮر ﺷﺮوع ﺟﺴﺘﺠﻮ ﻓﺮاﺧﻮاﻧﻲ ﻛﺮد.
>"<form method=GET action="ViewBook.php" name="form1
var t = document.form1.select1.options[document.form1.
;select1.selectedIndex].value
;document.getElementById('var1').value=t
}
ﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ در ﻗﺎﻟﺒﻲ ﺧﺎص ﺗﻘﺴﻴﻢ ﺑﻨﺪي )ﺻﻔﺤﻪ ﺑﻨﺪي( ﻣﻲ ﺷﻮﻧﺪ ﺑﺮاي آن ﻛﻪ ﺑﺘﻮاﻧﻴﻢ ﺑﺎ ﻛﻠﻴـﻚ ﺑـﺮ روي ﺷـﻤﺎره
ﺻﻔﺤﻪ اﻃﻼﻋﺎت آن ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﻮد ،ﺗﺎﺑﻊ ) newsearch(eرا ﺑﺎ ﭘﺎراﻣﺘﺮ ﺷـﻤﺎره رﻛـﻮردي ﻛـﻪ از آن
رﻛﻮرد ﺑﻪ ﺑﻌﺪ ﻣﻲ ﺧﻮاﻫﻴﻢ ﻳﻚ ﺗﻌﺪاد رﻛﻮرد را از ﻣﺠﻤﻮﻋﻪ ﺟﻮاب ﺑﺎزﻳﺎﺑﻲ ﻛﻨﻴﻢ ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﻢ .ﺑﺎ ﻣﻘـﺪاردﻫﻲ
،e=0از اﺑﺘﺪاي ﻣﺠﻤﻮﻋﻪ ﺟﻮاب رﻛﻮردﻫﺎ را ﺑﺎزﻳﺎﺑﻲ ﻣﻲ ﻛﻨﻴﻢ.
{)function newsearch(e
;document.getElementById('var2').value = e
}
ﻓﺼﻞ 161 7 ﺑﺮﻧﺎﻣﻪ BookStore
ﺻﻔﺤﻪ ViewBook.phpﺧﻮدش را ﺑﻪ ﻫﻨﮕﺎم ﻛﻠﻴﻚ ﻛﺮدن دﻛﻤﻪ ﺟﺴﺘﺠﻮ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ ﻛﻨـﺪ .ﺑـﺮاي ارﺳـﺎل
اﻃﻼﻋﺎت از ﻣﺘﺪ GETاﺳﺘﻔﺎده ﺷﺪه اﺳﺖ.
>'<form method=GET action="ViewBook.php" name='form1
;)$res = mysql_query($q,$link
ﺑﺮاي ﻧﻤﺎﻳﺶ ﺟﻮاب ﻫﺎ ﻳﻚ ﺟﺪول htmlاﻳﺠﺎد ﻣﻲ ﻛﻨﻴﻢ .در اﺑﺘﺪا ﻗﺴﻤﺖ ﻫﺪر ﺟﺪول را ﻣﻲ ﺳﺎزﻳﻢ.
;)$row = mysql_fetch_array($res
$str = '<table width=100% ><tr><th align=left
</th><th align=leftﻧﺎم ﻛﺘﺎب>"style="color:#660000
</th><th align=leftﻧﺎم ﻧﻮﻳﺴﻨﺪه>"style="color:#660000
;'></th></trﻗﻴﻤﺖ ﻛﺘﺎب>"style="color:#660000
ﺣﺎل ﺑﺎﻳﺪ از اﻳﻦ ﻣﺠﻤﻮﻋﻪ ﺟﻮاب ﺳﻪ ﻋﻨﺼﺮي ﺗﻚ ﺗﻚ رﻛﻮردﻫﺎ ﺑﺮاي ﻧﻤﺎﻳﺶ ،ﺑﺎزﻳﺎﺑﻲ ﺷﻮﻧﺪ.
رﻛﻮردﻫﺎي ﺣﺎﺻﻞ از ﺟﺴﺘﺠﻮ را در ﺳﻄﺮ ﻫﺎي ﻳﻚ ﺟﺪول htmlﻗﺮار ﻣﻲ دﻫﻴﻢ ﺗﺎ آن ﺟﺪول را ﻧﻤﺎﻳﺶ دﻫﻴﻢ.
;)$row = mysql_fetch_array($res
}
;'>$str.='</table><br><p align=center
ﺑﺎ اﺳﺘﻔﺎده از ﻳﻚ ﺣﻠﻘﻪ ﺗﻜﺮار از ﺻﻔﺮ ﺗﺎ ﺗﻌﺪاد ﺻﻔﺤﺎت ﺟﻮاب ﻫﺎ ) ($kﻳـﻚ ﺷـﻤﺎره ﻛـﻪ ﻫﻤـﺎن ﺷـﻤﺎره ﺻـﻔﺤﻪ
اﺳﺖ ) ($mرا ﺑﻌﻨﻮان ﻳﻚ ﻟﻴﻨﻚ در ﻧﻈﺮ ﻣﻲ ﮔﻴﺮﻳﻢ و ﺑﺮاي روﻳﺪاد onclickﻟﻴﻨﻚ ﺗﺎﺑﻊ newsearchرا ﺑﺎ
ﭘﺎراﻣﺘﺮ $i*3ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﻴﻢ ) ﺑﺮاي ﺻﻔﺤﻪ اول ﺑﺎﻳﺪ رﻛﻮردﻫﺎي از 0ﺗـﺎ 3وﻟـﻲ $mﺑـﺮاي ﺻـﻔﺤﻪ اول ﻳـﻚ
اﺳﺖ ﭘﺲ از $iاﺳﺘﻔﺎده ﻣـﻲ ﻛﻨـﻴﻢ .ﺑـﺮاي ﺻـﻔﺤﻪ اول $i=0اﺳـﺖ ﭘـﺲ $count=0ﻳﻌﻨـﻲ دﺳـﺘﻮر ﺑـﺼﻮرت
limit 0,3ﺑﺮاي ﺻﻔﺤﻪ دوم $i=1ﻳﻌﻨﻲ .limit 3,3ﭼﻮن ﻫﺮ ﺻﻔﺤﻪ داراي ﺳﻪ رﻛﻮرد اﺳـﺖ ﺷـﻤﺎره
ﺻﻔﺤﻪ در ﻋﺪد ﺳﻪ ﺿﺮب ﻣﻲ ﺷﻮد ﺗﺎ آدرس ﺷﺮوع رﻛﻮردي ﻛﻪ ﻣﻲ ﺧﻮاﻫﻴﻢ از آن آدرس رﻛﻮردﻫﺎي ﺟـﻮاب را
ﺑﺎزﻳﺎﺑﻲ ﻛﻨﻴﻢ ﺑﺪﺳﺖ آورﻳﻢ(.
{)for($i=0;$i < $k; $i++
;$m = $i+1
';)$str.= "<a onclick='newsearch(($i)*3
;";style='cursor:pointer'>$m</a> 
}
;'>$str.='</p
;echo $str
در اﻳﻦ ﻗﺴﻤﺖ رﺷﺘﻪ ﺣﺎوي ﺟﺪول ﻧﺘـﺎﻳﺞ ﺟـﺴﺘﺠﻮ از ﺳـﻤﺖ ﺳـﺮور ﺑـﻪ ﻛﻼﻳﻨـﺖ ﺑـﺎ دﺳـﺘﻮر echo $strﺑـﺮاي
ﻧﻤﺎﻳﺶ ،ارﺳﺎل ﻣﻲ ﺷﻮد.
;)mysql_close($link
}
>?
اﮔﺮ ﻛﺎرﺑﺮ ﻣﻬﻴﻤﺎن ﺑﺨﻮاﻫﺪ ﻋﻀﻮ ﺳﺎﻳﺖ ﺷﻮد ﺑﺎﻳﺪ ﺛﺒﺖ ﻧﺎم ﻛﻨﺪ .ﻋﻤﻠﻴﺎت ﺛﺒﺖ ﻧﺎم را ﻣﻲ ﺗﻮان در ﻳﻚ ﺻـﻔﺤﻪ ﻣﺠـﺰا
ﻗﺮار داد .ﻛﺎرﺑﺮان در ﺻﻔﺤﻪ ﺛﺒﺖ ﻧﺎم ،ﻓﺮم ﺛﺒﺖ ﻧﺎم را ﺑﺎ اﻃﻼﻋﺎت ﺷﺨﺼﻲ ﺧﻮد ﭘﺮ ﻣﻲ ﻛﻨﻨـﺪ ﻛـﻪ اﻳـﻦ اﻃﻼﻋـﺎت در
ﺟﺪول customersذﺧﻴﺮه ﻣﻲ ﺷﻮﻧﺪ .ﻫﻨﮕﺎم ﺛﺒﺖ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ ﺑﻪ ﺟﺪول ،ﻳﻚ ﻛﺪ ﻣﻨﺤـﺼﺮ ﺑﻔـﺮد ﺑـﻪ ﻛـﺎرﺑﺮ
ﺗﻌﻠﻖ ﻣﻲ ﮔﻴﺮد .اﻳﻦ ﺻﻔﺤﻪ ﻧﻴﺎزي ﻧﺪارد ﺑﺼﻮرت Ajaxﭘﻴﺎده ﺳﺎزي ﺷﻮد.
ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ RegisterUser.php
در اﻳﻦ ﺻﻔﺤﻪ ﺑﻌﺪ از درﻳﺎﻓﺖ اﻃﻼﻋﺎت ﻛﺎرﺑﺮي ﺑﺎ ﻓﺸﺮدن دﻛﻤﻪ ﺛﺒﺖ ﺻﻔﺤﻪ register.phpﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ
ﺷﻮد .ﺗﺎﺑﻊ checkدر اﻳﻦ ﺻﻔﺤﻪ ﺑﺮاي ﺑﺮرﺳﻲ ﻳﻜﺴﺎن ﺑﻮدن رﻣﺰ ﻋﺒﻮر وﺗﻜﺮار آن ﻣﻲ ﺑﺎﺷﺪ.
{)(function check
if(document.getElementById('pas1').value!=document
).getElementById('pas2').value
رﻣﺰ و ﺗﻜﺮار آن را ' = document.getElementById('error').innerHTML
;'ﻳﻜﺴﺎن وارد ﻧﻤﺎﻳﺪ
else
;'' = document.getElementById('error').innerHTML
}
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 164
. ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮدPOST ﺑﺎ ﻣﺘﺪregister.php ﻫﻤﺎن ﻃﻮر ﻛﻪ ﻣﺸﺨﺺ اﺳﺖ ﻫﻨﮕﺎم ﺛﺒﺖ اﻃﻼﻋﺎت ﺻﻔﺤﻪ
<form action="register.php" method=POST >
Register.php ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
. ( ﺑﻪ اﻳﻦ ﺻﻔﺤﻪ درﻳﺎﻓﺖ ﻣﻲ ﺷﻮﻧﺪPOST ﺷﺪه )ارﺳﺎل ﺷﺪه ﺗﻮﺳﻂ ﻣﺘﺪpost در اﻳﻦ ﺻﻔﺤﻪ اﺑﺘﺪا ﻣﻘﺎدﻳﺮ
<?php
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$address = $_POST['address'];
$tel = $_POST['tel'];
$mail = $_POST['mail'];
$username = $_POST['username'];
$pass1 = $_POST['pass1'];
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
$res = mysql_query($q);
ﻓﺼﻞ 165 7 ﺑﺮﻧﺎﻣﻪ BookStore
}
else
;$res=NULL
ﻧﻬﺎﻳﺘﺎ اﮔﺮ ﻛﺪ ﻛﺎرﺑﺮي ﺗﻜﺮاري ﺑﻮد ﭘﻴﻐﺎم unsuccessfulرا ﺑﺮﻣﻲ ﮔـﺮداﻧﻴﻢ و در ﺻـﻮرت ﺻـﺤﺖ اﻃﻼﻋـﺎت
ورودي ﺑﻌﺪ از ﺛﺒﺖ ﺷﺪن ﻛﺎرﺑﺮ ،ﺑﻪ ﺻﻔﺤﻪ login.htmlﻣﻲ روﻳﻢ.
) if($res
;">echo "<script> window.location='login.html'</script
else
echo "<script> window.location='registerUser.php?msg
;">=unsuccessful'</script
;)mysql_close($link
>?
ﻋﻤﻠﻴﺎت ﻣﺸﺘﺮك ﺑﺮاي ﻛﺎرﺑﺮان
ﻳﻜﻲ از اﻳﻦ ﻋﻤﻠﻴﺎت ﻫﺎ login ،اﺳﺖ ﻣﻲ ﺗﻮاﻧﻴﻢ ﺑﺮاي اﻳﻦ ﻗﺴﻤﺖ ﻳﻚ ﺻـﻔﺤﻪ ﻣﺠـﺰا ﻃﺮاﺣـﻲ ﻛﻨـﻴﻢ و ﻳـﺎ آن را
ﺑﻌﻨﻮان ﺑﺨﺸﻲ در ﺻﻔﺤﻪ اﺻﻠﻲ ﺳﺎﻳﺖ ﻗﺮار دﻫﻴﻢ .در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻳﻚ ﺻﻔﺤﻪ ﻣﺠﺰا ﺑﺮاي loginدر ﻧﻈﺮﮔﺮﻓﺘﻪ ﺷـﺪه
اﺳﺖ .ﺷﺎﻳﺪ در ﻧﻈﺮ ﮔﺮﻓﺘﻦ ﻳﻚ ﺻﻔﺤﻪ ﻣﺠﺰا ﻛﻤﻲ ﺑﻬﺘﺮ ﺑﺎﺷﺪ زﻳﺮا ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ داﺷﺘﻦ ﻳﻚ ﺻـﻔﺤﻪ ﺗﻘﺮﻳﺒـﺎ ﺧـﺎﻟﻲ ﻣـﻲ
ﺗﻮاﻧﻴﺪ ﺧﻄﺎﻫﺎي زﻣﺎن ورود ﺑﻪ ﺳﺎﻳﺖ را در ﻫﻤﺎن ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ دﻫﻴﺪ و ﻧﻴﺎز ﻧﺒﺎﺷﺪ ﺻﻔﺤﻪ ي دﻳﮕـﺮي را ﺑﺎرﮔـﺬاري
ﻛﻨﻴﺪ .ﻳﻚ ﻣﺰﻳﺖ دﻳﮕﺮ ﻛﻪ ﺻﻔﺤﻪ ورود ﺟﺪاﮔﺎﻧﻪ ﻃﺮاﺣﻲ ﺷﻮد اﻳـﻦ اﺳـﺖ ﻛـﻪ در ﺻـﻔﺤﻪ اﺻـﻠﻲ و ﺻـﻔﺤﻪ ورود،
ﻓﻀﺎي ﺧﺎﻟﻲ ﺑﻴﺸﺘﺮي ﺑﺮاي ﻗﺮار ﮔﺮﻓﺘﻦ ﮔﺰﻳﻨﻪ ﻫﺎي دﻳﮕﺮ )ﻣﺎﻧﻨﺪ ﺗﺒﻠﻴﻐﺎت( ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
ﺑﻌﺪ از ﺛﺒﺖ اﻃﻼﻋﺎت ،ﻛﺎرﺑﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﻪ ﺻﻔﺤﻪ ﺷﺨﺼﻲ ﺧﻮد در ﺳﺎﻳﺖ وارد ﺷﻮد .در ﺻﻔﺤﻪ ورود ﺑﻪ ﺳـﺎﻳﺖ ﻛـﺪ
ﻛﺎرﺑﺮي و رﻣﺰ ﻋﺒﻮر را وارد ﻣﻲ ﻛﻨﺪ .ﭼﻚ ﺷﺪن ﺻﺤﺖ اﻃﻼﻋﺎت ﻛﺎرﺑﺮي ﺑـﺎ ﻓﺮاﺧـﻮاﻧﻲ ﺻـﻔﺤﻪ login.php
اﻧﺠﺎم ﻣﻲ ﮔﻴﺮد .ارﺳﺎل اﻃﻼﻋﺎت ﻛﺎرﺑﺮي ﺑﻪ ﺳﻤﺖ ﺳﺮور ﺑﺎ Ajaxﭘﻴﺎده ﺳﺎزي ﺷﺪه اﺳﺖ.
ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ login.html
در اﻳﻦ ﺑﺮﻧﺎﻣﻪ ﻧﻴﺰ از ﻛﻼﺳﻲ ﻛﻪ ﺑﺮاي Ajaxدر ﻓﺼﻞ ﻗﺒﻞ ﻧﻮﺷﺘﻪ اﻳﻢ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﻴﻢ.
"<script type="text/javascript
>src="Java_script/Asynchronous.js"></script
اﻳﻦ ﺻﻔﺤﻪ ﺑﺮاي درﻳﺎﻓﺖ اﻃﻼﻋﺎت ﻛﺪﻛﺎرﺑﺮي و رﻣﺰ ﻋﺒﻮر ﺑﺮاي ورود ﺑﻪ ﺳﺎﻳﺖ ﻣـﻲ ﺑﺎﺷـﺪ .ﺑﻌـﺪ از ﻓـﺸﺮدن دﻛﻤـﻪ
' ورود' ﺗـﺎﺑﻊ loginﻓﺮاﺧــﻮاﻧﻲ ﻣــﻲ ﺷــﻮد و اﻃﻼﻋــﺎت را از textBoxﻫـﺎي ﻣــﺮ ﺑﻮﻃــﻪ ﮔﺮﻓﺘــﻪ و ﺑــﻪ ﺻــﻔﺤﻪ
login.phpﺑﺼﻮرت GETارﺳﺎل ﻣﻲ ﻛﻨﺪ.
در ﺗﺎﺑﻊ )( loginاﮔﺮ ﻣﺸﺨﺼﺎت ﻛﺎرﺑﺮ ﺻﺤﻴﺢ ﺑﺎﺷﺪ و ﻛﺎرﺑﺮ ﻋﻀﻮ ﺳﺎﻳﺖ ﺑﺎﺷـﺪ از ﺳـﺮور ﻣﻘـﺪار 200ﺑﻌﻨـﻮان
ﭘﺎﺳﺦ ارﺳﺎل ﻣﻲ ﺷﻮدﻛﻪ اﻳﻦ ﭘﺎﺳﺦ در responseTextﻗﺮار ﻣﻲ ﮔﻴﺮد ،اﮔﺮ ﻛﺎرﺑﺮ ،ﻣـﺪﻳﺮ ﺳـﺎﻳﺖ ﺑﺎﺷـﺪ ﻣﻘـﺪار
500ارﺳﺎل ﻣﻲ ﺷﻮد و در ﻏﻴﺮ اﻳﻨﺼﻮرت ﻳﻚ ﭘﻴﻐﺎم ﺧﻄﺎ در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﻴﻢ.
{)(function login
;)(asynchronous = new Asynchronous
asynchronous.complete = function(status, statusText
),responseText,responseXML
{
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 166
if (responseText=='200')
location.href("personal.html");
else if(responseText=='500')
location.href("admin.html");
else
document.getElementById('div1').innerHTML=
';'ﻟﻄﻔﺎ ﻛﺪ ﻛﺎرﺑﺮي ورﻣﺰ ﻋﺒﻮر را ﺻﺤﻴﺢ وارد ﻧﻤﺎﻳﻴﺪ
};
var txt = 'user='+document.getElementById('user').value
+'&pass='+document.getElementById('pass').value+'';
اﺳﺖ ﺑﺎﻳﺪ داده ﻫﺎي ارﺳﺎﻟﻲ را ﺑﻪ رﺷﺘﻪ ﻓﺮاﺧﻮاﻧﻲ ﺻﻔﺤﻪGET ﺑﻪ اﻳﻦ ﻋﻠﺖ ﻛﻪ ﻣﺘﺪ ارﺳﺎل داده ﻫﺎ ﺑﻪ ﺳﺮور ﺑﺼﻮرت
.اﺿﺎﻓﻪ ﺷﻮد
asynchronous.call('login.php?'+txt,'','GET');
}
ﺑﺎ اﻳﻦ دﺳﺘﻮر sqlﻛﺎرﺑﺮاﻧﻲ را ﺟﺴﺘﺠﻮ ﻣﻲ ﻛﻨـﻴﻢ ﻛـﻪ offlineﻫـﺴﺘﻨﺪ ﻳﻌﻨـﻲ .status=0در ﺻـﻮرﺗﻲ ﻛـﻪ
status=1ﺑﺎﺷﺪ ﻛﺎرﺑﺮ ﻗﺒﻼ وارد ﺳﺎﻳﺖ ﺷﺪه و ﺧﺎرج ﻧﺸﺪه و دﺳﺘﺮﺳﻲ ﺑﺎ ﻧﺎم ﻛﺎرﺑﺮﻳﻲ ﻛﻪ ﻫﻢ اﻛﻨـﻮن در ﺳـﺎﻳﺖ
اﺳﺖ ﻏﻴﺮﻣﺠﺎز اﺳﺖ.
$q = "select * from customers where '$user'=Username and
;" '$pass'=pass and status=0
;)$res = mysql_query($q,$link
;)$row = mysql_fetch_array($res
//
{)if(mysql_num_rows($res) == 1
;)(session_start
ﺷﻤﺎره ﻛﺎرﺑﺮ را در sessionﺑﺮاي ﻣﺮاﺟﻌﺎت ﺑﻌﺪي ذﺧﻴﺮه ﻣﻲ ﻛﻨﻴﻢ.
;]'$_SESSION['id'] = $row['customerid
{)'if($row['type']=='1
;'echo '500
}
ﻫﻨﮕﺎم ورود ﺑﻪ ﺳﺎﻳﺖ ﺗﻤﺎم رﻛﻮردﻫﺎي ﻫﻢ ﺷﻤﺎره ﺑﺎ اﻳﻦ ﻛﺎرﺑﺮ در ﺻﻮرت وﺟﻮد از ﺳﺒﺪ ﺧﺮﻳـﺪ ﺣـﺬف ﻣـﻲ ﺷـﻮد.
ﺟﺪول ﺳﺒﺪ ﺧﺮﻳﺪ ﻳﻚ ﺟﺪول ﻣﻮﻗﺘﻲ ﺑﺮاي ﻧﮕﻬﺪاري اﻃﻼﻋﺎت ﺧﺮﻳﺪ اﺳﺖ .اﻣﺎ ﻋﻠـﺖ ﺣـﺬف رﻛﻮردﻫـﺎ در ﻫﻨﮕـﺎم
ورود ،ﺑﺮاي آن اﺳﺖ ﻛﻪ اﻣﻜﺎن دارد ﻛﺎرﺑﺮي ﺑﺪون ﻗﻄﻌﻲ ﻛﺮدن ﺧﺮﻳﺪ از ﺳﺎﻳﺖ ﺧﺎرج ﺷﻮد در ﻧﺘﻴﺠـﻪ در ﻣﺮاﺟﻌـﻪ
ﺑﻌﺪي ﺑﻪ ﺳﺎﻳﺖ ﻧﻴﺎزي ﺑﻪ اﻗﻼم ﺧﺮﻳﺪ ﻗﺒﻠﻲ ﺧﻮد ﻧﺪارد.
{else
;" ]$cmd = "delete from sabad where customerid = $row[0
;)$r = mysql_query($cmd,$link
;'echo '200
}
}
;'else echo '50
;)mysql_close($link
>?
ﻋﻤﻠﻴﺎت ﻛﺎرﺑﺮ ﻋﻀﻮ ﺳﺎﻳﺖ
دﺳﺘﻪ دﻳﮕﺮ ﻋﻤﻠﻴﺎت ﻣﺮ ﺑﻮط ﺑﻪ ﻛﺎرﺑﺮ ﻋﻀﻮ ﺳﺎﻳﺖ ﻣـﻲ ﺑﺎﺷـﺪ .اﻳـﻦ ﻛـﺎرﺑﺮ ﻣـﻲ ﺧﻮاﻫـﺪ ﺑﻌـﺪ از ﺟـﺴﺘﺠﻮي ﻛﺘـﺎب و
ﻣﺸﺎﻫﺪه اﻃﻼﻋﺎت ﻛﺘﺎب آن را ﺧﺮﻳﺪاري ﻛﻨﺪ ،ﺑﺘﻮاﻧﺪ ﻛﺘﺎﺑﻬﺎي ﺧﺮﻳﺪاري ﺷﺪه را در ﺳﺒﺪ ﺧﺮﻳـﺪ ﻣـﺸﺎﻫﺪه ﻧﻤﺎﻳـﺪ ،از
ﻣﻴﺰان ﻣﻮﺟﻮدي ﺧﻮد آﮔﺎه ﺷﻮد و ﻟﻴﺴﺖ ﺧﺮﻳﺪ ﻫﺎي ﻗﺒﻠﻲ ﺧﻮد را ﻣﺸﺎﻫﺪه ﻛﻨﺪ .ﻣﺎ اﻳﻦ ﻋﻤﻠﻴـﺎت را در ﻳـﻚ ﺻـﻔﺤﻪ
ﻗﺮار دادﻳﻢ .ﻃﺮاﺣﻲ اﻳﻦ ﺻﻔﺤﻪ را ﻣﻲ ﺗﻮاﻧﻴﺪ در ﺷﻜﻞ 8-5ﻣﺸﺎﻫﺪه ﻧﻤﺎﻳﺪ.
ﺑﺮﻧﺎﻣﻪ BookStore 168ﻓﺼﻞ 7
اﻳﻦ ﺻﻔﺤﻪ ،ﺻﻔﺤﻪ ي ﺷﺨﺼﻲ ﻛﺎرﺑﺮ اﺳﺖ ﻛﻪ ﺑﻌﺪ از ورود ﺑﻪ ﺳﺎﻳﺖ ﻣﺸﺎﻫﺪه ﻣـﻲ ﺷـﻮد در ﺳـﻤﺖ راﺳـﺖ ﺻـﻔﺤﻪ
اﻃﻼﻋﺎت ﺷﺨﺼﻲ ﻛﺎرﺑﺮ ﺑﻬﻤﺮاه ﻣﻴﺰان ﻣﻮﺟﻮدﻳﺶ ﻧﺸﺎن داده ﻣﻲ ﺷـﻮد و اﻳـﻦ ﺻـﻔﺤﻪ اﻣﻜﺎﻧـﺎﺗﻲ از ﻗﺒﻴـﻞ ﺟـﺴﺘﺠﻮي
ﻛﺘﺎب ،ﺧﺮﻳﺪ ﻛﺘﺎب ،ﻣﺸﺎﻫﺪه ﻟﻴﺴﺖ ﺧﺮﻳﺪ ﻗﺒﻠﻲ ،ﻣﺸﺎﻫﺪه ﺳﺒﺪ ﺧﺮﻳﺪ ،ﺣﺬف از ﺳـﺒﺪ ﺧﺮﻳـﺪ ،ارﺳـﺎل ﭘﻴـﺎم ﺑـﻪ ﻣـﺪﻳﺮ
ﺳﺎﻳﺖ را ﻓﺮاﻫﻢ ﻣﻲ ﻛﻨﺪ .ﻫﻨﮕﺎﻣﻲ ﻛﻪ ﺻﺤﺖ اﻃﻼﻋﺎت در ﺻـﻔﺤﻪ loginﭼـﻚ ﺷـﻮد اﻳـﻦ ﺻـﻔﺤﻪ loadﻣـﻲ
ﺷﻮد.
ﺑﺮرﺳﻲ ﻗﺴﻤﺖ اول ﻛﺪﻫﺎي ﺻﻔﺤﻪ Personal.HTML
ﺗﺎ ﺑﻊ showﺑﺮاي ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﻛﺎرﺑﺮ در ﻛﺎدري در ﺳﻤﺖ راﺳﺖ ﺳﺎﻳﺖ ﻫﻨﮕﺎم ورود ﺑﻪ ﺳﺎﻳﺖ ﻓﺮاﺧـﻮاﻧﻲ ﻣـﻲ
ﺷﻮد .ﺑﺮاي اﻳﻨﻜﻪ ﺑﺘﻮاﻧﻴﻢ اﻳﻦ ﺗﺎﺑﻊ در زﻣﺎن ﺑﺎر ﺷﺪن ﺻﻔﺤﻪ اﺟﺮا ﺷﻮد ﻓﺮاﺧﻮاﻧﻲ آن را در ﺧﺎﺻﻴﺖ onloadﺗـﮓ
> <bodyﻗﺮار ﻣﻲ دﻫﻴﻢ.
"<body bgcolor="#fbf9f3 >";)(onLoad="show
ﺗﺎﺑﻊ showﺻﻔﺤﻪ showInfo.phpرا ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨـﺪ و اﻃﻼﻋـﺎت درﻳـﺎﻓﺘﻲ از اﻳـﻦ ﻓﺮاﺧـﻮاﻧﻲ را ﻛـﻪ در
responseTextﻗﺮار دارد در ﻳﻚ divﺑﺎ ’ id=’div1ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪ.
;document.getElementById('div1').innerHTML=responseText
;}
;)'asynchronous.call('showInfo.php','','GET
}
ﻓﺼﻞ 169 7 ﺑﺮﻧﺎﻣﻪ BookStore
ﺷﻤﺎره رﻛـﻮردي اﺳـﺖ ﻛـﻪ ﺑﻌﻨـﻮان آدرس ﺷـﺮوعsearchBook از ﺗﺎﺑﻊCounter ﭘﺎراﻣﺘﺮ.اﻟﺤﺎق ﻣﻲ ﺷﻮد
. ﻧﺘﺎﻳﺞ ﺟﺴﺘﺠﻮ را ﺑـﺮاي ﻣـﺸﺎﻫﺪه ﺑﻬﺘـﺮ ﺻـﻔﺤﻪ ﺑﻨـﺪي ﻣـﻲ ﻛﻨـﻴﻢ. ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ اﺳﺘﻔﺎده ﻣﻲ ﺷﻮد،رﻛﻮردﻫﺎي ﺟﻮاب
ﻧﻤـﺎﻳﺶ داده ﻣـﻲid='div2' ﺑـﺎdiv رﻛﻮردﻫﺎي ﺟﻮاب ﺑﺮاي ﻧﻤﺎﻳﺶ در ﻗـﺴﻤﺖ ﻣﺮﻛـﺰي ﺻـﻔﺤﻪ در ﻳـﻚ
.ﺷﻮﻧﺪ
function searchBook(counter){
asynchronous = new Asynchronous();
asynchronous.complete = function(status, statusText,
responseText, responseXML){
document.getElementById('div2').innerHTML=responseText;
};
var t=document.form1.select1.options[document.form1.select1
.selectedIndex].value;
var searchTxt = document.getElementById('txt1').value;
var msg = 'number=' +t+'&txt1=' +searchTxt+'&count=
'+counter+'';
asynchronous.call( 'searchBookUser.php?'+msg,'','GET');
}
$res = mysql_query($q,$link);
$num = mysql_num_rows($res);
$k = $num/3;
. رﻛﻮرد ﺑﺮاي ﻧﻤﺎﻳﺶ اﻧﺘﺨﺎب ﻣﻲ ﺷﻮﻧﺪ3 در ﻫﺮ ﺻﻔﺤﻪ
$q.=" limit $count,3";
$res = mysql_query($q,$link);
171 7 ﻓﺼﻞ BookStore ﺑﺮﻧﺎﻣﻪ
$row = mysql_fetch_array($res);
document.getElementById('row2').innerHTML=responseText;
};
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 172
asynchronous.call( 'sabad.php?'+msg,'','GET');
}
Sabad.php ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
اﻃﻼﻋـﺎت ﻛـﺎرﺑﺮ از.اﻳﻦ ﺻـﻔﺤﻪ ﺑـﺮاي ﺑﺎزﻳـﺎﺑﻲ اﻃﻼﻋـﺎت ﺧﺮﻳـﺪ از ﺳـﺒﺪ ﺧﺮﻳـﺪ ﺑـﺮاي ﻳـﻚ ﻛـﺎرﺑﺮ ﺧـﺎص اﺳـﺖ
. درﻳﺎﻓﺖ ﻣﻲ ﺷﻮدsession
<?php
$count = $_GET['num'];
session_start();
$u = $_SESSION['id'];
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
//
.ﺗﻤﺎﻣﻲ رﻛﻮردﻫﺎي ﻛﻪ ﺑﺮاي اﻳﻦ ﻛﺎرﺑﺮ ﻣﻲ ﺑﺎﺷﻨﺪ از ﺟﺪول ﺳﺒﺪ ﺧﺮﻳﺪ ﺑﺎزﻳﺎﺑﻲ ﻣﻲ ﺷﻮﻧﺪ
$q = "select * from sabad where customerid = $u";
$rs = mysql_query($q,$link);
$num = mysql_num_rows($rs);
$k = $num/5;
.ﺗﺎ ﺻﻔﺤﻪ ﺑﻨﺪي ﺷﺪه و ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮﻧﺪ5 ﺗﺎ5 اﻳﻦ رﻛﻮردﻫﺎ ﺑﺼﻮرت
$q = "select * from sabad where customerid = $u
limit $count,5";
$res = mysql_query($q,$link);
$row = mysql_fetch_array($res);
//
$str = "<table width=100%><tr><th ></th>
<th style='color:#660000 'align=left><ﻗﻴﻤﺖ/th>
<th style='color:#660000 'align=left><ﻧﺎم ﻛﺘﺎب/th>
</tr>";
while($row){
. ﻣﺎﻧﻨﺪ ﻗﻴﻤﺖ ﻛﺘﺎب ﻛﻪ ﻻزم اﺳﺖ از ﺟﺪول ﻛﺘﺎب ﺧﻮاﻧﺪه ﻣﻲ ﺷﻮد،اﻃﻼﻋﺎت ﻛﺘﺎب
$q = "select * from book where code= $row[0]";
$rt = mysql_query($q,$link);
$r = mysql_fetch_array($rt);
//
$str.="<tr><td onclick='del($row[0]);'
style='cursor:pointer;color:#0000ff'><ﺣﺬف/td>
<td>$row[3]</td><td>$r[2]</td></tr>";
$row = mysql_fetch_array($res);
}
$str .= '</table><br><p align=center>';
for($i=0;$i < $k; $i++){
$m = $i+1;
$str.= "<a onclick='showSabad(($i)*5);'
style='cursor:pointer'>$m</a> ";
173 7 ﻓﺼﻞ BookStore ﺑﺮﻧﺎﻣﻪ
}
$str.='</p>';
echo $str;
mysql_close($link);
?>
Personal.HTML ﺑﺮرﺳﻲ ﻗﺴﻤﺖ ﭼﻬﺎرم ﻛﺪﻫﺎي ﺻﻔﺤﻪ
ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮد و اﻃﻼﻋـﺎت ﻛـﺪ ﻛﺘـﺎب را ﺑـﺮاي اﺿـﺎﻓﻪbuy ﻫﻨﮕﺎﻣﻲ ﻛﻪ دﻛﻤﻪ ﺧﺮﻳﺪ ﻛﺘﺎب ﻛﻠﻴﻚ ﺷﻮد ﺗﺎﺑﻊ
ﻛﺪ ﻛﺘﺎﺑﻲ اﺳﺖ ﻛﻪ ﻗـﺼﺪ، در اﻳﻦ ﺗﺎﺑﻊe ﭘﺎراﻣﺘﺮ. ارﺳﺎل ﻣﻲ ﻛﻨﺪBuyBook.php ﺷﺪن ﺑﻪ ﺳﺒﺪ ﺧﺮﻳﺪ ﺑﻪ ﺻﻔﺤﻪ
ﺑـﺮاي. ارﺳـﺎل ﻣـﻲ ﺷـﻮدBuyBook.php ﺑﻪ ﺻﻔﺤﻪnum اﻳﻦ ﭘﺎراﻣﺘﺮ و ﺗﻌﺪاد ﺧﺮﻳﺪ ﺑﻮﺳﻴﻠﻪ.ﺧﺮﻳﺪ آن را دارﻳﻢ
. ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﺷﻮدshowSabad(0)ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت ﺧﺮﻳﺪ در ﺳﺒﺪ ﺧﺮﻳﺪ ﺑﻌﺪ از ﺧﺮﻳﺪ ﻛﺘﺎب ﺗﺎﺑﻊ
function buy(e){
;$totalp = $row[7]*$num
//
ﺑﻪ ﺳﺒﺪ ﺧﺮﻳﺪ رﻛﻮردي را ﺣﺎوي ﻛﺪ ﻛﺘﺎب ،ﻗﻴﻤﺖ ﻛﺘﺎب ،ﺗﻌﺪاد ﺧﺮﻳﺪ ،ﺟﻤﻊ ﻛﻞ ،و ﺗﺎرﻳﺦ وﺳﺎﻋﺖ ﺧﺮﻳـﺪ اﺿـﺎﻓﻪ
ﻣﻲ ﻛﻨﻴﻢ.
$q = "insert into sabad values
;")'($row[0],$row[7],$num,$totalp,$u,'$date
;)$r = mysql_query($q,$link
;'echo '200
;)mysql_close($link
>?
;)showSabad(0
;}
;''var msg = 'code=' +e+
;)'asynchronous.call( 'DelSabad.php?'+msg,'','GET
}
175 7 ﻓﺼﻞ BookStore ﺑﺮﻧﺎﻣﻪ
document.getElementById('div2').innerHTML=responseText;
};
$q.="limit $count,5";
$res = mysql_query($q,$link);
$row = mysql_fetch_array($res);
{
$q="select * from book where code =$row[0]";
$rs = mysql_query($q,$link);
$r = mysql_fetch_array($rs);
$str.="<tr><td> $r[2]</td><td>$row[2]</td>
<td>$row[3]</td><td>$row[5]</td></tr>";
$row = mysql_fetch_array($res);
}
$str.='</table><br><p align=center>';
for($i=0;$i < $k; $i++){
$m = $i+1;
$str.= "<a onclick='list(($i)*5);'
style='cursor:pointer'>$m</a> ";
}
$str.='</p>';
echo $str;
mysql_close($link);
?>
session_destroy();
echo "<script> window.location='login.html'</script>";
mysql_close($link);
?>
ﻋﻤﻠﻴﺎت ﻣﺮﺑﻮط ﺑﻪ ﻣﺪﻳﺮ ﺳﺎﻳﺖ
وﻳـﺮاﻳﺶ، ﺣـﺬف ﻛﺘـﺎب، ﺻﻔﺤﻪ ي ﻣﺪﻳﺮ ﺳﺎﻳﺖ ﻣﻲ ﺑﺎﺷﺪ ﻛـﻪ اﻣﻜﺎﻧـﺎﺗﻲ از ﻗﺒﻴـﻞ اﺿـﺎﻓﻪ ﻛـﺮدن ﻛﺘـﺎب8-8 ﺷﻜﻞ
، ﺷﺎرژ ﻣﻮﺟـﻮدي ﻛـﺎرﺑﺮان، ﻣﺸﺎﻫﺪه ﺗﻤﺎﻣﻲ ﻛﺎرﺑﺮان، ﻣﺸﺎﻫﺪه ﻟﻴﺴﺖ ﺧﺮﻳﺪ ﻛﺎرﺑﺮان، ﻛﺮدن ﻓﺎﻳﻞupload ،ﻛﺘﺎب
.ﻣﺸﺎﻫﺪه ﻟﻴﺴﺖ ﺷﺎرژ و ﺟﺴﺘﺠﻮي ﻛﺘﺎب را داراﺳﺖ
Admin.html ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
<script type="text/javascript"
src="Java_script/Asynchronous.js"></script>
searchBookAd.php ﺑـﺎ ﻓﺮاﺧـﻮاﻧﻲ ﺻـﻔﺤﻪAdmin ﺟﺴﺘﺠﻮي ﻛﺘﺎب را در ﺻﻔﺤﻪsearchBookﺗﺎﺑﻊ
. ﺑﺮ ﻋﻬﺪه داردAjax ﺑﺼﻮرت
function searchBook(counter){
asynchronous = new Asynchronous();
asynchronous.complete = function(status, statusText,
responseText, responseXML){
document.getElementById('div2').innerHTML=responseText;
};
var t=document.form1.select1.options[document.form1.
select1.selectedIndex].value;
var searchTxt = document.getElementById('txt1').value;
var msg = 'number=' +t+'&txt1=' +
searchTxt+'&count='+counter+'';
asynchronous.call( 'searchBookAd.php?'+msg,'','GET');
}
. را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪsearchUser.php اﻳﻦ ﺗﺎﺑﻊ ﺑﺮاي ﻣﺸﺎﻫﺪه اﻃﻼﻋﺎت ﺧﺮﻳﺪ ﻳﻚ ﻛﺎرﺑﺮ ﺻﻔﺤﻪ
function InfoCustomer(e){
ajax = new Asynchronous();
ajax.complete = function(status, statusText,
responseText, responseXML){
document.getElementById('div2').innerHTML=responseText;
};
var user=document.getElementById('txt2').value;
var msg ='user='+user+'&count='+e;
ajax.call('searchuser.php?'+msg,'','GET');
};
اﻳــﻦ ﺗــﺎﺑﻊ ﺻــﻔﺤﻪ. زﻣــﺎﻧﻲ ﻓﺮاﺧــﻮاﻧﻲ ﻣــﻲ ﺷــﻮدﻛﻪ ﻳــﻚ ﻛﺘــﺎب را ﻣــﻲ ﺧــﻮاﻫﻴﻢ ﺣــﺬف ﻛﻨــﻴﻢDel ﺗــﺎﺑﻊ
. را ﻓﺮاﺧﻮاﻧﻲ ﻣﻲ ﻛﻨﺪdeleteBook.php
function Del(e){
ajax = new Asynchronous();
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 180
function sharj(i){
if(document.getElementById(i).style.display=='none'){
document.getElementById(i).style.display='block';
}
else
document.getElementById(i).style.display='none';
}
. ارﺳﺎل ﻣﻲ ﻛﻨﺪsharj.php ﻣﻘﺎدﻳﺮ ﺑﺮاي ﺷﺎرژ را درﻳﺎﻓﺖ و ﺑﻪ ﺻﻔﺤﻪgetData ﺗﺎﺑﻊ
function getData(te){
ajax = new Asynchronous();
181 7 ﻓﺼﻞ BookStore ﺑﺮﻧﺎﻣﻪ
document.getElementById('div2').innerHTML=responseText;
};
var msg ='u='+e;
ajax.call('showUser.php?'+msg,'','GET');
}
. ﻟﻴﺴﺖ ﺷﺎرژ ﻫﺎ و ﺗﺎرﻳﺦ آن ﻫﺎ را ﺑﺮاي ﻫﺮ ﻛﺎرﺑﺮ ﻧﻤﺎﻳﺶ ﻣﻲ دﻫﺪlistSharj ﺗﺎﺑﻊ
function listSharj(e){
if(document.getElementById('div8').style.display=='none')
document.getElementById('div8').style.display='block';
else
document.getElementById('div8').style.display='none';
ajax = new Asynchronous();
ajax.complete = function(status, statusText,
responseText, responseXML){
document.getElementById('div8').innerHTML=responseText;
};
var msg ='u='+e;
ajax.call('listSharj.php?'+msg,'','GET');
}
searchUser.php ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
.ﺟﺴﺘﺠﻮي ﻳﻚ ﻛﺎرﺑﺮ و ﻧﻤﺎﻳﺶ اﻃﻼﻋﺎت آن ﻛﺎرﺑﺮ ﺗﻮﺳﻂ اﻳﻦ ﺻﻔﺤﻪ اﻧﺠﺎم ﻣﻲ ﮔﻴﺮد
<?php
$u=$_GET['user'];
if($u){
$count=$_GET['count'];
session_start();
$link=mysql_connect('localhost','root','');
mysql_select_db('bookstore');
$q="select * from customers where username='$u'";
$rs = mysql_query($q,$link);
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 182
$t=mysql_fetch_array($rs);
if($t){
$id=$t[0];
//
$str="<p align=center ><table
width=100%><tr>
<td onclick='listSharj($id);'
style='color=#660000;font-size:18px;
cursor:pointer'><ﻟﻴﺴﺖ ﺷﺎرژﻫﺎ/td>
<td >$t[6]</td><td style='color
=#660000;font-size:18px'> ﻣﻮﺟﻮدي
</td><td >$t[7]</td><td style=
'color=#660000;font-size:18px'>
< ﻛﺪﻛﺎرﺑﺮي/td><td >$t[1]</td>
<td style='color=#660000;
font-size:18px'><ﻧﺎم/td></tr>
</table></p><div id='div8'
style='display:none'></div>";
//
. ﻣﻲ ﺑﺎﺷﺪarchive از ﺟﺪول$id زﻳﺮ ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ اﻃﻼﻋﺎت ﻛﻞ ﺧﺮﻳﺪ ﻳﻚ ﻛﺎرﺑﺮ ﺑﺎ ﻛﺪsqlدﺳﺘﻮر
$q="select * from archive where ustomerid=$id";
$res=mysql_query($q,$link);
$num = mysql_num_rows($res);
$k = $num/5;
$row=mysql_fetch_array($res);
$q=" select * from archive where
customerid=$id limit $count,5";
$r=mysql_query($q);
$rs=mysql_fetch_array($r);
//
$str.="<table width=100%><tr><th
style='color:#660000 '
align=left><ﻧﺎم ﻛﺘﺎب/th><th
style='color:#660000 '
align=left><ﺗﻌﺪاد ﻛﺘﺎب/th><th
style='color:#660000 '
align=left><ﻗﻴﻤﺖ ﻛﺘﺎب/th><th
style='color:#660000 '
align=left><ﺗﺎرﻳﺦ ﺧﺮﻳﺪ/th></tr>";
while ($rs!=NULL)
{
. زﻳﺮ ﺑﺮاي ﺑﺎزﻳﺎﺑﻲ اﻃﻼﻋﺎت ﻛﺘﺎب ﻫﺎي ﺧﺮﻳﺪاري ﺷﺪه اﺳﺖsqlدﺳﺘﻮر
$q1= "select * from book where
code=$rs[0]";
183 7 ﻓﺼﻞ BookStore ﺑﺮﻧﺎﻣﻪ
$t=mysql_query($q1);
$rt=mysql_fetch_array($t);
$str.="<tr><td>$rt[2]</td><td>
$rs[2]</td><td>$rs[3]</td>
<td>$rs[5]</td></tr>";
$rs=mysql_fetch_array($r);
}
$str .= '</table><br><p align=center>';
for($i=0;$i < $k; $i++){
$m = $i+1;
$str.="<a
onclick='InfoCustomer(($i)*5);'
style='cursor:pointer'>$m</a> ";
}
$str.='</p>';
echo $str;
}
mysql_close($link);
}
?>
ﻧﻤﻮ ﻧﻪ ي از اﻃﻼﻋﺎت ﻛﺎرﺑﺮان ﺑﻬﻤﺮاه اﻃﻼﻋﺎت ﺧﺮﻳﺪ ﻛﺎرﺑﺮان و اﻃﻼﻋﺎت ﻟﻴـﺴﺖ ﺷـﺎرژ را ﻣـﺸﺎﻫﺪه8-9 در ﺷﻜﻞ
.ﻣﻲ ﻛﻨﻴﺪ
ShowUser.Phpﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
.ﺟﺴﺘﺠﻮي ﺗﻤﺎﻣﻲ ﻛﺎرﺑﺮان ﻋﻀﻮ ﺳﺎﻳﺖ ﺑﺮ ﻋﻬﺪه اﻳﻦ ﺻﻔﺤﻪ اﺳﺖ
<?php
$count=$_GET['u'];
session_start();
$link=mysql_connect('localhost','root','');
mysql_select_db('bookstore');
$q="select *from customers where type=0";
$res=mysql_query($q,$link);
$num=mysql_num_rows($res);
$k=$num/5;
$q="select *from customers where type=0 limit $count,5";
$res=mysql_query($q,$link);
$row=mysql_fetch_array($res);
$id = $row[0];
$str='<table width=100% ><tr><th></th><th align=left
style="color:#660000"><ﻣﻮﺟﻮدي/th><th align=left
style="color:#660000"><ﺗﻠﻔﻦ/th><th align=left
style="color:#660000"><ﻛﺪﻛﺎرﺑﺮي/th><th align=left
style="color:#660000"><ﻧﺎم/th></tr>';
while ($row!=NULL){
$id = $row[0];
$tid = $id.'a';
BookStore ﺑﺮﻧﺎﻣﻪ 7 ﻓﺼﻞ 184
$str.="<tr><td onclick='sharj($id);'
style='cursor:pointer;color:#FF3300;
font-size:18px'><ﺷﺎرژ ﻣﻮﺟﻮدي/td><td>$row[6]</td>
<td>$row[4]</td><td>$row[7]</td><td>$row[1]
</td></tr><tr><td><div id='$id'
style='display:none'> <input type=button
value=' 'ﺛﺒﺖstyle='font-family:Tahoma;
font-size:12px;color:#660000;width:50px'
onclick='getData($id);'> <input type=text
id='$tid' style='width=70px'>
</div>
<hr style='color:#660000'></hr></td></tr>";
$row=mysql_fetch_array($res);
}
$str.='</table><p align=center >';
for ($i=0;$i<$k;$i++){
$m=$i+1;
$str.="<a onclick='showUser($i*5)'
style='cursor:pointer'>$m</a>";
}
$str.='</p>';
echo $str;
?>
$row = mysql_fetch_array($res);
$str='<table width=100%>';
while($row){
$str.="<tr><td>$row[2]</td><td>$row[1]</td></tr>";
$row = mysql_fetch_array($res);
}
$str.='</table>';
echo $str;
?>
ﺻﻔﺤﻪ ي اﺳﺖ ﻛﻪ ﻣﺪﻳﺮ ﻣﻲ ﺗﻮاﻧﺪ ﺑﺎ ﻛﻠﻴﻚ ﻛﺮدن ﺑـﺮ روي ﻫـﺮ ﻛـﺪام ﻳـﻚ از ﮔﺰﻳﻨـﻪ ﻫـﺎي ﺣـﺬف و8-11ﺷﻜﻞ
.وﻳﺮاﻳﺶ ﻋﻤﻠﻴﺎت را اﻧﺘﺨﺎب ﻧﻤﺎﻳﺪ
serachBookad.php ﺑﺮرﺳﻲ ﻛﺪﻫﺎي ﺻﻔﺤﻪ
.ﻋﻤﻠﻴﺎت اﻳﻦ ﺑﺨﺶ ﺟﺴﺘﺠﻮي اﻃﻼﻋﺎت ﻛﺘﺎب ﺑﺮاي ﺻﻔﺤﻪ ﻣﺪﻳﺮ اﺳﺖ
$u=$_SESSION['code'];
$q.=" and code != $u ";
}
$res = mysql_query($q,$link);
$num = mysql_num_rows($res);
$k = $num/3;
//
$q.="limit $count,3";
$res = mysql_query($q,$link);
$row = mysql_fetch_array($res);
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
$q="select * from book where code=$code";
$r=mysql_query($q,$link);
$row=mysql_fetch_array($r);
?>
<?php
session_start();
$u = $_GET['code'];
$_SESSION['code']=$u;
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
$q="delete from book where code=$u";
mysql_query($q,$link);
mysql_close($link);
echo '200';
?>
$translater = $_POST['translater'];
$press = $_POST['press'];
$price = $_POST['price'];
$language = $_POST['language'];
$image = $_FILES['image'];
$path = $_FILES['path'];
$dir = 'mybookpic/'.$image['name'];
copy($image['tmp_name'],$dir);
$dir1 = 'mydownload/'.$path['name'];
copy($path['tmp_name'],$dir1);
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
$subject = $_POST['subject'];
$author = $_POST['author'];
$translater = $_POST['translater'];
$press = $_POST['press'];
$price = $_POST['price'];
. ﺑﮕﻴﺮﻳﺪ$_FILE ﺷﺪه را ﺑﺎﻳﺪ ﺑﺎ آراﻳﻪupload اﻃﻼﻋﺎت ﻓﺎﻳﻞ
$image = $_FILES['image'];
$language = $_POST['language'];
$path = $_FILES['path'];
ﭘﺎراﻣﺘﺮ اول اﻳﻦ دﺳﺘﻮر ﻣﺴﻴﺮ ﻣﻮﻗﺘﻲ ﻓﺎﻳﻞ. ﻛﺮدن ﻓﺎﻳﻞ ﺑﻪ ﭘﻮﺷﻪ ي درون ﺳﺮور اﺳﺖupload ﺑﺮايcopy دﺳﺘﻮر
.در وب ﺳﺮور و ﭘﺎراﻣﺘﺮ دوم ﻣﺴﻴﺮ اﺻﻠﻲ ﺑﺮاي ﻛﭙﻲ ﺷﺪن ﻓﺎﻳﻞ ﻣﻲ ﺑﺎﺷﺪ
$dir = 'mybookpic/'.$image['name'];
copy($image['tmp_name'],$dir);
$dir1 = 'mydownload/'.$path['name'];
copy($path['tmp_name'],$dir1);
$link = mysql_connect('localhost','root','');
mysql_select_db('BookStore');
if($res )
echo "<script>
window.location='insertBook.php?msg=1'</script>";
else
echo "<script>
window.location='insertBook.php?msg=0'</script>";
mysql_close($link);
?>
در ﺑﺮﻧﺎﻣﻪ ﻫﺎي وب ﺑﻮدAjax در اﻧﺘﻬﺎ ﻳﺎدآور ﻣﻲ ﺷﻮﻳﻢ ﻛﻪ اﻳﻦ ﻓﺼﻞ ﻓﻘﻂ ﻳﻚ ﻣﺜﺎﻟﻲ ﺑﺮاي ﻛﺎرﺑﺮدﻫﺎي ﺗﺠﺎري ﺗﺮ
ﻫﺮ ﭼﻨﺪ ﻛﻪ اﻳﻦ ﺑﺮﻧﺎﻣﻪ در ﻣﻘﻴﺎس ﻛﻮﭼﻜﻲ از ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺗﺠﺎري واﻗﻌﻲ اﺳﺖ وﻟـﻲ ﻣﻔـﺎﻫﻴﻢ اﺻـﻠﻲ آن ﺑﺮﻧﺎﻣـﻪ ﻫـﺎ را
.داراﺳﺖ
ﭘﻴﻮﺳﺖ 191 ﻧﺮم اﻓﺰار EsayPHP
اﻳﻦ ﻧﺮم اﻓﺰار ﻳﻚ وب ﺳﺮور ﻣﺤﻠﻲ ﺑﺮ روي ﺳﻴﺴﺘﻢ ﺷﻤﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ .اﻳﻦ وب ﺳﺮور ﺑﺮاي اﺟـﺮاي ﻛـﺪﻫﺎي PHPو ﺳـﺮوﻳﺲ دﻫـﻲ
ﺻﻔﺤﺎت وب ﺑﻪ ﺷﻤﺎ ﻛﻤﻚ ﻣﻲ ﻛﻨﺪ .ﻓﺎﻳﻞ ﻻزم ﺑﺮاي ﻧﺼﺐ EsayPHPدر CDﻛﺘﺎب ﻣﻮﺟﻮد ﻣﻲ ﺑﺎﺷﺪ.
ﻃﺮﻳﻘﻪ ﻧﺼﺐ ﻧﺮم اﻓﺰار
-1ﻓﺎﻳﻞ easyphp1-8_setup.exeرا اﺟﺮا ﻛﻨﻴﺪ.
-2زﺑﺎن ﻣﻮرد ﻧﻈﺮ ﺧﻮد را اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
ﺑﻌﺪ از ﻧﺼﺐ ﻧﺮم اﻓﺰار ،ﺑﻪ ﻣﺤﻞ ﻧﺼﺐ ﻧﺮم اﻓﺰار ﺑﺮوﻳﺪ و ﻓﺎﻳﻞ EsayPHP.exeرا اﺟﺮا ﻛﻨﻴﺪ.
در اﻳﻦ ﻣﺴﻴﺮ ﭘﻮﺷﻪ ي ﺑﻪ ﻧﺎم wwwوﺟﻮد دارد ﻛﻪ ﻣﺤﻠﻲ اﺳﺖ ﺑﺮاي اﻳﻦ ﻛﻪ ﺷﻤﺎ ﺻﻔﺤﺎت وب ﺧـﻮد را در آﻧﺠـﺎ ﻗـﺮار دﻫﻴـﺪ .اﻳـﻦ ﻧـﺮم
اﻓﺰار از mysqlﺑﺮاي ﻣﺪﻳﺮﻳﺖ ﺟﺪول ﻫﺎ اﺳﺘﻔﺎده ﻣﻲ ﻛﻨﺪ .در ﻣﺴﻴﺮ ﻧﺼﺐ ﺑﺮﻧﺎﻣﻪ ،ﭘﻮﺷـﻪ اي ﺑـﻪ ﻧـﺎم mysqlوﺟـﻮد دارد ﻛـﻪ در آن،
ﭘﻮﺷﻪ اي ﺑﻪ ﻧﺎم Dataاﺳﺖ ﻛﻪ ﻣﺤﻠﻲ اﺳﺖ ﻛﻪ در آن ﺟﺪول ﻫﺎي ﺑﺮﻧﺎﻣﻪ ﻗﺮار ﻣﻲ ﮔﻴﺮﻧﺪ.
اﻳﻦ ﻧﺮم اﻓﺰار وب ﺳﺮوري را ﺑﻪ آدرس http://localhost.comﻳﺎ 127.0.0.1ﺑﺮ روي ﺳﻴﺴﺘﻢ ﺷﻤﺎ اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ .ﺑﻌﺪ
از اﺟﺮاي EsayPHPﭘﻨﺠﺮه ي ﺑﻪ ﺷﻜﻞ زﻳﺮ ﻧﻤﺎﻳﺶ داده ﻣﻲ ﺷﻮد.
-1اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاي اﻳﻦ اﺳﺖ ﻛﻪ EsayPHPﻫﻨﮕﺎم ﺑﺎر ﺷﺪن وﻳﻨﺪوز اﺟﺮا ﺷﻮد.
-2اﮔﺮ ﻣﻲ ﺧﻮاﻫﻴﺪ ﻧﺮم اﻓﺰار ﻫﻤﻴﺸﻪ در ﺣﺎل اﺟﺮا ﺑﺎﺷﺪ اﻳﻦ ﮔﺰﻳﻨﻪ را اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
-3اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاي آن اﺳﺖ ﻛﻪ ﻫﻨﮕﺎم اﺟﺮاي ﻧﺮم اﻓﺰار ،ﺳﺮوﻳﺲ ﻫﺎي MySqlو Apacheﻫﻢ اﺟﺮا ﺷﻮﻧﺪ.
-4اﻳﻦ ﮔﺰﻳﻨﻪ ﻣﺸﺨﺺ ﻣﻲ ﻛﻨﺪ ﻛﻪ ﻫﻨﮕﺎم اﺟﺮاي ،EsayPHPوب ﺳﺎﻳﺖ آن ﺑﺮاي ﻧﺴﺨﻪ ﺟﺪﻳﺪﺗﺮ ﻧﺮم اﻓﺰار ﺑﺮرﺳﻲ ﺷﻮد.
-5اﻳﻦ ﮔﺰﻳﻨﻪ ﺑﺮاي ﺑﺮرﺳﻲ ﺧﻮدﻛﺎر ﻓﺎﻳﻞ ﻫﺎي ﭘﻴﻜﺮﺑﻨﺪي MySqlو Apacheﻣﻲ ﺑﺎﺷﺪ.
-6اﻧﺘﺨﺎب اﻳﻦ ﮔﺰﻳﻨﻪ ﻣﻮﺟﺐ ﺑﺮرﺳﻲ ﭘﻮرت ﻫﺎي MySqlو Apacheﺟﻬﺖ ﻓﻌﺎل ﻳﺎ ﻏﻴﺮ ﻓﻌﺎل ﺑﻮدن ﻣﻲ ﺷﻮد.
-7اﻧﺘﺨﺎب زﺑﺎن ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﭘﻴﻜﺮﺑﻨﺪي.
-8اﻋﻤﺎل ﺗﻐﻴﻴﺮات اﻧﺠﺎم ﺷﺪه.
در اﻳﻨﺠﺎ ﻟﻴﺴﺖ ﻓﺎﻳﻞ ﻫﺎي ﭘﻴﻜﺮﺑﻨﺪي ﻧﺮم اﻓﺰار آورده ﺷﺪه اﺳﺖ.
C:\Program Files\EasyPHP\EasyPHP.ini -
ﻓﺎﻳﻞ ﭘﻴﻜﺮﺑﻨﺪي ) EsayPHPاﻳﻦ ﻓﺎﻳﻞ ﻧﻴﺎزي ﺑﻪ ﺗﻐﻴﻴﺮ ﻧﺪارد(
ﻣﺮﺣﻠﻪ دوم :در اﻳﻦ ﺻﻔﺤﻪ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻳﻚ ﺑﺎﻧﻚ اﻃﻼﻋﺎﺗﻲ ﺑﺮاي ﺑﺮﻧﺎﻣﻪ ﺧﻮدﺗـﺎن اﻳﺠـﺎد ﻛﻨﻴـﺪ .ﺑـﺮاي اﻳﻨﻜـﻪ ﺟـﺪول ﻫـﺎي ﺷـﻤﺎ ﺑﺘﻮاﻧﻨـﺪ
ﻛﺎراﻛﺘﺮﻫﺎي ﻓﺎرﺳﻲ را ﭘﺸﺘﻴﺒﺎﻧﻲ ﻛﻨﻨﺪ Collationﺑﺎﻧﻚ را Utf_persian_ciاﻧﺘﺨﺎب ﻛﻨﻴﺪ.
ﻣﺮﺣﻠﻪ ﺳﻮم اﻧﺘﺨﺎب ﻧﺎم ﺑﺮاي ﺟﺪول و ﻣﺸﺨﺺ ﻧﻤﻮدن ﺗﻌﺪاد ﻓﻴﻠﺪ ﻫﺎي اﻃﻼﻋﺎﺗﻲ )ﺳﺘﻮن ﻫﺎي ﺟﺪول(.
ﺑﻌﺪ از ذﺧﻴﺮه ﻛﺮدن ﺟﺪول ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮاﺣﺘﻲ ﺑﺎ دﺳﺘﻮرات sqlﺑﺎ اﻳﻦ ﺟﺪول ﻫﺎ ﻛﺎر ﻛﻨﻴﺪ.
ﭘﻴﻮﺳﺖ 197 ﻧﺮم اﻓﺰار EsayPHP
ﺗﻨﻈﻴﻤﺎت MySql
PhpMyAdminﺑﺮاي دﺳﺘﺮﺳﻲ ﺑﻪ MySqlﻳﻚ ﻛﺪ ﻛﺎرﺑﺮي ' 'rootﺑﺪون رﻣﺰ ﻋﺒﻮر اﻳﺠﺎد ﻣﻲ ﻛﻨﺪ
ﺑﺮاي ﺗﻐﻴﻴﺮ رﻣﺰ ﻋﺒﻮر ﻣﺮاﺣﻞ زﻳﺮ را دﻧﺒﺎل ﻛﻨﻴﺪ:
ﻓﺎﻳﻞ ﭘﻴﻜﺮﺑﻨﺪي PhpMyAdminرا ﺑﺎز ﻛﻨﻴﺪ(config.inc.php).
ﻓﺎﻳﻞ را ذﺧﻴﺮه ﻛﻨﻴﺪ .اﻳﻦ ﺗﻐﻴﻴﺮ ﻣﻮﺟﺐ ﻣﻲ ﺷﻮد PhpMyAdminﻫﺮ زﻣﺎن ﻛﻪ اﺟـﺮا ﺷـﻮد از ﺷـﻤﺎ رﻣـﺰ ﻋﺒـﻮر را درﺧﻮاﺳـﺖ ﻛﻨـﺪ .در
ﻣﺮﺣﻠﻪ ﺑﻌﺪ از آﻳﻜﻮن PhpMyAdmin ،EsayPhpرا اﺟﺮا ﻛﻨﻴﺪ.
در ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ داده ﺷﺪه ﮔﺰﻳﻨﻪ ' 'Privilegesرا اﻧﺘﺨﺎب ﻛﻨﻴﺪ.
در اﻳﻦ ﺻﻔﺤﻪ ﺷﻤﺎ ﻣﻲ ﺗﻮاﻧﻴﺪ ﻛﺎرﺑﺮي را اﺿﺎﻓﻪ ،ﺣﺬف ﻳﺎ ﺗﻐﻴﻴﺮي در ﻣﺸﺨﺼﺎت آن اﻳﺠﺎد ﻛﻨﻴﺪ .ﺑﺮاي ﺗﻐﻴﻴﺮ رﻣﺰ ﻋﺒﻮر آﻳﻜﻮن Edit
Privilegesرا اﻧﺘﺨﺎب ﻧﻤﺎﻳﺪ.
ﭘﻴﻮﺳﺖ 199 ﻧﺮم اﻓﺰار EsayPHP
رﻣﺰ ﻋﺒﻮر ﺟﺪﻳﺪ ﺧﻮد را ﺗﺎﻳﭗ ﻛﺮده و دﻛﻤﻪ okرا ﻛﻠﻴﻚ ﻛﻨﻴﺪ.
اﻳﻦ ﻧﺮم اﻓﺰار ﺑﺴﻴﺎر ﺳﺎده و ﻛﺎرآﻣﺪ ﻣﻲ ﺑﺎﺷﺪ ﺷﻤﺎ ﺑﺮاﺣﺘﻲ ﻣﻲ ﺗﻮاﻧﻴﺪ ﺑﺮﻧﺎﻣﻪ ﻫﺎي ﺧﻮد را ﻧﻮﺷﺘﻪ و ﺗﺴﺖ ﻛﻨﻴﺪ.
ﻧﺮم اﻓﺰار EsayPHP 200ﭘﻴﻮﺳﺖ
:ﻣﻨﺎﺑﻊ
2-Ajax in Action
Copyright ©2006 by Manning Publications Co.
by: DAVE CRANE, ERIC PASCARELLO, WITH DARREN JAMES
7-http://ajax.asp.net/
8-www.getfirebug.com