168
Chương 7: Tạo các script làm việc trong mọi trình duyệt
Tọo cóc script làm việc
trong mọi trình duụệt
T ro n g ch ư ơ n g n à y b ạ n sẽ h ọ c n h ữ n g đ iểm ch ín h sa u đây:
B Tìm hiển các điểm khác biệt của trình dĩiyệt
K Phát hiện loại trình dĩiyệt nào mà người dừng đanq chạy
B Tnty 1 ’ấn mồ hình Ỳài liêi/
B Tuân theo các chuẩn web
M Viết mã nhiều trình duyệt
rong những ngày đầu p h át triển JavaS cript, việc xử lý những
sự b ất thường giữa những n h à sản xuất trìn h duyệt và các
phiên bản khác nhau đã là m ột cơng việc khó khăn. Sau cùng,
m ột số trìn h duyệt đã khơng hỗ trợ JavaS cript gì cả (như N etscape 1.0).
Thậm chí nếu bạn có m ột trìn h duyệt hỗ trợ JavaS cript, mơ h ìn h tài liệu
(DOM) nền tản g là khác nhau giữa các trìn h duyệt khác nhau, nghĩa là
các lỗi Jav aS crip t rấ t phổ biến.
T
Sự khó k h ăn này của việc p h át triến m ã Jav aS crip t vơn đã làm việc
chính xác trong mọi trìn h duyệt đã xảy ra chủ yếu do m ột sơ" yếu tố:
K Các phiên bản trình duỵệt mới cách vài tháng
* Một cuộc cạnh tranh đang diễn ra giữa các cơng ty trình duyệt để
thêm các tính năng mới
Chương 7: Tạo các script làm việc trong mọi trình duyệt
__________________ 169
M Thiếu một cktiẩn HTML h(,át JavaScript
M ất m ột số thời gian, nhưng cuối cùng các vân đề b ắ t đầu biến m ất
khi Jav aS crip t ổn định. Và khi người dùng bắt đầu dần dần nâng cấp
lên các trìn h duyệt phiên bản 4.0 trở lên, các nhà phát triển JavaS cript
có thời gian dễ dàng để p h át triển mã tương thích nhiều trìn h duyệt.
T h ật khơng may, m ột số thay đối sắp tới đối với Jav aS crip t sẽ buộc
các iilià p h á t triều v/eb p h ả’ tắ t đầu vLế'., 1-iã lại cho các điểm khác biệt
của trìn h duyệt. Các lý do cho thời điểm khơng ổn định mới này có th ể
bao gồm:
M Sự hỗ trợ không nhất quán cho JavaScript 2.0
R Các phiên bản trình duyệt mới cácr? ìibau J’ải tháng (cụ thể từ Mozilla)
m Sự hỗ trợ trôn JavaScript khơng nhất qỉián cho nhũng cơng nghệ
mới, chẳng ban nhítXML và css
Chỉ có thời gian mới cho biết những yếu tố này sẽ khiến cho các nhà
p h át triể n web phâi đau đầu như th ế nào.
Tìm h iểu các điểm khác biệt cua trình duyệt
Theo m ột C U Ộ I , khảo sát gầii (iây, Microsoft In te rn e t Sxploie) (IE)
được sử dụng bởi khoảng 94% những người lướt web. N etscape và Mozilla
có một mức sử dụng khống 2%. 4% cịn lại được phân chia giữa những
công ty khác chẳng h ạn như Opera hoặc bị m ất do làm tròn.
Nl-ững cor số nAy có vhổ vh;iy đổi trong cấc tháag- và n:\rn ¡’ắp tớK
N hà cuug cấp dịch vn.. in te rn e t (ISF) lớn nhất r Mỹ gần đây đã thơng
báo nó sẽ b ắ t đầu sử dung Netscape làm trìn h dut mặc định cùa nó
và có th ể có tác động lơn đối với nhừng con số này.
ĩ*Th'in kỹ h t r n ệ t chút £ố liơu th o o f kê V‘1 tín h th cn g d ụ n f trìnb
duyệt gần đây như trong bang 7.1, chung ta có th ể th ầv răn g một nửa
những người lướt \veđ đã chưa nâng cấp lên các phiên bản gần đây của
các trin h đuyội- web .jfu tiên
họ
54% những người lướt web sử đụnEí các trìn h duyệt khơng phải là
phiên bản mới n h ất "';ừ Microsoft hoặc Netscape. Do đó hãy cẩn thận
khi tạo các chương trìn h JavaScript phụ thuộc quá nhiều vào các tính
năng độc quyền hoặc các tín h năng mới được bổ sung. Sử dụng các tính
năng m à khơng áp dụng những biện pháp phịng ngừa tồn bộ có th ể
gây ra các lỗi cho một phần khán giả đáng kể th ậm chí nếu ứng dụng
hoạt động tố t trong trìn h duyệt được cài đặt trê n PC.
C ác loại lỗi có thể xảy ra?
Khi th iế t k ế bất kỳ chương trìn h máy tính, điều quan trọng là phải
ghi nhớ rằ n g các lỗi có th ể xảy ra bất kể nhà lập trìn h cơ" gắng h ế t m ình
để trá n h chúng. Điều này đặc biệt đúng đối với các chương trìn h JavaScript
170
Chương 7: Tạo các script làm việc trong mọi trình duyệt
được sử dụng qua nhiều trìn h duyệt và hệ điều h à n h khác nhau. Khi
p h át triể n m ã JavaS cript, bạn có th ể tìm th ấ y các nguồn lỗi sau đây:
B Nhĩing điểm khác biệt trong D ocum ent Object M odel của mỗi phiên
bản trình duyệt
R Các m áy tính client chạy các trình duyệt cũ (chẳng h ạ n n h ư Netscape
3.0) không hỗ trợ chức năng JavaScript nhất đ ịn k
B Các m áy tính client có những công nghệ n h ấ t địnb được tắt, chẳng
hạn n h ư cookie hoặc Java
B Các công nghệ được bật web mới, chẳng h ạ n n h ư các thiết bị xách
tay, thiết bị di động, hoặc thậm chí các thiết bị gia dụng, chẳng hạn
rưrntủ lạnh
Chương này sẽ xem xét m ột sô" kỹ th u ậ t chung để trá n h những loại
lỗi này.
Bảng 7.1 Thơng sỗ' kỹ thuật sử dụng trình duyệt web gần đây
Trình duyệt
IE 6
IE 5
IE 4
Netscape 4
Netscape 6, Netscape 7, Mozilla (gộp chung)
IE cũ
Netscape cũ hơn
Mức sử dụng
46%
44%
2%
2%
1%
nhỏ hơn 1%
nhỏ hơn 1%
Phái hiện ỉoại trinh duyệt nào mà ngưừi dũng đang chạy
Chạy m ột chương trìn h JavaS cript hiện đại hoặc phức tạp trong
m ột trìn h duyệt cũ hơn có th ể gây ra vơ số sự số. Có lẽ cách dễ n h ất để
trá n h những loại lỗi này là p h át hiện loại trìn h duyệt nào m à người
dùng đang chạy và sau đó tắ t (disable) m ột số tín h n ă n g chương trìn h
hoặc cung cấp m ã th ay th ế vốn thực h iện cùng m ột tác vụ bằng một
cách hơi khác.
C ¡&
cỆ a»
-------------------------------------------------------------------------------
P h át kiện tliơng tin tên và phiên bđn trình duLjệi tliưồnq được
qọi
là
ẩánli hơi ỈPÌnh duqệt (Lpowsep sniffinq). Giốnq nkỉểu như mội con chó
có tíiế phát hiện mủi dutj nliốỉ của một cá nkân, một bpowsep sniffep cố
ptiát liiện và tp<3 về nliữnq chi tiết dui) nliđt c ủa phđn mềm trìnk dui^ệt.
Để p h át hiện n h à sản xuất trìn h duyệt và m ột sơ" p h iên bản, chúng
ta sẽ phụ thuộc vào đối tượng navigator DOM. Đối tượng navigator có
m ột số phương thức và thuộc tính, nhưng b a phương thức và thuộc tính
Chương 7: Tạo các script làm việc trong mọi trình duyệt
171
m ả chúng ta quan tầm vào lúc riàv là appN am e, appV ersion, và
userA gent.
var browserString = navigator.appName;
var browserVersion = navigator.appVersion;
var browserAgent = navigator.userAgent;
a.ert (orowserString);
alert (browserVersion';
________ alert (browserAgent);_____________________________________________________________
Điều bạn cẩn biết?
X ác đ ịn h c á c s ố p h iê n bản J a v a S crip t
C á c nhà sản xuất trình duyệt bắt đầu với những mục đích tốt nhất. Cả
Netscape và IE cho phép các nhà phát triển xác định một số phiên bản
JavaScript bên trong thuộc tinh ngôn ngữ của thẻ <script>. Điểu này ngăn
cá c script chạy trong các trình duyệt vốn khơng hỗ trợ số phiên bản
JavaScript được xác định. Để tạo một script mà sẽ chỉ chạy trong các trình
duyệt h5 trợ Ja v iS c r pl 1 2, bạn sẽ sử dụng mã sau đây:
các script nhiểu trình duyệt. Ngồi ra phương pháp này không giúp các
nnà phát triển giai quyêt nhưng đièm knác Diệt liên quan đến DOlvl giừa
các trinh duyệt khác nhau.
Do đó mác du kỹ thuật này vẫn có sẵn, nhưng nó knơng thể dươc Un cậy
để giải quyết các vấn đề viết script nhiểu trinh duyệt.
Đối với các trìn h duyệt web Netscape (bao gồm trìn h duyệt web Mozilla
nguồn mở), thuộc tín h navigator.appNam e ln tr ả về cùng m ột giá trị
b ất kể phiên bản hoặc hệ điều hành.
Netscape
Đối với M icrosoft In tern et Explorer, thuộc tín h navigator.appNam e
cũng t r ả về m ột giá trị có th ể dự đốn trước b ấ t kể phiên bản.
172
Chương 7: Tạo các script làm việc trong mọi trình duyệt
Do đó nếu tra n g web cần hiển th ị text khác nhau phụ thuộc vào
trìn h duyệt m à m ột khách tham quan đang chạy, bạn chỉ việc truy vấn
thuộc tín h navigator.appNam e như sau:
var browserString = navigator.appName;
if (browserString == ' Netscape’ ) t
// Do something for Netscape/Mozilla here
document.write (“Long live the lizard.");
} else if (browserString == “Microsoft Internet Explorer") I
// Do something for Microsoft here
document.write (“You will be assimilated.’’);
} else {
// The browser is not one of the major two
document.write (“Why must you always be so different?”);
Tuy nhiên, navigator.appN am e cực kỳ giới h ạn trong lượng thơng
tin m à nó cung cấp. Những thuộc tín h navigator khác cung cấp thơng
tin hữu dụng hơn. v í dụ, thuộc tín h navigator.appV ersicn c jn g cấp
thòng tin phiên bản cụ th ể hơn. Dơi với các ti'ình duyệt N eiseap, chuoi
được trả về từ thuộc tín h đó hồn tồn đơn giản.
C U ED
Chương 7: Tạo các script làm việc trong moi trinh duyệt
173
Tương tự, M icrosoft In te rn e t E x p lo rer t r a về th ô n g tin p h iên
b ả n của nó tro n g chuỗi n av ig ato r.appV ersiơn, như chúng ta có th ể
th ấ v từ ả n h chụp m àn hình sau đáv được lấy từ M icrosoft In te rn e t
E x p lo rer 6.0.
Các phiên b ản gần đây của trìn h duyệt web M icrosoft luôn báo cáo
số phiên ban là tương thích 4.0. Tuy nhien, số phiên bán thực sự được
nhúng sau đó trong cùng một chuỗi (trong trường hợp này là M SIE 6.0).
Các trìn h duyệt Mozilla l.x, Netscape 6.Ü và N etscape 7.0 đểu dựa
vào cùng m ột m ă nguồn, do đổ cách hoạt động của chúng rấ t tương tự.
Nếu bạn đã từng nhận đươc chính xác tén trìn h đuyột và m ột sơ phiên
bán tì; r hứng cr\nn 'luyệt này, bạn co thí t : u / vấn ohdệc ánh userAgí.-n*
của địi tượpg navigator Như ban có f.h4’ thấy từ hình m inh họa dưới
đây, nó chứa m ột số thơng tin phiên bản rấ t cụ th ể ngay đến ngày tháng
chír.h xác m à trin h duyệt đã được biên dịch.
Sử dụng' ba thuộc tính nàv, chúng ta có th ể tạo m ột hàm JavaS cript
r n à Sií p h á t h i ệ n
l o ạ i t.T ìn h đ u y ẹ t . e h ú i h Xiíc m à
ngươi d u n g
function getBrowserlntoO (
// Define variables »C contain the results
var browserName - navigator.appName;
vai browserVersionNum = parseFloatinavigator.appVersion).
var browserAgent = navigator.userAgent;
// Boolean (true or false) variables to detect browser type
var isJ E = (browserAgent.indexOffMSIE") != -1);
var is_NN = (browserName.indexOffNetscape”) != -1):
// Based on browser type, retrieve version number
if (is_NN) {
if (browserVersionNum >= 5.0) {
var tempStart = browserAgent.indexOf(“Metscape/”);
lan g chạv.
174
Chướng 7: Tạo các script làm việc trong mọi trình duyệt
if (tempStart == *1) {
// “ Netscape/” not found; must be Mozilla
tempStart = browserAgent.indexOffrv:”);
tempStart += 3;
browserName = “Mozilla"
var tempEnd = browserAgent.indexOfO” , tempStart);
} else {
// “ Netscape/” found; must be Netscape Gecko
tempStart += 9;
var tempEnd - browserAgent.length;
}
var browserVersion =
browserAgent.substring(tempStart, tempEnd);
} else {
// version < 5.0; must be old Netscape
var browserVersion = browserVersionNum;
}
} else if ( is J E ) {
var lempStart = 0rowserAgent.indexOf(“M SIE’ );
tempStart += 5;
var tempEnd = browserApent.indexOff“ ;”, tempStart^;
Vqr jruwjeiVfcrsior. =
browserAgent.substring(tempStart, tempEnd);
}
// Create new property of navigator object based on real
// version number
navigator.appRealVersion = browserVersion;
return;
}
getBrowserlnfo();
document.write (“
You appear to be running:”);
document.write (“<b>” + navigator.appName + “</b> <i>version</i> “);
document.write (“<b>” + navigator.appRealVersion + “</bx/h1>”);
Như bạn có th ể th ấy chúng ta phải viết m ã nhiều để b iết sô' phiên
bản thực sự của các loại khác nhau của trìn h duyệt N etscape. Đối với
175
Chương 7. Tạo các script làm việc trong mọi trình duyệt
N etscape 4 trở vể trước, thuộc tính navigator.appV ersion trả về đúng
g iá t r ị . Vì N e ts c a p e 6 vá 7 và M o id lla đ ề u t r ả vê 5 .0 lá
navigator.appV ersioR . chúng ta phải b ắ t đầu tìm kiếm thuộc tín h
navigator.userA gent để tìm giá trị thích hợp.
Q êx c
U
-----------------------------------------------------------------------------
M ã lr*íỏ(
rì
.óc inực đíck C IỈJ \ í cJ^ ià^
VJ
J o 3ó
khơnq bao hâm tố i cđ các loqi hoỢc p k iê n bdn t r ìn ii duL)ệt. Đ ể xem
m ột ví dự hồn híỉo về mộf scpipt phát hiện tpìnli d u y ệ t, bọn nên fkam
Itkđ o p p a c ỉic a l Bpovvsep S n iííin q S c p ip ỉ c d a B o b C l a p i j tq i h ttp :/ /
bclapij.com /xbppojects-n aviqatop đ ế q u y ế t định loqi vđ p k ỉé n L đ n ỉr ìn t i d u q ệ t. W e t) site đó
cũ n g ch ứ a một
SCPÌ
pt
(Jq ì
htlp://t>cl a p q .co m /xbp p o ịects-cio c s M D O M )
cko pkép byn sù d^nqi một ttfp l»ợp đối ỉưr;nq D O M
c k u íín cho tố l cđ
fpìnli duL|ệt.
H ình m inh họa sau đây cho thấy hàm nhỏ chạy trong N etscape 2.0
và N etscape 7.0 như chế nào.
X'bÇtf.
1-
ÍQ è
V'
rằ*w i
'
WM*.
m
/Vi*vf
0 đ
Fe***rfợH hoô*.;'- 'sVMtoM
ệ 0E3
low;-!#
mi
[y?i Netscape - (JvdScnpt sample code]
ïûik* ûpfor» ßiwci
■mm
É ÿ S fg
s
-■-
Év^::
Y o u a p p e a r to be ru n n in g :
N etscape version 2
v-.3?i£i ' (PuùjmajL'Pw. 'Vï/y
.! T.;■
yaffil;Qàl
176
Chương 7: Tạo các script làm việc trong mọi trình duyệt
■ H H T T n T T I
1 $ $ JavaSciipt «ample code - Neticdpe
-
ỵier» £ o Ễodanỏíkí lo o k Window yete
¿i
JaviStiipt compiocoòe
1
□
Y ou a p p e a r to be ru n n in g :
N etscape version 7.0
â ! OoturwV: Donô 0.39 ằ csl
Microsoft In te rn e t Explorer đã luôn cung cấp số p h iên bản của nó
bằng chính xác cùng một cách. Nó tự báo cáo là tương thích N etscape 4.0
trong thuộc tín h navigator.appVersion và để số p h iên b ản phần mềm
thực sự được nhúng ở nơi khác trong cùng m ột chuỗi. Tìm nó tương đối
đơn giản b ằn g cách sử dụng phương thức indexOfO của đôi tượng
Jav aS crip t String.
Truy vấn mô hình đơì tượng (document mode!)
Vấn đề với việc phụ thc vào mã kiểm tra tìm các trìn h duyệt theo
tơn \ à phiơn bản 'à nó khơng rõ ’’ànk. H ên L/ậ: 'dio ản g 9C9? l h jfr.g
người lướt web sử dụng m ột trong hai trìn h duyệt chính - N etscape hoặc
IE. Nhưng cịn về 4% kia - những người lướt web chọn những nhãn hiệu
khác chẳng h ạn như Opera hoặc Konqueror thì sao? Các trìn h duyệt mới
đang được p h át triể n và các web site sẽ không làm việc đáng tin cậy nếu
chúng chỉ được viết m ã để hoạt động với hai n h ã n hiệu h àn g đầu.
Vấn đề khác là khi các phiên bản mới của IE và N etscape được tung
ra, sự hỗ trợ cho các tín h năng khác nhau thay đổi. Ví dụ, N etscape 4 hỗ
trợ m ột phương pháp layout được gọi là các layer, nhưng sau đó sự hỗ trợ
đã bị loại bỏ khi N etscape 6 xuất hiện. (Các layer sẽ được thảo luận
thêm trong phần "Viết m ã nhiều trìn h duyệt").
Cách dễ dàng n h ấ t để khắc phục vấn đề của các trìn h duyệt khác
nhau có sẵn (cả trong hiện tại và tương lai) là v iết m ã và kiểm tra xem
có m ột phương thức đơn trước khi cố sử dụng nó hay khơng.
P hiên bản chính thức đầu tiên của Document Object Model (được
gọi là DOM 1) định nghĩa m ột phương thức của đối tượng tà i liệu được
Chương 7: Tạo các script làm việc trong mọi trình duyệt_____________________177
gọi ià getElem entB^IđG . Các trình duyệt gần đây (chẳng hạn như IE 5
và N etscape 6) hỗ trợ nó, nhưng các trìn h duyệt cũ hơn thì khơng.
Việc đơn giản gọi phương thức getElement.ByldO trong m ột trìn h
duyệt khơng hỗ trợ nó sẽ gây ra một lỗi:
var obịptr = docurrent.getElPmentByld(”carname') •
Do đó nếu b ạn rr.uốn kiểm tra xom 4rìn h duyệt h iệ r tại cổ bỗ trợ
phương thức getElem entByldO trước khi sứ dụng nó hay không, bạn chỉ
việc truy vấn đối tượng tài liệu để xem nó có m ột th à n h viên có tên đó
trước khi gọi nó hay khơng:
if (document.getElementByld) {
var objptr = document.getEiementByldC carname’’);
Ị
Mã trê n sẽ làm việc trong bất kỳ trìn h duyệt vì các trìn h duyệt mà
khơng hỗ trợ phương thức đó sẽ khơng thực thi mã bên trong câu lệnh if.
Dí nhiên, trong các trìn h duyệt đó. biến obịptr sẽ khơng được xác lập, do
đó tốt r h .it háy để mả chay thê xử lý những’ tìn h huống đó:
if (C0Cjn.er.t.ije1EI';nrertBylõ) ;
var objptr = document.getElementByldfcarname");
} else {
alert (“Sorry, this web page will not work in your browser ”):
}
Dĩ nhiên, nếu bạn phải bao boc mỗi và mọi lệnh goi đến một phương
thức DOM bằng câu iệnh if riêng cua nó, chương trìn h sẽ dài và kém
hiơu q. Do đó phương pháp tốt nhâr có th ể là k ế t hợp phương pháp
brow ser sn iñ in g (đánh ho'' Lvinh duyệt) vơi phương thức p n át niện DOM
đế đ ạt được vẹn ca đôi đường.
T rung th àn h vói những chuẩn Web
Trong những ngày đầu phát triển web, hai n h à sản xuất trìn h duyệt
lớn n h ấ t cạnh tra n h dữ dội để đạt được thị phần. Một trong những chiến
lược m à họ ưa th ích n h ất là cố vượt trội nhau về các tín h năng. Những
người tiêu dùng download và cài đặt phiên bản mới n h ấ t của trìn h
duyệt ưa th ích của họ và trong vòng vài ngày phiên bản k ế tiếp sẽ có
sẵn để download. Các cơng ty lớn đơi khi địi hỏi nhiều th án g để test
và phê chuẩn p h ần mềm mới để sử dụng tự n h ận th ấy m ình có lên đến
hai phiên bản full đằng sau phiên bản hiện hành.
Dĩ nhiên, điều này đã dẫn đến hai chuẩn HTML thay vì m ột chuẩn
đã làm cho công việc của nhà phát triển web phức tạp hơn mức cần
th iết. T h ật m ay thay, cuối cùng cả Microsoft và N etscape quyết định
178
Chường 7: Tạo các script làm việc trong mọi trình duyệt
rằn g họ nên tri hỗn thực thi các tín h năng HTML và Jav aS crip t mới
cho đến khi chúng được chấp thuận bởi m ột cộng đồng tiêu chuẩn.
Tuy nhiên, có m ột số thói quen viết m ã không chuẩn n ên được trá n h
để đạt được k hả năng tương thích nhiều nền. B ảng 7.2 trìn h bày một
danh sách các phần tử không phải là m ột phần của chuẩn HTML 4.
Những th ẻ m arkup độc quyền này nên được trá n h nếu bạn muôn tạo
các tra n g web hoạt động m ột cách n h ấ t quán tro n g b ấ t kỳ trìn h duyệt.
• ••••••
Thủ thuật
•
Nếu bạn muôYi kiểm tra trang web để xem nó có tn theo các chuẩn chính
thức hay khơng, web site VV3C cung cấp một dịch vụ hiệu lực hóa HTM L tại
. Công cụ Iiày là cách d l nhất để xem trang web của
bạn đi lệch ra khỏi các chuẩn chính thức bao xa. Thậm chí nó nhận dạng bâ't kỳ
mã HTM L chứa các lỗi.
Bảng 7.2 Các thẻ markup độc quyền, khống phải là một phẩn của chuẩn HTML chính
thức.
M arkup độc quyền
Hỗ trỢ trìn h d u y ệ t
<layer>
Netscape 4 (only)
<marquee>
IE
<bgsound>
IE
<embed>
IE, Netscape
<noembed>
iE, Netscape
<multicol>
Netscape
<spa^er>
Netscape
<nobr>
IE, Netscape
<wbr>
IE, Netscape
<blink>
Netscape
<xmp>
IE, Netscape
<listing>
IE, Netscape
IE, Netscape
<keygen>
Netscape
<layer>, <ilayer>
Netscape
<nolayer>
Netscape
<server>
Netscape
1 /ệ
Vièt mã nhiẽu
trìn h duyệt
Ở p h ần trước trong chương chúng ta đã làm việc với một s ố m ã
Jav aS cript có th ể được sử dụng để p h á t hiện tê n và số phiên bản chính
Chương 7: Tạo các script làm việc trong moi trình duyêt
179
xác cúa trìn h duyệt Client Trong phần này, chúng ta sẽ dặt mã tương
tự để sử dụng với dynamic HTML.
Dynamic HTM L (hoặc viết tắt là DHTML) là m ột phần mở rộng của
chuẩn HTML cho phép các chương trìn h Jav aS crip t thay đổi và chỉnh
sửa một tra n g web sau khi nó được tải trong trìn h duyệt m à khơng cần
p h ải quay trở về web server cho một tran g mới. P h ần lớn JavaS cript
hoàr. t ’.ián’i đitt-u nầy thơnị, C. \I ệ j xử 1} các phuơiig thức \ à thc tính
tro n g DOM của trìn h duyệt.
Dynamic HTM L được sử dụng đều đặn bởi các site In te rn e t để cung
cấp các m enu xổ xuống, hình ảnh và text vốn thay đổi khi bạn di chuyển
cursor chuột lên trê n chúng và các shopping car (giỏ m ua sắm ) ecommerce tín h to án iại tỏng chi phi của m ột đơn đ ặt hàng mỗi lần một
hộp kiểm được chọn (được chọn hoặc được húy chọn). Trong những
th á n g gần đày, các nhà quảng cáo đã bắt được lỗi DHTML và tạo ra
quảng cáo động đi qua tran g web (và không th ể được tắ t hoặc được
trá n h '.
Tuy nhiên, DHTML nhiều ';rình duyệt khó viết m ã vì m ã JavaS cript
được yêu cầu cho các trìn h duyệt Netscape và M icrosoft hồn tồn khác
nhau. Trong Khi Việc chuẩn hóa làrn cho việc ỉập trin h HTML và
Jav aS crip t cơ b ản trở nên dễ dàng hơn nhiều, so với chỉ cách đây một
vài nàm việc thực th i các DOM khác nhau giữa các trìn h duyệt là một
trong những lĩn h vực rắc rối còn lại sau cùng.
H inn 7.1 m inh họa mụt ví dụ về mịt tran g web sử dụng DHTML. Càv
phân cấp ở p h ía bên trái m àn hình co thế được mở rộng và được thu gọn
hằng' m ột rú nh ắp chuôt đ('n grản. Các mục m e n ổưc/c hiểi. thị v ì 1u'Jc
ẩn một cách động m à khịng cần phải yêu cầu HTML mới từ web server.
I.o.ii m ỉru DHTML này '-ạ) ra rr.ột hiệ 1 .fng ĨỊp m ắt cho nhữnặ khách
tham quan đến tra n g web cùa bạn
Một trong những tín h nâng đầu tiên mà bạn có th ể gặp phải là Netscape
4 sứ dụng m ột phương thức được gọi là layer dể định nghĩa các vùng của
m ột tài liệu web vori có th ể được áp dụng m ột style.
<htmi>
<headxtitle>Layers sample</titlex/head>
<body>
Netscape Layers Example
clayer id=”mylayer”>
<font color="white”xb>A black square</bx/font>
</layer>
<layer id=” mylayer2">
<b>A gray square</b>
180
Chương 7: Tạo các script làm việc trong mọi trinh duyệt
<Jlayer>
<script language=”JavaScript" type="text/javascript’’>
document.layersCmylayer^.bgColor = “black";
document.layers[“mylayer2"].bgColor = ‘'#CCCCCC";
document.layersỊ“mylaỵer2"Ị.moveBy (60, 10);
</script>
</body>
</html>
Mã HTML này được th iế t k ế để h oạt động trong chỉ các trìn h duyệt
web N etscape 4 . X . Mã của chúng ta đinh nghĩa m ột layer N etscape có
tên là m ylayer sử dụng thẻ HTM L<layer>. Chúng ta định nghĩa một
layer thứ hai có tên là mylayer2. Sử dụng JavaS cript, chúng ta có thể
thay đổi các m àu nền của hai layer, và di chuyển m ột tro n g chúng sao
cho chúng khơng phủ chồng hồn tồn. Hiệu ứng có th ể được th ấy trong
hình 7 2.
T h ật khơng may, m ã trước không làm việc tro n g b ấ t kỳ phiên bản
của IE hoặc trong các trìn h duyệt N etscape 6 mới hơn. C húng ta sẽ phải
chỉnh sửa m ã m ột chút để p h át hiện loại trìn h duyệt đang chạy va thực
hiện các tác vụ khác nhau dựa vào m ă đó.
Đầu tiên chúng ta cần thay đổi các layer để làm việc trong tấ t cả
irìnli duyệt. M ã sau đâ> khòng phù hợp với các chuẩn HTM L (vì thẻ
<layer> khơng phải là m ột phần của chuẩn), nhưng nó sẽ làm việc
trong cả TE và Netscape.
Tree view ũem o
9 '_ J Application example
3 Types of folders
'
Targets
JO RĨqhịlrạniặ
•jj] New window
'¿¡I Whole window
J ] This frame
4 -4j Other Icons
Hình 7.1 Một menu cây có thể mở rộng sử dụng DHTML
Chương 7: Tạo các script làm việc trong mọi trình duyệt
181
<l¿yer id=’mylayer’>
<div id=’mydiv' styie=’posiiion:aDsolute’>
<font color="white’'><b>A black squaie</bx/font>
</div>
</iayer>
:l 2‘/ er ¡ris'THaye^'*
<điv id=’mydiv2' style='position:absolyte’>
<b>A gray square</b>
</div>
<^lavef>
ĩã s
L f ty e tt i M i p l e - N c l t c a p ô
F a
Viâw
Bddc
-
&o
-i*
o m n riỏ c a to f
M«ỉp
3
^
^dc^d
H-yne
s*»ch
iầí
->
Netscape
PiH
-1
S e rư íy
Sh o p
‘U
wyn
«M
Netscape Lavers Example
A black
*A g ra y square
Hình 7.2 Tạo các layer trong Netscape 4
Lưu ý cách chúng ta sử dụng thẻ HTML chuẩn <div> được xếp lồng
bên trong th ẻ <)ave.r> không chuẩn. Các trình đuvệt, khơng hỗ trợ <layer>
sẽ bỏ qua nó, vì các trìn h duyệt khơng hỗ trợ <div> sẽ bỏ qua thẻ đó.
Tiếp theo chúng ta cần chỉnh sửa script để p h át hiện loại trìn h duyệt
đang chạy.
Chúng ta có th ể
nhưng những nhu
những gì chúng ta
N etscape 6 và IE.
sử dụng script getBrowserlnfo trước đó trong chương,
cầu của chúng ta đơn giản hơn th ế nhiều. T ất cả
cần làm là phát hiện sự khác b iệt giữa N etscape 4,
Để làm điều đó, sử dụng mã Jav aS crip t sau đây:
<script language=’’JavaScript” type=”texưjavascript”>
var ua = navigator.userAgent.toLowerCase();
var ie4 = ua.indexOf(“msie”) != -1;
182
Chương 7: Tạo các script làm việc trong mọi trình duyệt
if (document.layers) {
// Netscape 4 code goes here
} else if (document.getElementByld && ie4) {
// IE code goes here
) else if (document.getElementByld) {
// Netscape 6 code goes here
}
</script>
Mã này làm việc m ột cách khá đơn giản. N etscape 4 là trìn h duyệt
duy n h â t có đối tượng tài iiệu có m ột thuộc tín h layers, do đó kiểm tra
tìm sự hiện hữu của thuộc tín h đó sẽ xác n h ận rằn g loại trìn h duyệt là
Netscape 4. Chúng ta có th ể làm thủ th u ật này sử dụng phương thức
getE lem entB yld của đối tượng tài liệu ngoại trừ chúng ta vẫn cần ph ân
biệt giửa IE 4 và N etscape 6. Thuộc tín h N avigator.user Agent cho phép
chúng ta làm điều đó.
Sau cùng chúng ta thêm m ã DHTML riêng b iệt theo trìn h duyệt để
xử lý hai th ẻ <layer> hoặc <div> trê n m àn h ìn h để tạo m ột hiệu ứng
h ìn h ảnh.
<html>
<headxtitle>Layers sample</titlex/head>
<body>
Cross-Browser style Sheets Example
clayer id=’my!ayer,>
<div id=’mydìv’ style=’position:absolute’>
<font color="white”><b>A black square</bx/font>
</div>
</layer>
<layer id=’mylayer2'>
<div id=’mydiv2' style=’position:absolute’>
</div>
</layer>
<script language=”JavaScript” type=”text/javascript">
var ua = navigator.userAgent.toLowerCase();
var ie4 = ua.indexOf(“msie”) != -1;
if (document.layers) {
// Netscape 4 code goes here
Chương 7: Các Struct, Enum và thuộc tính
183
Một phương thức hữu dụng khác là G e tN a m e s. Nó liệt kê các tên
của các phần tử trong một mảng s trin g . Ví dụ, bạn có thể lưu trữ tên
Color trong một m ảng như sau:
string[] colorNames = Enum.GetNames(c.GetTypeO);
San đó bạn có th ể hiển thị m ảng này bằng việc sử dụng một vòng lặp
lặp lại.
Nhửng phương thức này được m inh họa trong ví dụ sau đây.
Ví dụ 7.5
•
// Example 7-5.cs
/.' Using System.Enum methods
using System;
// Declare tỉie Color enurn:
enum Color { Red = 1, Green, Blue }
class MyClass
(
static void Main()
{
// Declare a blue color object:
Color myCc'or = Cc'l0f.B!ue:
// Display the color name using IcStnny:
Cjn.:ol3AVr.ie[jn3('M/ tolur !s: (0!”, myColtr), H B,je
// Declare 3 coior object'
Color yourColor = new Color();
h Display the color wnose value IS 2 by using the GetName method:
Console.WriteLinefYour color is: {0)”,
Enum.GetName(yourColor.GetType()f 2)); // Green
// Display all the color names using the GetNames method:
Console WriteLine(“Your colors are:");
// Declare a string array for colors:
string[] colorNames = Enum.GetNames(yourColor.GetTypeO);
foreach (string s in colorNames)
Console.WriteLine(“{0}
}
}
s);
184
Chưdng 7: Tạo các script làm việc trong mọi trình duyệt
HŨE
&)1<1VCIS sam ó lo ■ N c ttC A u e
„ £ie £ *
ỵm *
fìo gooỉưnaik« loofc ttndow üefc
tayon Mffipte
Ị
[3
Cross-Browser Style Sheets Exaniple
“ " “ "A gray square
*29 V J
bocumenc oõõe (0.17 Mct]
fSf’
Hlnh 7.4 Mặc dù Netscape 7.0 đòi hỏi Java Script hơi khác nhau nhưng cùng một hiệu
ứng được tạo.
Đây là m ột ví dụ hay về những khó k h ăn mà các nhà lập trìn h
JavaScript đơi khi gặp phải khi p hát triể n m ã làm việc trong b ấ t k5'
trìn h duvệt.
Trong chương tiếp theo chúng ta sẽ xem m ột trong những nhiệm
vụ chính của Jav aS crip t trê n In te rn e t - giúp người dùng điền vào các
form. B an sẽ học cach tạo m ọt form Dằng HTML, học vể tấ t cả điều
khiẽn (Control) có th ể đi vào m ột form và xem Jav a S c rip t có th ể
được sử dụng để hiệu lực hóa dữ liệu được n h ập trước k hi nó được gởi
đến server để xử lý.
Chương 8: x ử lý các web form
185
T ron g ch ư ơ n g này bạn sẽ h ọ c n hữ ng đ iểm ch ín h sau đây:
J í Yêu cầu dữ liệu nbập của người iHing síỉ cìụnq một form HTML
R í n y 'hn rà XÍ'C 'ập cárgừí tri diều ừhìển form
B Chỉ lẳn oi dư liệu form Jé cié irìub đén Sí n er
Ị
7
_____ B Xứ lý nbiäu J e m __________________________________________ Ị
rong càc chương ưưởc cnúng ta đã tnáy JavaScrip co the ũưực
sử dụng như th ế nào để cung cấp các trang web động chứa các
menu hoạf bình hoặc bơi khác nhau phụ thuộc vào trìn h duyệt
web đang sử dụng hoặc thời gian trong ngày. Khi thời gian trôi qua,
các n h à p h át triển sẽ thấy việc đưa những thủ th u ậ t JavaS cript đặc
biệt này vào các tran g chu cá nhân riêng của họ trồ nên dễ dàng hơn
bao giờ hết.
T
Điều đã khiến cho JavaScript không thể thiếu được như là một công
cụ p h át triển cho hầu hết các nhà phát triển web chuyên nghiệp là khả
năng nó xử lý dữ liệu nhập người dùng. JavaS cript làm cho việc thu
thập và xử lý thông tin người dùng trở nên dễ dàng hơn - cho cả người
dùng và n hà p h á t triển web. JavaScript có th ể hỗ trợ bằng nhiều cách:
M Lưu trữ và truy tìm các mẫu thơng tin trên máy tính của người dùng
(được gọi là các cookie).
R Kiểm chứng rằng tất cả tn(ờngform bắt buộc đã được cang cấp
186
Chương 8: xử lý các web form
R Hiệu lite hóa định dạng thích hợp của dữ ìiệu do ngifrii dùng nhập
vào
B Cĩing cấp sự phản bồi tức thì cbo người dùng mà không cần phải di
đến web server
Và trê n hết, làm tấ t cả điều này thường rấ t dễ dàng - chỉ cần một
vài dòng mã. Bằng việc giải quyết nhiều vấn đề hơn nó gây ra, JavaScript
nhanh chóng trở th à n h một cơng cụ khơng th ể thiếu được cho các nhà
ph át triển web nghiêm túc.
Tìm hiểu cá c íorm HTML
Cách tố t n h ấ f. và linh hoạt n h ất để đề nghị dữ liệu n h ập của người
dùng là bằng cáo form HTML. Một form trong lập trìn h web là một loạt
gồm một hoặc nhiều điều khiển người dùng được th iế t k ế để th u thập
dữ liệu nhập người dùng. Một điều khiển người dùng (user control)
thường là một hộp text, một hộp danh sách (list box) hoặc một nút
(button) thuộc một loại nào đó cho phép người dùng cung cấp thơng tin
cho trìn h duyệt web. Thực tế các web form được mô phỏng theo các
mẫu giấy như những mẫu giấy mà bạn điền vào cho m ột đơn xin việc
hoặc một cuộc khảo sát.
Có 13 điều khiển người dùng trong HTML:
* Text box Cho phép một dòng dữ liệti nbập text.
B P assivord box Cho phép một dịng dữ liệĩi nhập text chíỢt bảo vệ
bằng các dấu sao.
* Text area Cho phép một hoặc nhiều dòng dữ liệu nhập.
R H idden Cờ thế chứa một dồng text đtỉợc ổn khỏ' rgườ1dùng
B List box Người dũng có thể chọn từ một hoặc nhiều lựa chọn ấn
định sẵn.
Ễt Radio button Người dũng có tbể cbọn một trong nhiềĩi lựa chọn ấn
định sẩn.
B Check box Người dùng có thể chọn bất kỳ số trong nhiều lựa cbọn
ấn định sẵn.
R File Người dùng có thể upload mộtfile từ máy cục bộ lên web sewer.
Push button Làm cho một hànb động do chương trình ấn định xảy
ra.
* Submit button Khiến cho form đìỉợc đệ trình.
B Image button Tạo một nút submit đồ họa.
B R eset button Làm cho form được xóa sạch.
187
Chcícng 8: x ử lý các web form
M Object Tạo tuột điềtt kũiổn nhạt) ỉịộn đục biệt (do người dùng định
nghĩa)
Từng điều khiển này thực hiện một chức n à n g đặc biệt trong việc
yêu cầu dữ liệu nhập người dùng. Điều khiển nào bạn sử dụng phụ
thuộc nhiều vào các trường hợp riêng lẻ. Ví dụ, khi bạn cần người dùng
chon ir.ột trong 50 lựa chọn (như chọn tiểu bang nào mà họ đang sống)
bfin thư ^rg chọn m et điồu k h ilr I’st box F)iồu khiổn nàv cho phép bạn
cung cấp h àn g chục tùy chọn trong rấ t ít khơng gian. Chọn hiển thị 5Ơ
n ú t radio th ay vào đó sẽ chiếm nhiều khơng gian hơn và có th ể khiến
cho phần còn lại của form cuộn ra khỏi đáy m àn hình.
Yêu cầu dữ liệu nhập người dùng sử dụng một form H TM L
Để thây m ột form HTML điển hình trơng giống như th ế nào, hãy
k iểm tra tra n g web tro n g hình 8-1. U nited S ta te s P o stal Servive
(www.usps.gov) cung cấp form trực tuyến này để đăng ký các thay đổi
địa chỉ của các gia đình hoặc cơ sở kinh doanh chuyển nhà và muốn thư
clươc chuyển riếp đến VỊ trí mới của họ.
IHnvMiRtiiH* ' VA*n
Mnvtrwj SnluliMt • ‘Mir.ioxflftFvplrfci
□ 3x]
U N IT E D S T A T E S
PO STA L
séiĩvtcẽs
MoversGuide
“ MA !: r f V O' I R A f O f i F S s O N l I N P
Cltamjcyuur ¿tídiess
Movinij services
Fill out tho change of address form
ful >1)IS
Communitymío
Olh'íí ierwces
N am e
PieftxTiHe tHtio)
FirstName(ofwaft
|
Middle Name ,cx nbaf; (Hup)
|
last Name
SijTot
|
jn/A
Ạ
Hình 8.1 Thay đểi form địa chỉ trẽn web site U.SLIDE. Postal Service.
Trường form đầu tiên trên màn hình được ghi nhãn là "Prefix Title"
cho phép người dùng chọn từ một số tiền tố tên (chẳng hạn như "Dr.,"
"M arker.," và "Mrs."). Nếu họ không sử dụng một tiền tố trước tên của
họ, họ có th ể chọn "N/A" thay cho not applicable (không th ể áp dụng).
Điều khiển này được gọi là một list box (hộp danh sách) vì bằng cách
188
Chương 8: xử lý các web form
n h ấn nút mũi tên hướng xuống người dùng sẽ thấy một số tùy chọn mà
họ có th ể chọn.
¿ I MoveitGuiđe • Youf Complete Moving Solution • MiciDtoO Inteinel Ettptofet
O* £d¡t y»** Ffvorfof Jooh
.....Fr.y*ó -i Stop
"a5
- "
iSI
ò
ỡ ck
Rteth Home
ô
f
I 'ó
'Ê
I Search Favorite«
Mcdạ
-3
& Ịiơ'
\ & ¡Maỉ
Hưỉoty [
U M T E D STATES
P O S TAL S E R V IC E «
,
:/
-;i;V
M o v e r s G u id e
-
*■'
C H A ', c t
V 0 u K A D D fl £ $ s
0 H L 1 N «:
rtiMigpymir MfcfrftKS
Mcvttig Sdrvti e s
F ill o ư t t h * c h a r g e o f a d d r e s s *orrn
Heílífiíltos
Community into
Name
Crti»Cĩ services
Prefix Tine ĩHtia)
WA
Flr$IN *m e(orrể«) iHtip*,
cấ
OR
Middle Name (or ntnl) mLast Name (Ht'p-J
Suffix Titie: fHtio'i
Lli
sgfo«*
r
HON
xx?€
KtẳS
hfí
MRS
MS
SA
r r ;l3 Í70Irteme*
Trường form được ghi nh ãn là "First Name" là m ột tex t box cho
phép người dùng nhập m ột hoặc nhiều ký tự sử dụng bàn phím. Đơi khi
các nhà lập trìn h đặt các giới hạn trên trường này sử dụng JavaS cript,
nhưng người dùng thường có th ể nhập bất kỳ tổ hợp mẫu tự, số hoặc
Symbol đặc biệt. Các nhà lập trìn h có th ể sứ dụng m ột HTML để xác
định m ột chỉều dài tối đa nho tníờng nàv.
Khi ngươi dùng đã nhập xong dữ liệu cá nhân, nọ được đé nghị nhâp
vào một nút subm it HTML. Nút subm it làm cho dữ liệu từ web form được
gởi đến m ột chương trìn h đang đợi trên web server để xử lý. Sử dụng
JavaScript, các nh à p h át triển web có th ể hiệu lực hóa dữ liệu trước
khi cho phép việc đệ trìn h đến web server tiến hành.
Xử lý dữ liệu nhập Form bằng JavaScript phía Client
Một khi form đã được điền vào và được đệ trìn h , nó thường được gởi
đến một web server để xử lý. Điều quan trọng là phải chú ý rằng nó
khơng n h ấ t th iế t phải được gởi đến một web server - đôi khi các web
form có th ể được xử lý hồn toàn trê n Client sử dụng JavaScript. Bạn
sẽ cần thấy những form phía Client này dưới dạng các chương trìn h
tín h tốn trực tuyến và những cơng cụ tương tự ở đó JavaS cript đủ
thơng m inh để tín h toán k ết quả mong muốn và thực hiện h àn h động
được yêu cầu m à không cần sự trợ giúp từ m ột web server.
Chương 7: Các Struct, Enum và thc tinh
189
Kêi quả:
Chương trìn h này sẽ tạc ra hộp thông báo được m inh họa trong
hỉnh 7.1.
OK
L
Hình 7 1 Hộp thơng báo
Thực hành 7.5
Viếl một chương tririh để C )Ọ ! rrột tron-3 các: hàn riêng của C-T+ chẳng han
!ih j pu;s nầm trong .hư viện ns/crt.đll
7.íi.S Mó ị^hỏr.g c«{ li jr. Kọ'|j
Có th ể sử dụnjí các ỉhuộc tính đế mn phóng các
trong Cr+ nhơ dược t.rmh bay trong Vì du sau đ â\:
[type: StructL ayout(L3youtKinrJ Explicit)]
public siruf't UiitonStiucf.
(
[field: Field0ffset(0;j /I offset #(J
public int i;
[field: FieldOffset(O)] // offset #0
public double d;
Ỉ
Trong ví dụ này hai thuộc tính được sử dụng:
[type: StructLayout(LayoutKind.Explicit)]
[field: FieldOffset(O)]
lién hơp (union)
190
Chương 8: Xử lý các web form
B Một binary dược biên dịch đítợc tiết bằng hầíi như bất kỳ ngơn nqữ
(chẳng hạn nhìỉC).
Một khi những chương trìn h này chấp nhận dữ liệu được đệ trình
bởi web form, chúng thường thực hiện b ất kỳ việc xử lý được yêu cầu và
sau đó phản hồi lại trìn h duyệt bằng một tra n g HTML khác. Tiến
trìn h giao tiếp giữa client và server được m inh họa trong hình 8-3. Nó
m inh họa một ví dụ về một người dùng thực hiện một cuộc tìm kiếm tại
một trong các web site bộ máy tìm kiếm lớn. Web server chấp nhận
các từ khóa sử dụng một form HTML, kiểm tra cơ sở dữ liệu của nó để
tìm các tra n g web liên quan và trả về một tran g web HTML mới có kết
quả.
Chèn một form HTML vào một trang web
Các form được thêm vào các tran g web giống như cách các ảnh, text
và những phần tử khác của trang, với m arkup HTML. Các nhà p hát
triển có th ể định nghĩa tấ t cả phần của một form bao gồm các điều khiển
(control) mà nó chứa và chúng được sắp xếp như th ế nào sử dụng các thẻ
HTML chuẩn.
Sử dụng thể <form>
Trong HTML, các form được định nghĩa sử dụng thẻ <form>. Thẻ
<form> cho phép bạn định nghĩa loại form mà bạn muốn tạo bao gồm
URL của chương trìn h đợi chấp nhận dữ liệu nhập của người dùng (nếu
có). Những form này được xác định sử dụng các thuộc tính của phần tử
<form>. Một thuộc tín h (attribute) là tham sơ được đặt tên của một phần
tử và đữ liêu đi kèm Cán thiiôc. tín h đươc xác đinh bãng cách sau đâv:
•
•
•
•
o
<element attribute1="valuer attnbute2="value2" ... attribute3=”value3*>
Googlc.com
n
1. I w n submitted
10 web server.
2. Web server
. checks its database.
w eb browser
Googh
3. New web page
returned to tuer.
ềỂ Ể B ủ
*srass=z
• database
Webserver
Hình 8.3 Giao tiếp giữa Client và server khi một form HTML được đệ trình.
P h ần tử <form> có những thuộc tín h sau đây:
ẫ! id Chuỗi phải duy nhất qua toàn bộ trang web
Chương 8: x ử lý các web form
191
B class Danh säen các class css được két hợo
n style Các ỉệììb style css nội dồng (ĩnHne)
B title Tiêỉi dề tư vẩn
R lang Mã ngôn ngứ ISO
ẫf d ir Hướng của rext ú ừ phái sang trái hoặc trí trái sang phải)
R action ƯRI của chương tnno vốn sẽ x ù ly áữ liệu form
B m ethod Các dứ liệu sẽ được chuyển đến sewer (GET hoặc POST)
u enctype Kiểií mã hóa M1.MF,
R accept Dank sách các kiểu MJME dươc chắp nhận để upload file
B accept-charseí Danh sách các charset được hồ trợ
Ngồi tấ t cả thuộc tín h đó, phần tử <form> cũng có thể chứa một số
phương thức xử lý sự kiện (event handler). Các event là những hành
động thường được khởi tạo bưi người dùng chẳng h ạn như di chuyển
chuôt hoặc các thao tác nk ấn phim r.hất định. Các event h i r d l e r là ra#,
va hàm Jav aS crip t được th iế t kế ồể tác động khi các sự kiện n h ấ t định
xảy ra. Chương 9 so irìah bày chi ù é t non cac pnuơng thức xủ lý áự
kiện HTML ấn định sẵn.
Bi U U Y Ề r
Gửi mai) i . ộ; tíui.g cCa một fưin iến jạn
Thc tính action oủa *hẻ <-form> cho nhép ban xác định UR! weh ser /e''
cho chương trinh mà Stì xử lý form. Chương trmh này thường ià một ỉrang
A S P , Java serviet hoặc môt script Perl chạy trên một web server đích.
Bạn cĩíng có thể ra lệnh trinh duyệt gở; e-nai! cho bạn nội dung của form
thay vào đó. Đtều này được thưc hiện báng cách cung cấp một địa chỉ email sử dụng giao thức mailto: cho thuộc tinh action. Để tạo một URI sử
dụng giao thức mailto, ban chỉ việc thém đia chì e-rriail tnật sự váo chuỗi
mailto: như sau:
mailto :
Nếu bạn đã sử dụng chuỗi trước làm URI chc thuộc tính action, nội dung
của web form sẽ được gởi mail đến tổng thống của nước Mỹ.
Tuy nhiên, kỹ thuật này khơng được bảo đảm vì nó sử dụng chương trình
mail được cài đặt trên máy tính của người dùng. Chương trình có thể khơng
được xác lập chính xác để gởi e-mail hoặc người dùng có thể hủy gỏi email.
192
Chương 8: x ử lý các web form
Bây giờ chúng ta chỉ quan tâm đến hai sự kiện có th ể xảy ra với một
web form :
H onsubmit Mã JavaScript vốn có thể được chạy tniớc khi form đìỉợc
đệ trình
R o n reset Mã JavaScript vốn sẽ được chạy tnỉớc khi dữ liệu của form
bị xóa.
Một số phần tử HTML có những thuộc tính b ấ t buộc nghĩa là các
thuộc tín h phải ln hiện diện. P hần tử <form> là một trong số đó, vì
thuộc tín h action phải luôn được xác định để HTML được hợp lệ.
Loai form cơ bản n h ấ t như sau:
<form action-T>
</form>
Mã HTML này tạo một form rỗng không chứa b ấ t kỳ điều khiển. Các
form chẳng h ạn như form này dĩ nhiên hồn tồn vơ dụng bởi vì chúng
khơng có mục đích. Các phần tử HTML <form> th ì ẩn vì chúng khơng
có một th àn h phần trực quan. Các điều khiển form (ví dụ các nút và
text box) là những th àn h phần trực quan của các form. Các form cũng
có th ể chứa text, các bảng (table) và những phần tử HTML khác.
• ••••••
Thủ thuật
Dấu pound (#) thường được sử dụng làm giá trị cúa thuộc tính action của thẻ
<form> khi khơng cần gì cả, vì thuộc tính action bắt buộc và khơng thê được bỏ
qua. Bạn có thể sử dụng thuộc tính này cho các form được thiết kế để chỉ hiện
hũ\j trên client mà sẽ khơng bao giờ cần được đệ trình đến server. Dấu pound
(#) là môt trong các UPL hợo lệ ngắn nhất
Thêm các điều kliiển form
Như bạn đã thây các form khá vơ dụng nếu khơng có các điều khiển
(control). Các control forra cho phép các tran g web nhập dữ liệu người
dùng. Một số control cho phép người dùng tự nhập te x t và m ột số control
cung cấp cho người dùng một số tùy chọn định nghĩa sẵn để chọn lựa.
Các control form được thêm vào các phần tử <form> bằng HTML riêng
của chúng. Bảng 8-1 liệt kê các control nhập liệu thông thường cùng với
HTML được yêu cầu để thêm chúng vào một tra n g web.
Chấp nhận dữ liệu nhập Text với một Text Box
Có lẽ loại control form thông thường n h ấ t là te x t box. Thực tế control
text box là loại mặc định của phần tử <input>. M ã HTML sau đây sẽ tạo
một web form với một text box bên trong.
<form action=”#”>