fbpx

Tìm hiểu về một số cú pháp ES6 trong JavaScript

JS ES6

Giới thiệu

Cú pháp ES6 hay còn được gọi là ES2015 đều là những chuẩn chung để nói về cú pháp mới trong JavaScript, kể cả sau này chúng ta cũng có thể gặp ES7 (đã ra mắt 2016) và ES8 nữa không chừng. Ngoài những cú pháp mới hỗ trợ cho các lập trình viên tận răng sức mạnh từ JavaScript, các cú pháp cũ của chúng ta cũng sẽ được thay đổi và nâng cấp theo chuẩn mới. Giúp cho mã nguồn chúng ta dễ đọc và dễ quản lý hơn.

Sơ lược về bài viết

Trong bài viết này chúng ta sẽ tìm hiểu qua các chủ đề sau:
  1. Cú pháp khởi tạo biến (Variable) hoặc hằng số (Constant)
  2. Tìm hiểu nội suy chuỗi (String Interpolation)
  3. Tìm hiểu về các giá trị mặc định (Default Values) của các tham số (Parameters) trong hàm (Function)
  4. Tìm hiểu về Arrow Functioncách viết tắt của Arrow Function

Cú pháp khởi tạo biến hoặc hằng số

Trong cú pháp ES6, các bạn có thể dùng từ khóa letconst để định nghĩa 1 biến hay hằng số. Những vấn đề này có lẽ các bạn đã từng khá quen thuộc nếu như đã từng học qua lập trình ở các ngôn ngữ khác rồi.
// Cú pháp khởi tạo biến và hằng số
let numVar = 1;
let stringVar = 'Hello World!!!';
// numVar += 1; ==> numVar === 2

const numConst = 1;
const stringConst = 'Hello World!!!';
// numConst += 1; ==> error
Ở đoạn code trên cho các bạn thấy rằng, cách thức sử dụng let  hoàn toàn không khác gì so với cách chúng ta sử dụng var  cả. Vì thế các bạn nên sử dụng let  thay vì var  trong mã nguồn để tránh gặp lại các lỗi xưa kia mà Javascript từng bị mắc phải và đã được thay thế ở cú pháp mới.

Nội suy chuỗi

Trước đây để có thể nối các chuỗi ở các biến lại với nhau, ta thường dùng phép cộng (+ ) để cộng các vế lại sẽ ra được 1 chuỗi hoàn chỉnh. Thì với cú pháp ES6 này, việc sử dụng biến hoặc hằng số trực tiếp trong chuỗi giúp đơn giản hóa việc chúng ta gõ và code nhìn cũng sạch sẽ hơn rất nhiều.
// Nội suy chuỗi (String Interpolation)
let stringVar = 'Hello World!!!';
console.log(`Nội suy chuỗi: ${stringVar}`); // ==> "Nội suy chuỗi: Hello World!!!"

function stringInterpolation() {
  return 'stringInterpolation đã được gọi!!!';
}
console.log(`Nội suy chuỗi: ${stringInterpolation()}`);
Các bạn thấy đấy để có thể nội suy một biến nào đó bên trong rất là dễ dàng đúng không? Javascript sẽ tự hiểu và thay thế hoặc gọi lại hàm mà bạn muốn bên trong dấu hiệu ${}này.

Tìm hiểu về các giá trị mặc định của các tham số trong hàm

Trước đây, để các bạn có thể định nghĩa được các tham số mặc định khi truyền vào thì cách truyền thống sẽ như thế này:
function originalDefaultValues(a, b) {
     a = a || 1; // Nếu có giá trị và không rỗng hoặc sai(false) thì set là a, nếu không sẽ là 1
     b = b || 2; // Tương tự như trên
}

Và với cú pháp mới, Javascript đã cho phép chúng ta viết dễ dàng hơn hẳn:

// Các giá trị mặc định của các tham số trong Function
function defaultParams(a = 1, b = 2) {
  console.log(`Giá trị mặc định: ${a} - ${b}`);
}
defaultParams();

Tìm hiểu về Arrow Function và cách viết tắt của Arrow Function

Arrow Function hay còn gọi là hàm mũi tên, nhưng mà tốt nhất thì các bạn đừng dịch ra vì nghe nó rất “củ chuối”. Nó thừa hưởng cách viết ngắn gọn bằng cú pháp ES6 nhưng bên trong nó sẽ có nhiều điểm khác biệt so với hàm thông thường mà chúng ta được biết.
// Function thông thường
function regularFunc() {
  this.hello = 'Hello Regular Function';
  console.log('regularFunc: ' + this.hello);
}
regularFunc();

// Anonymous Function
let anonymousFunc = function() {
  this.hello = 'Hello Anonymous Function';
  console.log('anonymousFunc: ' + this.hello);
}
anonymousFunc();

// Arrow Function
let arrowFunc = () => {
  // this ở đây sẽ không hiểu nếu bạn dùng 'use strict' ở Javascript hoặc khi dùng Babel
  this.hello = 'Hello Arrow Function';
  console.log('arrowFunc: ' + this.hello);
}
arrowFunc();

// Một số cách viết tắt trong Arrow Function
let full = (a = 1 , b = 2) => {
  return a + b;
}
full(); // full === 3
let one = a => a; one(5); // one === 5
let two = (a, b) => a + b; two(1, 2) // two === 3
Qua đoạn code trên thì các bạn cũng sẽ được thấy 2 cách thông dụng nhất từ trước đến nay là Function thông thường và cách sử dụng Anonymous Function (Hàm vô danh – một cách khởi tạo hàm khác của hàm thông thường) để khởi tạo hàm thì nay chúng ta sẽ tạo hàm bằng cú pháp gần như tương đương với 2 cách trên.
Ngoài ra, các bạn còn được hỗ trợ thêm cho việc “lười biếng” với các cách viết tắt không kém phần khó hiểu khi sử dụng ban đầu. Vậy đâu là sự khác biệt giữa Function thông thường và Arrow Function ??? Mời đọc giả hãy đón xem ở các bài viết sau.

Source tham khảo


See the Pen Tìm hiểu cú pháp ES6 by Ân Vũ (@thienanblog) on CodePen
light

Sửa lỗi Chrome và WordPress Admin Bar

Trong bản cập nhật mới đây của Chrome (Version 45.0.2454.85 m) đã xảy ra tình trạng kỳ lạ khi các Menu trong WordPress Admin Bar như sau:

Lỗi lạĐể có thể sửa lỗi này thì theo các thành viên Support tại https://productforums.google.com/forum/#!topic/chrome/vRbjCc-eafw đưa ra giải pháp sửa lỗi Chrome cho các bạn như sau:

– Vào địa chỉ chrome://flags/#disable-slimming-paint
– Chọn Enable chức năng “Disable slimming paint”.
– Các bạn hãy chắc chắn rằng chức năng “Enable slimming paint” phải được tắt.
Sửa lỗi Chrome
– Sau đó chọn Relaunch Chrome.
Chúc các bạn thành công! Ngoài ra, còn một số lỗi xảy ra trên website tác giả mà vẫn chưa tìm được cách khắc phục và có lẽ phải chờ bản vá của Google.

 

Phá giá Website, vấn đề muôn thuở

Như các bạn cũng biết, thị trường Website Việt Nam hiện nay trở nên màu mỡ cho các lập trình viên. Qua đó, việc xuất hiện của các công ty, cá nhân sử dụng quá nhiều tiêu đề “giá rẻ” trong chính cả Slogan và thương hiệu của mình. Khiến cho thị trường Website trở nên khó khăn vì người lập trình viên giỏi thì mất quá nhiều công sức và thời gian để tích lũy kinh nghiệm phải bị ép một cái giá “không thể tin nổi” và có thể chỉ chênh lệch chút đỉnh so với người mới vào nghề vì cái giá rẻ đến mức không thể nào nâng hơn được vì nếu nâng thì “một xu dính túi” cũng không có.

Phá giá Website

Nguyên nhân do ở đâu?

  1. Lập trình viên được đào tạo tràn lan nhưng vấn đề chuyên môn vẫn là dấu chấm hỏi với doanh nghiệp và khách hàng.
  2. Chính sách hướng nghiệp ở Việt Nam không tốt, chủ yếu chú trọng quá nhiều vào kết quả của ngành là “tiền” vì lập trình viên thường rất nhiều tiền nhưng sẽ đánh đổi bằng “chất xám” và thời gian của mình vì vòng đời lập trình viên rất ngắn.
  3. Tâm lý định giá sản phẩm quá rụt rè, nhiều khi thấy ông chủ “dữ dằn” quá là sợ.
  4. Do Website được gán mác “giá rẻ” tràn lan thì việc định giá trở nên khó khăn vì người mua không cần biết là lập trình viên viết thế nào? Chỉ cần đúng mục đích của họ và thậm chí là chỉ cần chạy được.
  5. “Tiền nào của đó” vẫn là câu mà ông bà ta thường xài và nó vẫn đúng trong trường hợp này. “Ngon bổ rẻ” chỉ có trong mơ mà thôi…vì lập trình viên không thể sống bằng “không khí”. Kéo theo đó là chất lượng và tâm lý đa số khách hàng “e dè” nếu hét giá quá mắc so với thị trường.

Làm thế nào để cải thiện tình hình?

  • Hãy ra một cái giá hợp lý với công sức mà các bạn bỏ ra, đừng ngần ngại khi hét cái giá mà bạn nghĩ rằng nó quá mắc, bởi vì cũng do chính tâm lý đó mà bạn vô tình “down” giá chính “đứa con tinh thần” của mình.
  • Hãy làm một sản phẩm thật chất lượng, hãy cho khách hàng thấy những sản phẩm Demo hoành tráng. Vì họ cần xem bạn làm được gì trước khi thuê bạn, và nếu họ cảm thấy rằng thuê bạn an tâm thì việc giá bạn có mắc hơn thị trường cũng chẳng sao.
  • Nếu như bạn có khách hàng “ruột”, đôi khi giảm giá cho họ chút đỉnh nếu như họ muốn các bạn viết nhiều, như thế có thể gây thiện cảm và hơn hết chất lượng phải đi kèm với điều đó. Như vậy sẽ giúp họ có tâm lý thoải mái hơn khi làm việc với bạn, việc thuê bạn dài dài trong tương lai là chắc chắn vì ai cũng có tâm lý ngại thuê người khác.
  • Không ngừng trau dồi kỹ năng và công nghệ để viết lên những sản phẩm Demo “hoành tá tràng” để gây ấn tượng với khách hàng. Nếu như bạn có những kỹ năng ở đâu cũng có và Website của bạn không có gì đặc biệt thì việc họ thuê ở công ty lớn là chuyện đương nhiên. Vì chẳng ai bỏ tiền ra để mà “mạo hiểm” dùm cho bạn cả.
  • Nói không với mác “giá rẻ” vì như vậy sau này bạn sẽ khó có thể phát triển thương hiệu lớn lên được. Vì tâm lý “giá rẻ” của thương hiệu đã ngấm vào máu của những người từng sử dụng dịch vụ của bạn.
  • Vấn đề cuối dành cho các bạn sinh viên, đừng ngại ngùng khi thử sức mình. Và đừng “dại dột” nếu nói khách hàng rằng “mình mới ra trường” vì như vậy bạn chẳng thể nào mà thương lượng cả, khi buôn bán hãy để chúng ta là người “Bán dịch vụ” ngang hàng với khách hàng.

Bớt chém gió và báo giá làm loạn thị trường

Rất có thể nhiều bạn sẽ thấy lạ, nhưng sự thật vẫn có những người báo giá “vùi dập” nhau nhưng họ lại không nhận dự án đó khiến khách hàng cũng phân vân theo “liệu giá đó có ổn không?”. Nên nhớ, khách hàng luôn là người quyết định và tâm lý khách hàng rất quan trọng. Đôi khi cũng có người “ngoại đạo” vào phá. Vì vậy, hãy chuẩn bị tinh thần để đối chất và đưa ra những bằng chứng cho khách hàng (Sản phẩm Demo) thấy và đừng chỉ nên nói bằng lời.

Những ai đã và đang như vậy thì nên bỏ ngay tính “GATO” của đại đa số người Việt Nam mắc phải. Một người, hai người, ba người… rồi cũng khiến thị trường khá lên. Bỏ ngay cả suy nghĩ “đơn thân độc mã” như vậy thì như “lấy muối bỏ bể”. Nếu như ai cũng nghĩ như vậy thì Việt Nam cũng sẽ nằm ở vùng trũng của thế giới. Đó là vì sao mà chính người Việt là rất ghét làm với người Việt thay vì nước ngoài.

Lời kết

Hãy vững tin với những gì bạn bỏ ra, đừng hạ thấp bản thân mình. Bạn không giúp bạn thì chẳng ai giúp bạn cả, nên nhớ thị trường là phải dìm nhau đến mức ra một cái giá rẻ bèo. Chẳng ai muốn bỏ ra một số tiền lớn cho một sản phẩm mà mình không biết được chất lượng của nó cả. Vậy nên, tạo cho mình thương hiệu cá nhân cũng rất quan trọng khi xin việc hay nhận dự án các bạn nhé.

Kỹ năng nghiên cứu trong lập trình

Kĩ năng nghiên cứu trong lập trình

Tại sao chúng ta nên học kỹ năng nghiên cứu?

Như các bạn cũng biết, lập trình viên chúng ta hằng ngày phải tiếp xúc vô số các công việc trong dự án. Không ít bạn cũng gặp rất nhiều tình huống oái ăm, những vấn đề không tìm được giải pháp và trở nên bế tắc.

Chúng ta luôn rơi vào tình trạng suy nghĩ rất nhiều và câu hỏi luôn xoay quanh những câu đại loại như:

  • Mình có làm được hay không? Thấy kỹ năng mình kém quá.
  • Hỏi sếp hay tự giải quyết đây? Mà hỏi vậy có bị chửi không ta?
  • Mình phải đi tìm sư phụ để thụ giáo thôi, có như vậy mới nhanh lên skill được.
  • Hay mình nên hỏi đồng nghiệp của mình cho nó nhanh. Nó giỏi hơn mình mà.

Đó chính là những câu hỏi rất chi là “ngây ngô” trong giới lập trình viên và ắt hẳn chí ít 1 lần trong đời làm lập trình viên ai cũng từng suy nghĩ như vậy trong những lúc vấn đề bế tắc cả về tinh thần, kiến thức và kinh nghiệm trong hiện tại.

Học kỹ năng nghiên cứu như thế nào?

Trước tiên để học kỹ năng này, bạn cần phải có suy nghĩ tích cực như sau:

  1. Tự mình nghiên cứu vấn đề mà không phải nhờ vả ai cả.
  2. Không phải ai đều “tự nhiên” giỏi cả, họ đã trải qua rất nhiều gian khổ để đạt được trình độ đó.
  3. Bắt tay vào thực hiện ngay vấn đề khó hiểu thay vì nghĩ và nói nhiều hơn làm.
  4. Tập làm bạn với Debugger (Công cụ tìm lỗi) nhiều hơn.
  5. Tập không nhớ gì cả… mà hãy nắm vững vấn đề mấu chốt thay vì nhớ.
  6. Cuối cùng là trình độ tiếng Anh cần phải được cải thiện khi có thể ít nhất là kỹ năng đọc. Vì tài liệu viết nhiều hơn là Video để nghe.

Với những suy nghĩ trên, có thể bạn nghĩ rằng mình sẽ không làm được đâu? Bạn nghĩ rằng không phải ai đều giỏi…bla..bla. Hàng tá vấn đề khiến chúng ta nhụt chí.

Đừng nghĩ nữa?

Hãy bắt đầu tập ngay từ bây giờ! Thế nhưng:

  1. Tôi phải làm gì đây?
  2. Tôi phải bắt đầu từ đâu?
  3. Tôi phải đi nghiên cứu cái gì?
  4. Tôi phải sâu chuỗi các vấn đề mới như thế nào?

Lại là câu hỏi đúng không các bạn? Thế tới đây bạn vẫn còn muốn đọc tiếp bài của tôi không? Nếu như bạn vẫn đủ dũng khí thì hãy tiếp tục bởi vì nó cần sự “dũng cảm” của bạn. Bạn có dám đương đầu với khó khăn không chính là lúc này. Không phải là nghe những lời mà người khác dạy bạn về “động lực” để tiến lên trong cuộc sống. Nó chỉ là CHÉM GIÓ mà thôi, quan trọng là bản thân bạn.

Thực hiện những gì?

Cách lập trình viên nhìn vấn đề

Đừng nóng vội, hãy chuẩn bị cây bút hay hiện đại hơn thì dùng “Notepad”. Bạn hãy ghi chú lại những gì bạn gặp sau đây ngay từ BÂY GIỜ (vì chẳng ai nhớ là mình cần nghiên cứu những gì trước đó đâu):

  1. Khi bạn sử dụng thư viện nào đó.
  2. Khi gặp vấn đề khó hiểu.
  3. Khi gặp công nghệ mới.
  4. Khi gặp thuật ngữ khó nhớ và lạ.
  5. Khi gặp được bài viết, video dễ hiểu (Không phải cái nào cũng ghi chú nhé)

Hãy đi từng bước đầu tiên vì bạn không phải là siêu nhân!

  1. Tập sử dụng Google nhiều lên, nhất là cách “search” từ khóa là rất quan trọng trong công việc ngày này. Nhất là “search” bằng tiếng Anh và thứ hai là cần trình độ “tiếng Anh chuyên ngành” nhất định để đọc tài liệu.
  2. Hãy thực hiện ngay vấn đề khó hiểu mà bạn thấy rằng nó có thể thực hành được. Và có thể tạm thời bỏ qua tìm hiểu khái niệm về nó nếu như đọc hoài vẫn chưa hiểu.
  3. Công nghệ mới rất cần thiết cho lập trình viên, vì thế nên cập nhật liên tục. Thấy hay là đánh dấu lại liền, sau này có nhu cầu thì tự nhiên các bạn sẽ sực nhớ về nó thôi. Chắc chắn vì đó là phản xạ của tiềm thức khi bạn gặp vấn đề phù hợp với nó (Vì câu hỏi sẽ phải áp dụng công nghệ mới đó ở đâu thường là rất khó trả lời).
  4. Thuật ngữ trong lập trình là rất quan trọng, không chỉ giúp ích các bạn trong quá trình “search” mà còn giúp các bạn có vốn “keyword” (Từ khóa) khi “search”. Như “params, DOM, function, method…”. (Bạn sẽ thấy dễ nếu như các bạn đã từng biết nhưng sẽ khó nếu như bạn là lính mới). Vì thế hãy tập suy nghĩ của mình như một người không biết gì thì phải tìm từ cái gì đi lên như khi xây nhà thì cần bao nhiêu công đoạn?
  5. Bài viết, Video chi tiết có thể giúp bạn hiểu nhanh vấn đề nào đó thay vì phải tự mình “search” rất chi là mệt nhọc. Đừng ngại đọc bài của người khác vì như thế sẽ giúp bạn tiếp thu ngay kiến thức và kinh nghiệm của họ mà trong khi họ phải nghiên cứu và trải nghiệm rất lâu để có thể truyền đạt lại (Ví dụ như bài viết bạn đang đọc là thằng chủ nó cũng “Vắt óc” lên đấy). Nhưng “hòa đồng” không phải “hòa tan” các bạn nhé. Cái nào trong bài viết mà các bạn cảm thấy nó không đúng, hãy mạnh dạn đánh dấu nó lại và tìm hiểu ngay vấn đề đó đừng để nguội (Vì chắc chắn bạn sẽ quên nó vào ngày mai).
  6. Đây là bước cuối cùng, sau khi tìm hiểu vấn đề nào đó thành công, hãy thống kê lại những gì chúng ta từng nghiên cứu vì lúc này cái nhìn của bạn về vấn đề đã thông hiểu và trở nên dễ dàng hơn bao giờ hết. Hãy tối ưu lại vấn đề sao cho thực hiện nó nhanh nhất, dễ hiểu nhất và càng ngắn càng tốt như ông Bill Gates đã từng nói “I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.” (Tôi chọn người lười biếng cho một công việc khó khăn. Bởi vì một người làm biếng sẽ biết tìm con đường dễ dàng nhất để thực hiện nó). Và quan trọng nhất là bạn không nên tìm sự tối ưu ngay khi chưa biết gì hoặc chưa chắc chắn về nó cả? Hãy cứ làm một cách “cẩu thả”, vì khi bạn “cẩu thả” bạn sẽ biết cách để làm cho nó “gọn gàng” và ngược lại.

Lời kết, qua bài viết này mong rằng những thắc mắc cũng như nỗi lo âu của đa số các lập trình viên cũng như các bạn trẻ đang muốn trở thành lập trình viên được giải tỏa. Hãy mạnh mẽ lên, thành công nào cũng phải trải qua gian khó và thất bại. Nhưng qua đó, bạn sẽ trưởng thành lên từng ngày trong cả lập trình và trong cuộc sống. Chúc các bạn thành công trên con đường mình chọn.

Phóng to hình ảnh với jQuery EasyZoom

Giới thiệu và cài đặt

Zoom hình ảnh

Tác giả: Alen Grakalic

Website: http://i-like-robots.github.io/EasyZoom

Plugin này được tạo ra để giúp chúng ta có thể hiển thị những hình ảnh cỡ lớn giúp người dùng có thể xem rõ hình ảnh hơn. Nhất là ở những Website bán hàng, khi mà người dùng rất cần một hình ảnh chân thật, to và rõ ràng để họ có thể xem sản phẩm một cách tốt nhất trước khi quyết định mua.

Plugin này ra đời để giúp ta làm điều đó bằng cách tải hình ảnh lớn khi chúng ta rê chuột vào hình ảnh nhỏ, tạo cảm giác cho người xem như chúng ta đang dùng chức năng Zoom In (Phóng to) hình ảnh lên vậy.

Để có thể sử dụng Plugin các bạn cần theo các bước sau:

  1. Truy cập vào https://github.com/i-like-robots/EasyZoom/zipball/master . Sau đó hãy tải file nén về và giải nén ra và chúng ta sẽ có cấu trúc thư mục như sau:

Cau truc thu muc

 

  1. Các bạn hãy tìm 2 file cần thiết sau đây: easyzoom.js  easyzoom.css .
  2. Tiến hành thêm thư viện vào trong website của chúng ta, nhưng các bạn cũng cần phải tải thư viện jQuery tại http://jquery.com về trước nhé:

 

Them thu vien

  1. (Tùy chọn) Nếu như bạn không có sẵn hình ảnh để Demo Plugin này có thể Copy luôn thư mục example-images  bên trong để sử dụng.
  2. Cài đặt hoàn tất

Sử dụng

Để sử dụng Plugin này, các bạn cần phải làm chính xác những gì tôi hướng dẫn. Bởi vì, website của tác giả hướng dẫn rất sơ sài. Và chủ yếu nhờ vào cách sử dụng của tác giả và tôi hiểu ra cách sử dụng của nó.

Tính năng Overlay (Che Phủ)

Đầu tiên, các bạn cần chuẩn bị các hình ảnh ở những bước trước chúng ta đã làm, sau đó hãy tạo ra một file và bạn có thể tùy nghi đặt tên, ở đây tôi sẽ đặt là overlay.html  và có cấu trúc như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>EasyZoom - Thienanblog.com</title>
	<link rel="stylesheet" type="text/css" href="css/easyzoom.css">
	<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
	<script type="text/javascript" src="js/easyzoom.js"></script>
	<style type="text/css">
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}
	</style>
</head>
<body>
	<div class="wrap">
		<div class="easyzoom easyzoom--overlay ten-class-tu-dat">
			<a href="img/2_zoom.jpg">
				<!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML -->
				<img src="img/2_standard.jpg" alt="" width="500" height="400"> 
			</a>
		</div>
	</div>
	<script type="text/javascript">
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	</script>
</body>
</html>

Khi chạy ví dụ trên các bạn sẽ thấy như sau:

Overlay

 

Vậy do đâu Plugin này có thể chạy được, các bạn hãy chú ý các điểm sau:

  1. <div class=”easyzoom easyzoom–overlay ten-class-tu-dat”>  : các tên lớp cần thiết để Plugin có thể chạy. Và trong đó bạn để ý easyzoom—overlay  chính là tên tính năng sẽ chạy khi thiết lập.
  2. Bên trong <div class=”easyzoom easyzoom–overlay ten-class-tu-dat”>  sẽ có cấu trúc như sau:
<a href="img/2_zoom.jpg">
	<!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML -->
	<img src="img/2_standard.jpg" alt="" width="500" height="400"> 
</a>
  1. <a href=”img/2_zoom.jpg”>  : chứa thẻ href chính là đường dẫn đến hình ảnh lớn của bạn.
  2. <img src=”img/2_standard.jpg” alt=”” width=”500″ height=”400″>  : Chứa hình ảnh nhỏ và hiển thị ra bên ngoài trước khi người dùng rê chuột vào. Các bạn lưu ý chiều rộngchiều cao (Width & Height), các bạn phải ấn định nhỏ hơn tấm hình lớn nhé và có thể tùy nghi chọn kích thước phù hợp với website của mình.
  3. Đoạn mã trong cặp thẻ <script>  đơn giản chỉ như sau:
<script type="text/javascript">
	// Instantiate EasyZoom instances
	var $easyzoom = $('.ten-class-tu-dat').easyZoom();
</script>
  1. Như vậy là bạn đã hoàn tất việc chạy Ví dụ đầu tiên với tính năng “Overlay” rồi đấy.

Tính năng Ajacent (Liền kề)

Các bạn có thể chuẩn bị cấu trúc HTML như sau và lưu tên file là ajacent.html :

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>EasyZoom - Thienanblog.com</title>
	<link rel="stylesheet" type="text/css" href="css/easyzoom.css">
	<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
	<script type="text/javascript" src="js/easyzoom.js"></script>
	<style type="text/css">
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}
	</style>
</head>
<body>
	<div class="wrap">
		<div class="easyzoom easyzoom--adjacent ten-class-tu-dat">
			<a href="img/2_zoom.jpg">
				<!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML -->
				<img src="img/2_standard.jpg" alt="" width="500" height="400"> 
			</a>
		</div>
	</div>
	<script type="text/javascript">
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	</script>
</body>
</html>

Khi chạy ví dụ trên các bạn sẽ thấy như sau:

4. Ajacent

Tính năng này giúp chúng ta khi rê chuột vô hình ảnh, thì đồng thời Plugin sẽ tạo ra một hình ảnh nữa nằm bên phải và có chiều dài và cao bằng với hình ảnh được rê chuột. Tính năng này các bạn thường thấy ở các Website bán hàng như Ebay.

Và trong ví dụ này, cách sử dụng cũng giống ở ví dụ trước ở tính năng “Overlay” chỉ khác duy nhất chính là tên class mà các bạn sử dụng là <div class=”easyzoom easyzoom–adjacent ten-class-tu-dat”>  và trong đó class easyzoom—adjacent  đại diện cho tính năng “Ajacent”.

Tính năng Thumbnail – Overlay (Hình thu nhỏ – Che Phủ)

Tính năng này là sự kết hợp giữa thư viện hình ảnh (Gallery) nhờ vào các hình ảnh thu nhỏ kết hợp với tính năng “Overlay” để phóng to hình ảnh được chọn và rê chuột vào.

Các bạn cần chuẩn bị cấu trúc file thumbnail-overlay.html  như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>EasyZoom - Thienanblog.com</title>
	<link rel="stylesheet" type="text/css" href="css/easyzoom.css">
	<script type="text/javascript" src="js/jquery-1.11.3.min.js"></script>
	<script type="text/javascript" src="js/easyzoom.js"></script>
	<style type="text/css">
	.wrap {
		width: 940px;
		margin: 0px auto;
		padding: 5px 15px;
	}

	ul {
		list-style: none;
	}

	ul li {
		float:left;
		margin: 5px;
	}
	</style>
</head>
<body>
	<div class="wrap">
		<div class="easyzoom easyzoom--overlay easyzoom--with-thumbnails ten-class-tu-dat">
			<a href="img/3_zoom_1.jpg">
				<!-- WIDTH | HEIGHT có thể ấn định bằng CSS thay vì HTML -->
				<img src="img/3_standard_1.jpg" alt="" width="640" height="360">
			</a>
		</div>
		<ul class="thumbnails">
			<li>
				<a href="img/3_zoom_1.jpg" data-standard="img/3_standard_1.jpg">
					<img src="img/3_thumbnail_1.jpg" alt="">
				</a>
			</li>
			<li>
				<a href="img/3_zoom_2.jpg" data-standard="img/3_standard_2.jpg">
					<img src="img/3_thumbnail_2.jpg" alt="">
				</a>
			</li>
			<li>
				<a href="img/3_zoom_3.jpg" data-standard="img/3_standard_3.jpg">
					<img src="img/3_thumbnail_3.jpg" alt="">
				</a>
			</li>
			<li>
				<a href="img/3_zoom_4.jpg" data-standard="img/3_standard_4.jpg">
					<img src="img/3_thumbnail_4.jpg" alt="">
				</a>
			</li>
		</ul>
	</div>
	<script type="text/javascript">
		// Instantiate EasyZoom instances
		var $easyzoom = $('.ten-class-tu-dat').easyZoom();
		var api = $easyzoom.data('easyZoom');

		$('ul').on('click', 'a', function(event) {
			event.preventDefault();
			api.swap($(this).data('standard'), $(this).attr('href'));
		});
	</script>
</body>
</html>

Khi chạy ví dụ trên chúng ta sẽ được như sau:

5.Thumbnail - Overlay

 

Rất đẹp mắt đúng không nào, chỉ khác ở các ví dụ một tí đó chính là chúng ta cần đến thẻ <ul> để hiển thị các hình ảnh nhỏ bên dưới để người dùng có thể chọn nó. Và đây chính là cấu trúc chung khi các bạn sử dụng Plugin này:

<ul class="thumbnails">
	<li>
		<a href="img/3_zoom_1.jpg" data-standard="img/3_standard_1.jpg">
			<img src="img/3_thumbnail_1.jpg" alt="">
		</a>
	</li>
	<li>
		<a href="img/3_zoom_2.jpg" data-standard="img/3_standard_2.jpg">
			<img src="img/3_thumbnail_2.jpg" alt="">
		</a>
	</li>
	<li>
		<a href="img/3_zoom_3.jpg" data-standard="img/3_standard_3.jpg">
			<img src="img/3_thumbnail_3.jpg" alt="">
		</a>
	</li>
	<li>
		<a href="img/3_zoom_4.jpg" data-standard="img/3_standard_4.jpg">
			<img src="img/3_thumbnail_4.jpg" alt="">
		</a>
	</li>
</ul>

Trong đó, <a href=”img/3_zoom_1.jpg” data-standard=”img/3_standard_1.jpg”>  có thuộc tính href chính là đường dẫn đến hình ảnh phóng lớndata-standard  là hình ảnh thu nhỏ ở phía dưới hình chính của chúng ta.

Và các bạn lại cần phải chú ý một điểm vẫn giống các ví dụ trước đó chính là thẻ <div class=”easyzoom easyzoom–overlay easyzoom–with-thumbnails ten-class-tu-dat”>  đã có thêm 1 class mới chính là easyzoom–with-thumbnails  để giúp nó hiểu đây chính là thư viện hình ảnh.

Tuy nhiên, khác biệt lớn nhất chính là đoạn mã Javascript:

<script type="text/javascript">
	// Instantiate EasyZoom instances
	var $easyzoom = $('.ten-class-tu-dat').easyZoom();
	var api = $easyzoom.data('easyZoom');

	$('ul').on('click', 'a', function(event) {
		event.preventDefault();
		api.swap($(this).data('standard'), $(this).attr('href'));
	});
</script>

Trong đó, $easyzoom.data(‘easyZoom’) sẽ trả về cho chúng ta một Object chứa các phương thức để chúng ta có thể cấu hình Plugin này. Và mỗi khi sự kiện click lên tấm hình ở thư viện thì nó sẽ bị đoạn mã ngăn chặn không cho refresh lại trang thông qua phương thức event.preventDefault() . Và ở cách dùng api.swap()  thì các bạn có thể hiểu đơn giản tiếng anh nó đã có nghĩa là “hoán đổi”, và hoán đổi cái gì? Chính là đường dẫn hình ảnh trong data-standard  mà chúng ta truyền vào href trong thẻ <a>  của chúng ta. Giúp cho Plugin hiểu là hình ảnh mới đã được cấu hình các hình ảnh nhỏ và hình ảnh phóng to.

Và có một điều thú vị là khi các bạn thay đổi easyzoom easyzoom—overlay  trong thẻ <div class=”easyzoom easyzoom–overlay easyzoom–with-thumbnails ten-class-tu-dat”>  các bạn sẽ lại có được luôn cả tính năng “Ajacent” mà chúng ta đã được thử qua trước đó.

Tóm tắt các tính năng cơ bản trong jQuery EasyZoom

Tên tính năng Class được sử dụng
Overlay easyzoom easyzoom–overlay
Ajacent easyzoom easyzoom–ajacent
Thumbnail – Overlay easyzoom easyzoom–overlay easyzoom–with-thumbnails
Thumbnail – Ajacent easyzoom easyzoom–ajacent  easyzoom–with-thumbnails

Qua bài viết này, các bạn đã có thể sử dụng được các tính năng cơ bản nhất của Plugin rồi, ngoài ra các bạn cũng nên tham khảo thêm trong tài liệu của tác giả để có thể hiểu về Plugin này hơn nếu như có nhu cầu chuyên sâu và cao cấp hơn.

Các bạn có thể tải toàn bộ Source tại đây

Xin cám ơn các độc giả đã đón xem bài viết này.

Hướng dẫn jQuery Ajax toàn tập

Giới thiệu

Hướng dẫn jQuery Ajax

Ajax không phải là ngôn ngữ mà là kĩ thuật trong Javascript, giúp chúng ta tạo ra các ứng dụng Web Không đồng bộ (Asynchronous). Nói dễ hiểu hơn là kĩ thuật “load dữ liệu không cần load lại trang” hay “load một phần website”, giúp website linh hoạt, nhanh chóng và thân thiện với người dùng hơn.

Hướng dẫn sử dụng

Để sử dụng kĩ thuật Ajax trong jQuery, trước hết các bạn cần chuẩn bị cho tôi đó chính là thư viện jQuery được tải về từ http://jquery.com/download . Trong đó, jQuery sẽ có 2 phiên bản là 1.x và 2.x thì chúng ta có thể chọn lựa bản nào cũng được. Hai bản chỉ khác nhau ở việc hỗ trợ các trình duyệt cũ và mới mà thôi, cụ thể ở đây chính là IE 8 trở về trước. Ở đây tôi sẽ dùng bản jQuery 1.x để dễ dàng cho việc các bạn độc giả thử nghiệm hơn.

Lưu ý: Các bạn cũng cần phải có ít nhất 1 Web Server như (XAMPP, WampServer,…) hoặc có thể sử dụng mini Webserver Mongoose cho HTML tại đây mongoose-free-5.3.5 và có thể đọc hướng dẫn sau để sử dụng https://cesanta.com/docs/FileSharing.shtml

Sau đây, tôi sẽ giới thiệu cho các bạn các phương thức Ajax thông dụng mà jQuery đã viết sẵn:

Phương thức “load()”

Dùng trong các trường hợp cần load dữ liệu đơn giản và không cần thiết phải can thiệp vào dữ liệu trả về.

Chuẩn bị HTML như sau trong cặp thẻ “<body> ”:

	<div>
		<a href="#" id="load-du-lieu">Load dữ liệu</a>
	</div>
	<div id="noidung"></div>

Và trong cặp thẻ “<script> ”:

	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			console.log($('#noidung').load('vidu1.html'));
		});
	});

Và như các bạn thấy trong đoạn code ở cặp thẻ “<script> ”, các bạn thấy được tôi có sử dụng một file HTML khác là “vidu1.html” để chúng ta sẽ load dữ liệu từ nó vào. Các bạn sẽ được cấu trúc đầy đủ và lưu tên file là “index.html” (Tên “index” các bạn có thể tự đặt) như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Hướng dẫn jQuery Ajax - Thienanblog.com</title>
	<script type="text/javascript" src="jquery-1.11.3.min.js"></script>
</head>
<body>
	<div>
		<a href="#" id="load-du-lieu">Load dữ liệu</a>
	</div>
	<div id="noidung">
		
	</div>
	<script type="text/javascript">
	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$('#noidung').load('vidu1.html');
		});
	});
	</script>
</body>
</html>

Cấu trúc file “vidu1.html” sẽ như sau:

<p>Đây là vidu1.html</p>
<p id="chuoi-can-lay">Chuỗi cần lấy tiếp theo</p>

Chúng ta sẽ có cấu trúc thư mục tổng thể như sau trong ví dụ này:

Cau truc thu muc

Và trong cặp thẻ “<script>” tôi sẽ nhắc lại một số cú pháp tôi đã xài để bạn nào quên hoặc chưa biết thì có thể tìm hiểu lại:

  1. $(document).ready(function(){…})  : tương tự với sự kiện “onload ”, có nghĩa là code của bạn chỉ được thực thi khi trang được load hoàn tất.
  2. Sự kiện “click ” đối số mặc định “e” được sử dụng phương thức “preventDefault() ” giúp chặn lại việc load lại trang từ trình duyệt.
  3. $(‘#id-can-lay’)  : trỏ tới thẻ HTML mà các bạn cần lấy có “id ” là#id-can-lay ”. Tương tự với việc các bạn sử dụng cho “class ”.
  4. load()  : có đối số là đường dẫn đến file các bạn cần lấy.

Và bây giờ, chúng ta hãy thử chạy Ví dụ trên xem thế nào nhé:

Bước 1: Load file “index.html” mà chúng ta đã xây dựng bên trên:

Buoc 1

Bước 2: Nhấn vào nút “Load dữ liệu” và chạy thử:

Buoc 2

Như vậy, sau 2 bước trên chúng ta đã load thành công dữ liệu từ “vidu1.html” rồi đấy. Và một câu hỏi đặt ra, đó chính là có cách nào mà chúng ta có thể chỉ lấy chuỗi mà chúng ta cần sau khi load dữ liệu vào hay không? Các bạn hãy xem lại cấu trúc “vidu1.html” nhé:

<p>Đây là vidu1.html</p>
<p id="chuoi-can-lay">Chuỗi cần lấy tiếp theo</p>

Các bạn thấy gì trong ví dụ này? Có phải chúng ta có 2 thẻ “<p> ” ngăn cách mỗi chuỗi đúng không nào. Và nếu trong trường hợp này, tôi muốn lấy ra thẻ “<p> ” có “id ” là “chuoi-can-lay ”. Thì tôi sẽ chỉnh sửa lại một tí đoạn code trong “<script> ” của chúng ta như sau:

	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$('#noidung').load('vidu1.html #chuoi-can-lay');
			
		});
	});

Và sau đó các bạn chạy và load lại dữ liệu thì chúng ta sẽ được như sau:

Lay chuoi can lay

Thật bất ngờ đúng không nào? Như vậy, để có thể bóc tách dữ liệu từ file mà chúng ta load lên, và ở đây chính là file “vidu1.html” thì chúng ta cần đặt “id ” cho thẻ bao lấy dữ liệu mà chúng ta cần tách lọc. Sau đó thêm vào ĐẰNG SAU đường dẫn như cách chúng ta dùng jQuery để trỏ đến một thẻ trong HTML nào đó vậy.

Vậy là chúng ta đã hoàn tất tìm hiểu xong được phương thức “load() ” trong jQuery Ajax rồi đấy.

Phương thức “get()” và “post()”

Ở 2 phương thức này thì trong đó phương thức “get() ” giống “load() ” về mặt kĩ thuật đó chính là dùng “method” là “GET” trong “<form> ”. Tương tự “post() ” sẽ tượng trưng cho “method” là “POST” của “<form> ”. Cả 2 phương thức này đều cách viết tắt của phương thức “ajax()” mà chúng ta sẽ làm quen ở phần tới.

Phương thức “get()”

Vì có sự tương đồng giữa “get() và “load() ” nên chắc hẳn cách dùng cũng không có phần khác lạ so với các ví dụ ở trên, nhưng cần lưu ý một số cú pháp để tránh nhầm lẫn với “load() ”:

	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.get('vidu1.html', function(ketqua) {
				$('#noidung').html(ketqua);
				$('#noidung').html($('#chuoi-can-lay').html());
			});
			
		});
	});

Kết quả khi chạy ví dụ trên:

4. Lay chuoi can lay cua get

  1. Đoạn code này cho bạn thấy rằng để sử dụng được phương thức “get() ”, các bạn cần dùng đến biến “$ ” (hay “jQuery ”) sau đó sử dụng thẳng phương thức “get() ” chứ không giống như “$(‘#id-can-lay’).load() ” như ví dụ trước ta đã xem ở phương thức “load() ”.
  2. Đối số truyền vào không thể tách lọc được dữ liệu trả về thẳng trong đường dẫn như phương thức “load() ”.
  3. Kết quả trả về sẽ thông qua đối số thứ 2 của phương thức “get() ” là một Anonymous Function có đối số mặc định trả về là “ketqua ” như chúng ta đã thấy. Các bạn có thể dùng “console.log(ketqua) ” và bật F12 của trình duyệt trên Chrome/Mozilla/Opera để xem kết quả trả về khi click vào.
  4. Và để tách lọc dữ liệu từ “ketqua ” chúng ta cần phải ghi nó vào “DOM” hay một nơi nào đó trong cặp thẻ “<body> ” của chúng ta. Sau đó chúng ta dùng tiếp “$(‘#id-can-lay’).html() ” để tách lọc dữ liệu như ở phương thức “load() ” mà chúng ta đã xài trước đó. Các bạn có thể bỏ đi dòng “$(‘#noidung’).html($(‘#chuoi-can-lay’).html()) ” để thấy sự tương đồng giữa “load() ” và “get() ” chỉ khác nhau về cách dùng.

Ngoài ra “get() ” còn hỗ trợ bạn truyền dữ liệu sang file lấy dữ liệu, tuy nhiên cái này thuộc về sự hiểu biết của các bạn trong kĩ thuật lập trình Web nên tôi không nói nhiều ở đây, không thì sẽ loãng bài viết.

Phương Thức “post()”

Trong phương thức này, cần có ít nhất một ngôn ngữ động ở phía hệ thống để nhận lấy dữ liệu từ phương thức “post() ” truyền qua. Vì thế, ở đây tôi sẽ dùng PHP để demo cho các bạn.

Cách dùng của phương thức “post() ” sẽ giống với “get() ” nhưng khác về kĩ thuật truyền dữ liệu mà thôi.

$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.post('vidu2.php', {
				emNguoiYeu: "Em Yêu Anh",
				anhNguoiYeu: "Anh không phải người dễ dãi nhé"
			},function(ketqua) {
				$('#noidung').html(ketqua);
			});
			
		});
	});

Nội dung của file “vidu2.php“:

<?php 
echo '<pre>' .print_r($_POST,true). '</pre>';

Kết quả ví dụ trên sau khi thực thi:

Nhan du lieu tra ve tu post

Ở ví dụ phương thức “post() ” này, ở đối số thứ 2 thay vì là Anonymous Function như ở ví dụ “get() ” mà chúng ta đã xem trước đó, thì đây là “một đối tượng” (Object) chứa những dữ liệu mà chúng ta cần truyền qua đường dẫn “vidu2.php” để nhận và trả về dữ liệu. Kết quả trả về sẽ được đưa vào đối số thứ 3 cho chúng ta.

Như vậy chúng ta đã hoàn tất tìm hiểu xong “get() ” và “post() ” rồi. Quá dễ đúng không nào? Đến với phần tiếp theo chúng ta sẽ tìm hiểu đến phương thức “ajax() ” mạnh nhất trong thư viện jQuery. Nên đòi hỏi cách dùng nó cũng tương đối khó khăn hơn nhưng vẫn dễ rất nhiều hơn so Javascript thuần.

Phương thức “ajax()”

Cách sử dụng phương thức nãy vẫn giống cách gọi của các phương thức “get() ” và “post() ” nhưng chúng ta thay vì truyền đường dẫn trực tiếp vào phương thức thì phương thức “ajax() ” lại chấp nhận đối số đầu tiên chính là cấu hình cho kĩ thuật Ajax của chúng ta:

	$(document).ready(function() {
		$('#load-du-lieu').click(function(e) {
			e.preventDefault();
			$.ajax({
				url: 'vidu2.php',
				type: 'POST',
				dataType: 'html',
				data: {
					emNguoiYeu: "Em Yêu Anh",
					anhNguoiYeu: "Anh không phải người dễ dãi nhé"
				}
			}).done(function(ketqua) {
				$('#noidung').html(ketqua);
			});
			
		});
	});

Các bạn thấy chứ? Rõ ràng đối số đầu tiên chúng ta truyền vào cho phương thức “ajax() ” chính là một đối tượng (Object) gồm các thuộc tính cấu hình để kĩ thuật AJAX của chúng ta có thể thực thi. Trong đó:

  1. url : chuỗi chứa đường dẫn tới file cần lấy và trả về dữ liệu
  2. type : phương thức gửi đi tương tự như của “<form> ”, mặc định là “GET” nếu như các bạn không truyền vào.
  3. dataType : xác định dữ liệu trả về thuộc dạng nào? Nếu các bạn không truyền thì jQuery tự động nhận biết kiểu dữ liệu (script, html, json…). Tuy nhiên, tôi khuyến cáo các bạn nên truyền vào đầy đủ để nhận dữ liệu chính xác nhất. Và thông dụng nhất chính là “html”.
  4. data : truyền dữ liệu sang đường dẫn chỉ định để thực hiện xử lý và trả về dữ liệu. Tương tự như cách truyền dữ liệu của phương thức “post() ”.
  5. done() ” : ở loạt các bài viết hướng dẫn các bài viết về kĩ thuật Ajax với phương thức “ajax() ” trước đây trên Internet. Thay vì dùng “done()” chúng ta sẽ dùng thuộc tính “success” trong đối tượng truyền vào “ajax() ” nhưng từ các phiên bản mới hơn của jQuery. Họ khuyến cáo chúng ta nên sử dụng các phương thức như “done() , fail() , always() ” (Tương ứng: Hoàn thành, thất bại và luôn luôn thực hiện). Nên tùy vào nhu cầu mà bạn xài phương thức tương ứng. Và nên nhớ là đi kèm với phương thức “ajax() ” hoặc lưu vào một tên biến rồi dùng sau để nhận kết quả trả về.

Kết quả thực thi ví dụ trên:

Nhan du lieu tra ve tu post

Hoàn toàn không khác ví dụ trước ở phương thức “post() ” đúng không nào? Và không chỉ có nhiêu đó, phương thức “ajax() ” còn hỗ trợ hàng tá các chức năng khác nhưng tôi không thể giới thiệu hết cho các bạn trong nội dung bài viết này được. Các bạn có thể xem thêm về tài liệu hướng dẫn của phương thức trên tại: http://api.jquery.com/category/ajax

Các bạn có thể tải toàn bộ Sources Code của các ví dụ trên tại đây.

Trân trọng cám ơn độc giả đã xem qua bài viết này, mong được sự ủng hộ của các bạn ở các bài viết tới.

Hướng dẫn sử dụng jQuery Lazy Load

Chắc hẳn trong quá trình xây dựng Website, ít nhiều các bạn cũng từng nghĩ làm cách nào để có thể giảm tải bớt băng thông cho việc load hình ảnh trên Website, nhất là những trang người dùng chỉ load vào xem nội dung rồi vội vàng ra đi. Như thế thì chúng ta vô tình lại tốn băng thông nhưng lại không giúp ích gì được cho chúng ta. Vậy làm sao để hạn chế điều này? Có cách nào có thể giúp người dùng cuộn trang tới đâu, hình ảnh load tới đó không? Câu trả lời là có và tôi sẽ giới thiệu với các bạn đến với jQuery Lazy Load Plugin để có thể thực hiện được việc này.

Giới thiệu và cài đặt

Tác giả: Mika Tuupola

Website: http://www.appelsiini.net/projects/lazyload

jQuery Lazy Load được xây dựng giúp người dùng cuộn tới đâu, load hình tới đó giúp cho việc giảm tải băng thông cho Website.

Để có thể cài đặt jQuery Lazy Load các bạn cần thực hiện các bước sau:

  1. Truy cập vào https://github.com/tuupola/jquery_lazyload và nhấn vào nút “Download ZIP”.
  2. Giải nén file vừa tải về, chúng ta sẽ được cấu trúc thư mục như sau:

Cấu trúc thư mục

  1. Các bạn hãy vào folder “jquery_lazyload-master” và sau đó copy file “jquery.lazyload.min.js”.
  2. Sau đó, các bạn hãy bỏ vào folder chứa website mà chúng ta xây dựng.
  3. Tiến hành thêm thư viện vào trong website của chúng ta, nhưng các bạn cũng cần phải tải thư viện jQuery tại http://jquery.com về trước nhé:

Chèn jQuery Lazy Load

  1. Cài đặt hoàn tất

Sử dụng

Đầu tiên, để sử dụng thư viện này, các bạn hãy chuẩn bị cho tôi 1,2 hoặc nhiều tấm hình trở lên. Cụ thể ở đây tôi sẽ có tấm hình “demo.gif”:

Tiếp theo, chúng ta sẽ load tấm hình đó vào HTML và hãy nhân bản lên thành nhiều tấm để tiện cho việc chúng ta tập cách sử dụng:

	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />

Ở đoạn code trên, nếu các bạn để ý thì thay vì chúng ta dùng thẻ “<img>” và có thuộc tính “src” để chỉ rõ đường dẫn của tấm hình thì nay nó đã được thay thế bằng “data-original” và cách gán đường dẫn giống với thuộc tínhsrc”:

4

Các bạn cũng nên định nghĩa một tên class để tiện cho việc tìm đến những tấm ảnh này thông qua jQuery. Sau đó, các bạn hãy dùng thẻ “<script>” để tiến hành sử dụng thư viện jQuery Lazy Load:

	<script type="text/javascript">
		$(function() {
		    $("img.ten-lop-ban-tu-dat").lazyload({
		    	effect : "fadeIn"
		    });
		});
	</script>

Sau khi thực hiện đoạn code này, chúng ta đã thành công trong việc sử dụng thư viện rồi đấy. Thông qua việc sử dụng phương thức “lazyload()” ở thẻ “<img>” mà bạn chỉ định. Và đối số trong phương thức “lazyload()” chính là một đối tượng chứa các tính năng mà bạn có thể tùy biến theo hướng dẫn của tác giả Plugin jQuery Lazy Load.

Và đoạn code đầy đủ của nó sẽ như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Test</title>	
	<style type="text/css">
	img {
		float:left;
		width: 500px;
		height: 500px;
	}
	</style>
	<script type="text/javascript" src="jquery-1.11.3.min.js"></script>	
	<script type="text/javascript" src="jquery.lazyload.min.js"></script>
</head>
<body>
	<img src="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />
	<img data-original="demo.gif" class="ten-lop-ban-tu-dat" />	
	<script type="text/javascript">
		$(function() {
		    $("img.ten-lop-ban-tu-dat").lazyload({
		    	effect : "fadeIn"
		    });
		});
	</script>
</body>
</html>

Một số tính năng có thể sử dụng trong jQuery Lazy Load

threshold Load trước số pixel chỉ định
event Thực hiện load hình ảnh khi sự kiện chỉ định được gọi
effect Hiệu ứng load hình ảnh
skip_invisible Bỏ qua các hình ảnh không được hiển thị trong viewport
failure_limit Chạy vòng lặp kiểm tra hình ảnh load bị lỗi với số lần quy định

Demo cách sử dụng gộp các tính năng:

	<script type="text/javascript">
		$(function() {
		    $("img.ten-lop-ban-tu-dat").lazyload({
		    	effect : "fadeIn",
		    	threshold: 100,
		    	event : "mouseover"
		    });
		});
	</script>

Trên đây chỉ thống kê ngắn gọn các tính năng của jQuery Lazy Load, chắc chắn vẫn chưa đầy đủ ở Website của tác giả, mong bạn đọc thông cảm. Bạn có thể tải file demo-jquery-lazy-load tại đây.

 

Hướng dẫn sử dụng jQuery Validation

I. Giới thiệu và Cài đặt

Tác giả: Jörn Zaefferer

Website: http://jqueryvalidation.org

logo

jQuery Validation được xây dựng giúp các lập trình viên có thể xác thực được những thông tin người dùng nhập vào Form một cách nhanh chóng và dễ dàng.

Để có thể cài đặt jQuery Validate các bạn cần thực hiện các bước sau:

  1. Truy cập vào https://github.com/jzaefferer/jquery-validation và nhấn vào nút “Download ZIP”.
  2. Giải nén file vừa tải về, chúng ta sẽ được cấu trúc thư mục như sau:

1. Cau truc folder

  1. Các bạn hãy vào folder “dist” và sau đó copy file “jquery.validate.min.js”.
  2. Sau đó, các bạn hãy bỏ vào folder chứa website mà chúng ta xây dựng.
  3. Tiến hành thêm thư viện vào trong website của chúng ta, nhưng các bạn cũng cần phải tải thư viện jQuery tại http://jquery.com về trước nhé:

Thêm thư viện vào HTML

  1. (Tùy chọn) Nếu như các bạn không thích tải về thư viện jQuery Validation hoặc kể cả jQuery, các bạn có thể dùng các đường link CDN sau đây:
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.min.js"></script>
  1. Cài đặt hoàn tất.

II. Sử dụng

Để sử dụng jQuery Validation các bạn cần phải biết qua phương thức “$(‘#id_cua_form’).validate()” (Nếu dùng class thì các bạn hãy tự thay thế). Chúng ta sẽ có cấu trúc HTML đơn giản như sau:

<form method="get" accept-charset="utf-8" style="width:600px;margin: 0px auto;" id="formDemo">
		<fieldset>
			<legend>Demo jQuery Validation - ThienAnBlog.com</legend>
			<div>
				<label>Họ</label>
				<input name="ho" type="text" placeholder="Vui lòng nhập họ" required>
			</div>
			<div>
				<label>Tên</label>
				<input name="ten" type="text" placeholder="Vui lòng nhập tên" required>
			</div>
			<div>
				<label>Địa chỉ</label>
				<input name="diachi" type="text" placeholder="Vui lòng nhập địa chỉ" required>
			</div>
			<button type="submit">Gửi</button>
		</fieldset>
	</form>

Và cấu trúc thẻ <script>:

$(document).ready(function() {

		//Khi bàn phím được nhấn và thả ra thì sẽ chạy phương thức này
		$("#formDemo").validate({
			rules: {
				ho: "required",
				ten: "required",
				diachi: {
					required: true,
					minlength: 2
				}
			},
			messages: {
				ho: "Vui lòng nhập họ",
				ten: "Vui lòng nhập tên",
				diachi: {
					required: "Vui lòng nhập địa chỉ",
					minlength: "Địa chỉ ngắn vậy, chém gió ah?"
				}
			}
		});
	});

Khi chạy nó, các bạn sẽ thấy thư viện của chúng ta sẽ thực hiện “Xác thực” (Validate) khi chúng ta nhấn vào nút “Submit” thì ở đây nó chính là nút “Gửi”. Hoặc các bạn có thể gõ vài dòng chữ vào và nhận ra sự khác biệt khi xóa đi. Đó chính là những đoạn thông báo nhỏ như sau:

Form Validate - Simple

Rất là đẹp mắt phải không các bạn? Nhưng thật ra để được vậy thì các bạn phải có CSS vào nữa đấy chứ thật ra Form này khi không có CSS thì các bạn sẽ thấy nó chạy lung tung.

Tôi sẽ giải thích một tí về đoạn script mà chúng ta viết:

  1. Phương thức “validate()” chấp nhận 1 đối số là một đối tượng2 thuộc tính chính là “rules” và “messages”.
  2. Trong đó, “rules” đại diện cho điều kiện xác thực như “required”(Không bỏ trống), “minlength”(Độ dài tối thiểu)…và “messages” đại diện cho các thông báo lỗi mà chúng ta đã thấy ở ví dụ trên.
  3. Và thuộc tính “rules” của chúng ta sẽ lại bao gồm các phần tử con cũng là một đối tượng với các thuộc tính bên trong nó chính là thuộc tính “name” bên trong các thẻ “input” của chúng ta. Các bạn có thể xem qua hình ảnh sau:

So sanh HTML va Code

  1. Rất đơn giản phải không nào? “messages” cũng sẽ tương tựrules” và nếu bạn tinh ý sẽ nhận ra là kể cả điều kiện bên trong nó như “required”, “minlength” cũng sẽ tương đồng với bên “messages”. Hai cái chỉ khác nhau về công việc mà thôi.
  2. Như vậy, chúng ta đã hoàn tất được công việc “Validate” rồi đấy.

Chúng ta sẽ có cấu trúc hoàn chỉnh như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>jQuery Validation - ThienAnBlog.com</title>	
	<style type="text/css">
	label {
		display: inline-block;
		width: 150px;
	}
	input[type="text"], input[type="password"] {
		display: inline-block;
		width: 200px;
	}
	label.error {
		display: inline-block;
		color:red;
		width: 200px;
	}
	</style>
	<!-- Load Thư viện jQuery vào trước khi load jQuery Validate-->
	<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
	<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.min.js"></script>
</head>
<body>
	<form method="get" accept-charset="utf-8" style="width:600px;margin: 0px auto;" id="formDemo">
		<fieldset>
			<legend>Demo jQuery Validate - ThienAnBlog.com</legend>
			<div>
				<label>Họ</label>
				<input name="ho" type="text" placeholder="Vui lòng nhập họ" required>
			</div>
			<div>
				<label>Tên</label>
				<input name="ten" type="text" placeholder="Vui lòng nhập tên" required>
			</div>
			<div>
				<label>Địa chỉ</label>
				<input name="diachi" type="text" placeholder="Vui lòng nhập địa chỉ" required>
			</div>
			<button type="submit">Gửi</button>
		</fieldset>
	</form>
	<script type="text/javascript">

	$(document).ready(function() {

		//Khi bàn phím được nhấn và thả ra thì sẽ chạy phương thức này
		$("#formDemo").validate({
			rules: {
				ho: "required",
				ten: "required",
				diachi: {
					required: true,
					minlength: 2
				}
			},
			messages: {
				ho: "Vui lòng nhập họ",
				ten: "Vui lòng nhập tên",
				diachi: {
					required: "Vui lòng nhập địa chỉ",
					minlength: "Địa chỉ ngắn vậy, chém gió ah?"
				}
			}
		});
	});
	</script>
</body>
</html>

Ngoài ra, tôi sẽ gửi thêm cho các bạn một file demo khác để giúp các bạn hình dung rõ ràng hơn như sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>jQuery Validate - ThienAnBlog.com</title>	
	<style type="text/css">
	label {
		display: inline-block;
		width: 150px;
	}
	input[type="text"], input[type="password"] {
		display: inline-block;
		width: 200px;
	}
	label.error {
		display: inline-block;
		color:red;
		width: 200px;
	}
	</style>
	<!-- Load Thư viện jQuery vào trước khi load jQuery Validate-->
	<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
	<script type="text/javascript" src="http://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.1/jquery.validate.min.js"></script>
</head>
<body>
	<form method="get" accept-charset="utf-8" style="width:600px;margin: 0px auto;" id="formDemo">
		<fieldset>
			<legend>Demo jQuery Validate - ThienAnBlog.com</legend>
			<div>
				<label>Họ</label>
				<input name="ho" type="text" placeholder="Vui lòng nhập họ" required>
			</div>
			<div>
				<label>Tên</label>
				<input name="ten" type="text" placeholder="Vui lòng nhập tên" required>
			</div>
			<div>
				<label>Địa chỉ</label>
				<input name="diachi" type="text" placeholder="Vui lòng nhập địa chỉ" required>
			</div>
			<div>
				<label>Số điện thoại</label>
				<input name="sodienthoai" type="text" placeholder="Vui lòng nhập số điện thoại" required>
			</div>
			<div>
				<label>Email</label>
				<input name="email" type="text" placeholder="Vui lòng nhập Email" required>
			</div>
			<div>
				<label>Mật khẩu</label>
				<input id="password" name="password" type="password" placeholder="Vui lòng nhập Password" required>
			</div>
			<div>
				<label>Nhập lại mật khẩu</label>
				<input name="confirm_password" type="password" placeholder="Vui lòng nhập lại Password" required>
			</div>
			<div>
				<label>Điều khoản</label>
				<input name="dieukhoan" type="checkbox">
			</div>
			<div>
				<label>Thông tin thêm</label>
				<input name="thongtinthem" type="text" placeholder="Tùy chọn...">
			</div>
			<button type="submit">Gửi</button>
		</fieldset>
	</form>
	<script type="text/javascript">

	$(document).ready(function() {

		//Khi bàn phím được nhấn và thả ra thì sẽ chạy phương thức này
		$("#formDemo").validate({
					rules: {
						ho: "required",
						ten: "required",
						diachi: {
							required: true,
							minlength: 2
						},
						sodienthoai: {
							required: true,
							minlength: 5
						},
						password: {
							required: true,
							minlength: 5
						},
						confirm_password: {
							required: true,
							minlength: 5,
							equalTo: "#password"
						},
						email: {
							required: true,
							email: true
						},
						dieukhoan: "required"
					},
					messages: {
						ho: "Vui lòng nhập họ",
						ten: "Vui lòng nhập tên",
						diachi: {
							required: "Vui lòng nhập địa chỉ",
							minlength: "Địa chỉ ngắn vậy, chém gió ah?"
						},
						sodienthoai: {
							required: "Vui lòng nhập số điện thoại",
							minlength: "Số máy quý khách vừa nhập là số không có thực"
						},
						password: {
							required: 'Vui lòng nhập mật khẩu',
							minlength: 'Vui lòng nhập ít nhất 5 kí tự'
						},
						confirm_password: {
							required: 'Vui lòng nhập mật khẩu',
							minlength: 'Vui lòng nhập ít nhất 5 kí tự',
							equalTo: 'Mật khẩu không trùng'
						},
						email: {
							required: "Please provide a password",
							minlength: "Your password must be at least 5 characters long",
							equalTo: "Please enter the same password as above"
						},
						email: "Vui lòng nhập Email",
						agree: "Vui lòng đồng ý các điều khoản"
					}
				});
	});
	</script>
</body>
</html>

Các bạn có thể tải các Demo trên tại đây.

Một số điều kiện bên trong jQuery Validation

required Không được bỏ trống
remote Gửi yêu cầu về Web Server để xác thực
minlength Độ dài tối thiểu
maxlength Độ dài tối đa
rangelength Độ dài tối thiểu từ x tới y
min Số tối thiểu
max Số tối đa
range Số tối thiểu từ x tới y
email Xác thực định dạng Email
url Xác thực định dạng URL
date Xác thực định dạng ngày tháng
dateISO Xác thực định dạng ngày tháng theo chuẩn ISO
number Phải là số, bao gồm số thập phân
digits Chỉ chấp nhận số nguyên dương
creditcard Xác thực số thẻ tín dụng
equalTo Phải trùng với phần tử nào đó

Ngoài ra, các bạn có thể tham khảo tại đây http://jqueryvalidation.org/documentation để có thể tìm hiểu thêm về thư viện này.

Bài 8: Tìm hiểu sự kiện trong Javascript

Ở bài học trước chúng ta đã tìm hiểu về Javascript và HTML DOM, các bạn cũng đã biết qua về cách có thể can thiệp vào dữ liệu cũng như thực hiện thay đổi giá trị và lấy giá trị. Trong bài này, các bạn cũng sẽ được tìm hiểu đến phần quan trọng cũng như là phần thú vị nhất trong Javascript. Đó chính là sự kiện trong Javascript (JS).

Tìm hiểu sự kiện trong Javascript

Sự kiện trong Javascript (JS) có thể hiểu đơn giản là “điều gì đó sẽ xảy ra và khi đó chúng ta sẽ thực hiện hành động nào đó tương ứng với điều sẽ xảy ra”, hay có một ví dụ thực tế hơn “Khi có một thiên thạch rơi (sự kiện “rơi”) gần đến chỗ bạn, thì hành động của bạn lúc đó sẽ là…chạy và chạy” có đúng không nào.

Vì thế, Javascript xử lý các sự kiện cũng như cách mà chúng ta hiểu, mà ở trong những phần trước, nếu các bạn để ý là khi chúng ta “click” vào một “button” hay một “đối tượng” (element) nào đó trong HTML, thì chúng ta thường thấy có sự kiện “onclick” hay lúc “rê chuột” (hover) thì có sự kiện “onmouseover” và lúc đó chúng ta sẽ thực hiện hàm nào đó hay các câu lệnh mà chúng ta viết trực tiếp ở HTML.

Các bạn có thể tìm hiểu về danh sách các sự kiện trong HTML tại đây http://www.w3schools.com/tags/ref_eventattributes.asp.

Ví dụ

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
	<style type="text/css">
		p.hover-me {
			display: inline-block;
			width: 200px;
			height: 50px;
			background: #d5d5d5;
		}
	</style>	
</head>
<body onload="loadMe();">
	<a href="#" title="Click vào tôi" onclick="clickMe();">Click vào tôi</a><br/>
	<p class="hover-me" onmouseover="hoverMe();">Hãy rê chuột vào tôi</p><br/>
	<select onchange="changeMe();">
		<option value="">Hãy thay đổi tôi đi</option>
		<option value="">Tôi thay đổi</option>
	</select>
	<script type="text/javascript" charset="utf-8">
		function clickMe() {
			alert('Đã nhấn');
		}

		function changeMe() {
			alert('Đã thay đổi');
		}

		function hoverMe() {
			alert('Đã rê chuột vào');
		}

		function loadMe() {
			alert('Đã Load thành công toàn bộ');
		}
	</script>		
</body>
</html>
  • Sau khi các bạn chạy ví dụ này, các bạn sẽ thấy rõ ràng khi các bạn nhấp vào đường link “Click vào tôi” thì sự kiện “onclick” gọi đến hàm “clickMe();” và thực thi hàm đó. Tương tự với các sự kiện “onmouseover”(Rê chuột) và “onchange”(Thay đổi giá trị) sẽ gọi các hàm tương ứng khi các bạn sử dụng các hành động phù hợp với sự kiện.Và như vậy các bạn đã phần nào biết cách sử dụng Event để gọi trong Javascript thông qua các thuộc tính trong HTML rồi.

Câu hỏi: Vậy liệu có cách nào mà không cần dùng đến thuộc tính trong HTML mà trong chúng ta có thể viết thẳng bên trong Javascript không? Giống như cách mà jQuery đã làm.

Trả lời: Xin thưa các bạn là còn, và chúng ta sẽ cùng tìm hiểu đến với hàm “addEventListener()” nhé.

Tìm hiểu “addEventListener()”

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
	<style type="text/css">
		p.hover-me {
			display: inline-block;
			width: 200px;
			height: 50px;
			background: #d5d5d5;
		}
	</style>	
	<script type="text/javascript">
		window.addEventListener('load', function() {
			alert('Đã Load thành công toàn bộ');
		});
	</script>
</head>
<body>
	<a href="#" title="Click vào tôi" id="click_me">Click vào tôi</a><br/>
	<p class="hover-me" id="hover_me">Hãy rê chuột vào tôi</p><br/>
	<select id="change_me">
		<option value="">Hãy thay đổi tôi đi</option>
		<option value="">Tôi thay đổi</option>
	</select>
	<script type="text/javascript" charset="utf-8">
		document.getElementById('click_me').addEventListener('click', function() {
			alert('Đã nhấn');
		});

		document.getElementById('hover_me').addEventListener('mouseover', function() {
			alert('Đã rê chuột vào');
		});

		document.getElementById('change_me').addEventListener('change', function() {
			alert('Đã thay đổi');
		});
	</script>		
</body>
</html>
  • Ví dụ trên cho các bạn thấy rằng, khi các bạn dùng đến “addEventListener()” sẽ giúp cho trang HTML của các bạn nhìn rõ ràng và dễ hiểu hơn, thay vì chúng ta phải viết thêm các thuộc tính “onsubmit, onclick, onload…” thì nay chúng ta chỉ cần dùng đến “addEventListener()” kết hợp với “document.getElementById()” để tìm đích danh đối tượng mà chúng ta chỉ định.
  • Ngoài ra, tên sự kiện của chúng ta sẽ bị loại bỏ mất chữ “on” ở đầu khi các bạn truyền vào đối số đầu tiên trong “addEventListener()” và các sự kiện các bạn có thể tham khảo thêm tại đây http://www.w3schools.com/tags/ref_eventattributes.asp.

Tuy nhiên, ví dụ trên chỉ là một nửa của vấn đề bởi vì chúng ta sẽ còn 1 đối số cuối cùng nữa của “addEventListener()” mà tôi chưa đề cập ở ví dụ trên có tên gọi là “useCapture”. Các bạn hãy xem qua ví dụ dưới đây nhé.

Event Listener

1. Chưa có đối số thứ 3 (Mặc định đối số thứ 3 có giá trị là “false” nếu không tồn tại)

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
	<style type="text/css">
		#div_click {
			width: 400px;
			height: 300px;
			background: green;
		}

		#p_click {
			width: 200px;
			height: 150px;
			background: #d5d5d5;
		}

	</style>	
</head>
<body>
	<div id="div_click">
		<p id="p_click">
			<a href="#" id="a_click">Click tôi đi</a>
		</p>
	</div>
	<script type="text/javascript" charset="utf-8">
		document.getElementById('a_click').addEventListener('click', function() {
			alert('Thẻ a được click');
		});

		document.getElementById('p_click').addEventListener('click', function() {
			alert('Thẻ p được click');
		});

		document.getElementById('div_click').addEventListener('click', function() {
			alert('Thẻ div được click');
		});
	</script>		
</body>
</html>
  • Kết quả ở ví dụ trên khi các bạn click vào “Click tôi đi” các bạn sẽ nhận được 3 thông báo theo thứ tự “Thẻ a được click” => “Thẻ p được click” => “Thẻ div được click”. Bởi vì cả 3 vùng này đều được gán sự kiện (event) “click” và cách gọi của nó nếu các bạn để ý thì nó sẽ gọi từ thẻ “a” mà chúng ta đã click vào “Click tôi đi” cho đến tới vùng “div” cũng có sự kiện click bao quanh thẻ “a”. Và tương tự nếu chúng ta click vào thẻ “p” thì cũng sẽ được thông báo theo thứ tự “Thẻ p được click” => “Thẻ div được click”, và cuối cùng là nếu chúng ta click vào vùng “div” thì chỉ có thông báo “Thẻ div được click” mà thôi.

Kết luận ở trường hợp này, khi chúng ta click vào một đối tượng nào đó có sự kiện trùng với đối tượng cha hoặc lớn hơn nữa như ông nội, ông ngoại gì đấy cũng có sự kiện tương tự thì sẽ chạy theo thứ tự “từ nhỏ đến lớn hay từ trong ra ngoài”.

2. Có đối số thứ 3

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
	<style type="text/css">
		#div_click {
			width: 400px;
			height: 300px;
			background: green;
		}

		#p_click {
			width: 200px;
			height: 150px;
			background: #d5d5d5;
		}

	</style>	
</head>
<body>
	<div id="div_click">
		<p id="p_click">
			<a href="#" id="a_click">Click tôi đi</a>
		</p>
	</div>
	<script type="text/javascript" charset="utf-8">
		document.getElementById('a_click').addEventListener('click', function() {
			alert('Thẻ a được click');
		}, true);

		document.getElementById('p_click').addEventListener('click', function() {
			alert('Thẻ p được click');
		}, true);

		document.getElementById('div_click').addEventListener('click', function() {
			alert('Thẻ div được click');
		}, true);
	</script>		
</body>
</html>
  • Kết quả, các bạn sẽ thấy rằng nó sẽ bị ngược so với ví dụ không có đối số thứ 3 ở trên. Nó sẽ có thứ tự ngược lại “Thẻ div được click” => “Thẻ p được click” => “Thẻ a được click”.

Vậy các bạn phần nào hiểu được đối số thứ 3 rồi phải không. Nó giúp chúng ta đảo ngược lại bằng cách sẽ gọi “từ lớn về nhỏ hay từ cao xuống thấp”. Tuy nhiên, các bạn vẫn chưa hiểu đúng về nó đâu nhé. Hãy xem qua ví dụ cuối.

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
	<style type="text/css">
		#div_click {
			width: 400px;
			height: 300px;
			background: green;
		}

		#p_click {
			width: 200px;
			height: 150px;
			background: #d5d5d5;
		}

	</style>	
</head>
<body>
	<div id="div_click">
		<p id="p_click">
			<a href="#" id="a_click">Click tôi đi</a>
		</p>
	</div>
	<script type="text/javascript" charset="utf-8">
		document.getElementById('a_click').addEventListener('click', function() {
			alert('Thẻ a được click');
		}, false);

		document.getElementById('p_click').addEventListener('click', function() {
			alert('Thẻ p được click');
		}, true);

		document.getElementById('div_click').addEventListener('click', function() {
			alert('Thẻ div được click');
		}, false);
	</script>		
</body>
</html>
  • Kết quả thật bất ngờ khi các bạn click vào “Click tôi đi”. Thứ tự dường như chạy loạn xạ “Thẻ p được click” => “Thẻ a được click” => “Thẻ div được click”.

Nhưng sự thật là nó đã chạy đúng rồi đấy các bạn ạ. Thẻ “p” được gán giá trị “true” cho đối số thứ 3, giúp nó sẽ trở thành đối tượng ưu tiên. Nghe qua thật khó hiểu nhưng tôi sẽ có một bảng nho nhỏ ở đây để các bạn hiểu được nó rõ ràng hơn.

Cho thẻ “a” là (1), thẻ “p” là (2) và thẻ “div” là (3)

Giá trị đối số thứ 3 Ưu tiên khi chạy Sự kiện trùng nhau
(1) True

(2) False

(3) False

(1) a

(2) p

(3) div

(1) False

(2) True

(3) False

(2) p

(1) a

(3) div

(1) False

(2) False

(3) True

(3) div

(1) a

(2) p

(1) False

(2) True

(3) True

(3) div

(2) p

(1) a

(1) True

(2) False

(3) True

(3) div

(1) a

(2) p

Bảng tóm tắt các trường hợp xảy có thể xảy ra khi các bạn dùng giá trị “true”, “false” lẫn lộn mà cách chạy của nó sẽ có phần khác nhau. Các bạn sẽ rút ra được kết luận là “Tác dụng của đối số thứ 3 chính là thay đổi sự ưu tiên thành “từ lớn xuống nhỏ hay từ ngoài vào trong” khi trùng sự kiện với nhau.”

Ghi chú

  • Hàm: addEventListener(‘event’, function, useCapture)
  • Đối số:
  1.             ‘event’: tên của event, giống với khi dùng thuộc tính HTML nhưng bỏ chữ “on” ở đầu sự kiện như “onclick => click”, “onload => load”.
  2.             Function: hàm thực thi khi sự kiện được gọi.
  3.             useCapture: thay đổi độ ưu tiên khi trùng sự kiện.
  • Mức độ phổ biến: rất thông dụng
  • Thực tế: được dùng rất nhiều để bắt sự kiện mà không cần viết thuộc tính trong HTML, giúp HTML dễ đọc và gọn gàng hơn. Javascript viết cũng khoa học và dễ điều chỉnh hơn.

Trong bài này, chúng ta cũng đã kết thúc phần tìm hiểu Javascript Cơ bản tại đây. Ở các bài viết sau, tôi sẽ hướng dẫn các bạn về các hàm thông dụng trong Javascript và các thủ thuật trong Javascript và cách ứng dụng của nó vào trong thực tế như thế nào.

Bài 7: Javascript và HTML DOM

Ở những bài trước, chúng ta đã tìm hiểu về kiểu dữ liệu, phạm vi hoạt động của biến trong Javascript (JS) cũng như các nền tảng kiến thức mà các bạn cần có ở các bài trước. Trong bài học này, chúng ta sẽ tìm hiểu về Javascript và HTML DOM.

Javascript và HTML DOM

DOM được viết tắt của “Document Object Model” (DOM – Mô hình đối tượng tài liệu), giúp chúng ta khi sử dụng Javascript có thể can thiệp vào các thành phần trong HTML để lấy dữ liệu cũng như có thể can thiệp về cấu trúc hoặc giao diện (CSS).

Vậy làm thế nào để có thể đọc được DOM cũng như các thành phần trong HTML? Các bạn hãy xem qua các ví dụ sau đây:

(Vui lòng bật F12 trên Chrome/Firefox và chuyển sang Tab Console để thấy kết quả)

1. Lấy giá trị của thẻ HTML chỉ định

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<div>
		<p id="id_cua_toi">Hãy đọc tôi đi.</p>
	</div>
	<script type="text/javascript">
	var element = document.getElementById('id_cua_toi');
	console.log(element);
	console.log(element.innerHTML);
	</script>
</body>
</html>

Kết quả:

<p id="id_cua_toi">Hãy đọc tôi đi.</p>
Hãy đọc tôi đi.
  • Qua ví dụ trên, để có thể đọc dữ liệu của thẻ “p” bên trong thẻ “div” hay bất cứ thẻ nào bao quanh nó. Chúng ta cần đặt cho nó một “id” không được trùng lắp trong Website. Giống như việc bạn dùng số CMND thì chỉ có 1 mình bạn có số đó mà thôi.
  • Và khi tôi dùng hàm “document.getElementById()” và truyền vào cho nó “id” của vùng cần lấy, các bạn sẽ thấy tôi đã lấy được cả dữ liệu toàn bộ thẻ “p” mà chúng ta đã định nghĩa “id”. Và để lấy giá trị bên trong thẻ “p” thì chúng ta chỉ cần truy cập tới phương thức “innerHTML” là có thể lấy được dữ liệu như mong muốn.

Ghi chú

  • Hàm: document.getElementById(id)
  • Đối số:
  1.             Id: tên của thẻ HTML được ấn định HTML
  • Mức độ phổ biến: rất thông dụng
  • Thực tế: được dùng rất nhiều để có thể bắt được dữ liệu như mong muốn trong tài liệu HTML.

2. Thay đổi giá trị của thẻ HTML chỉ định

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<div>
		<p id="id_cua_toi">Hãy đọc tôi đi.</p>
	</div>
	<script type="text/javascript">
	var element = document.getElementById('id_cua_toi');
	element.innerHTML = '<strong>Tôi đã bị ghi đè.</strong>';
	console.log(element);
	console.log(element.innerHTML);
	</script>
</body>
</html>

Kết quả:

<p id="id_cua_toi"><strong>Tôi đã bị ghi đè.</strong></p>
<strong>Tôi đã bị ghi đè.</strong>
  • Sau khi thực nghiệm ví dụ trên, các bạn đã thấy chuỗi “Hãy đọc tôi đi” đã bị ghi đè thành “<strong>Tôi đã bị ghi đè.</strong>” thông qua phương thức “innerHTML” mà chúng ta đã dùng ở ví dụ trước đó và gán cho nó giá trị mới giúp thay đổi dữ liệu của thẻ do chúng ta định nghĩa “id” cho nó trong HTML.
  • Đồng thời, chuỗi “Tôi đã bị ghi đè” do ảnh hưởng của thẻ HTML và cụ thể ở đây là “<strong>” giúp cho chuỗi của chúng ta in đậm bên ngoài màn hình. Nhưng khi chúng ta nhận dữ liệu từ Console thì nó cũng sẽ bao gồm luôn thẻ HTML của chúng ta.

3. Hiển thị thời gian máy tính

Trong ví dụ này, chúng ta sẽ cùng xem cách hiển thị thời gian bằng JS được thực hiện như thế nào nhé.

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<div id="dongho"></div>
	<script type="text/javascript" charset="utf-8">
		var date = new Date();
		var gio = date.getHours();
		var phut = date.getMinutes();
		var giay = date.getSeconds();
		//Lấy giờ hệ thống hiện tại
		document.getElementById('dongho').innerHTML = gio + ':' + phut + ':' + giay;
	</script>		
</body>
</html>

Kết quả:

14:36:46
  • Để có thể hiển thị thời gian, chúng ta cần khởi tạo đối tượng “Date” để có thể sử dụng được những phương thức lấy thời gian như “getHours(), getMinutes(), getSeconds()…”. Sau đó, chúng ta sẽ tìm thẻ có “id” chỉ định để hiển thị vào đúng nơi chúng ta cần.

Tuy nhiên khi các bạn chạy thử ví dụ này, các bạn sẽ thấy rằng thời gian chúng ta bắt được chỉ là thời gian tĩnh và được chạy lúc ta khởi chạy website, nó không tự động chạy như thời gian trên hệ thống của chúng ta. Vậy làm sao để có thể làm được điều đó? Hãy theo dõi cách sau:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<div id="dongho"></div>
	<script type="text/javascript" charset="utf-8">
		//Lấy giờ hệ thống liên tục
		setInterval(function() {
			var date = new Date();
			var gio = date.getHours();
			var phut = date.getMinutes();
			var giay = date.getSeconds();
			document.getElementById('dongho').innerHTML = gio + ':' + phut + ':' + giay;
		}, 1000);
	</script>		
</body
</html>
  • Kết quả sẽ không khác ví dụ trên, nhưng các bạn sẽ thấy thời gian của chúng ta được cập nhật liên tục theo hệ thống cứ mỗi “1000ms” (1 giây) thông qua hàm “setInterval()” mà chúng ta được học trong Ví dụ này. Và hàm này có cách viết rất giống bài học Anonymous Function và Closure mà chúng ta đã được học trước đó. Đồng thời đối số thứ 2 của hàm “setInterval()” đó chính là thời gian hàm được gọi lại mỗi lần.
  • Tuy nhiên nếu như các bạn tinh mắt, có thể sẽ thấy khi chúng ta vừa vào website thì chúng ta sẽ thấy nó có một khoảng thời gian bị trì hoãn trước khi website có thể cập nhật thời gian cho chúng ta. Đó là bởi vì hàm “setInterval()” chỉ gọi hàm dùng để cập nhật thời gian của chúng ta sau một thời gian mà ta đã ấn định trước đó.

 

Ngoài ra, chúng ta còn có cách ghi khác và cách truyền đối số vào trong hàm khi được gọi bởi hàm “setInterval()”. Nhưng phạm vi của biến khi được truyền vào trong hàm chắc hẳn sẽ khiến nhiều bạn bỡ ngỡ:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<div id="dongho"></div>
	<script type="text/javascript" charset="utf-8">
		//Lấy giờ hệ thống liên tục
		var so_lan_goi = 0;
		var bien_ben_ngoai = 0;
		function dong_ho(ten_bat_ky, so_lan_goi) {
			so_lan_goi++;
			bien_ben_ngoai++;
			var date = new Date();
			var gio = date.getHours();
			var phut = date.getMinutes();
			var giay = date.getSeconds();
			document.getElementById('dongho').innerHTML = gio + ':' + phut + ':' + giay;
			console.log(ten_bat_ky);
			console.log('Số lần gọi: ' + so_lan_goi);
			console.log('Biến bên ngoài: ' + bien_ben_ngoai);

		}
		setInterval(dong_ho, 1000, 'Các bạn có thể đặt tên biến bất kỳ', so_lan_goi);
	</script>		
</body>
</html>

Hãy chạy thử và cảm nhận, các bạn sẽ thấy rất bất ngờ đấy. Bởi vì kết quả trả về cho chúng ta sẽ có nội dung như sau:

Các bạn có thể đặt tên biến bất kỳ
Số lần gọi: 1
Biến bên ngoài: 1
Các bạn có thể đặt tên biến bất kỳ
Số lần gọi: 1
Biến bên ngoài: 2
…
  • Như các bạn thấy, việc truyền đối số vào bên trong hàm được gọi bởi hàm “setInterval()” rất đơn giản và chúng ta chỉ cần đặt tên biến bất kỳ bên trong hàm được gọi theo thứ tự được truyền vào. Nhưng khi sử dụng các biến thì chỉ có biến “bien_ben_ngoai” là bị tác động khi hàm “dong_ho()” được gọi bởi hàm “setInterval()”, còn số lần gọi, bởi vì cứ sau một thời gian thì hàm “setInterval” lại lấy giá trị như ban đầu để truyền vào vì thế giá trị hoàn toàn không thay đổi. Nếu như các bạn không nhớ rõ, hãy xem lại bài viết Phạm vi hoạt động của biến và Anonymous Function và Closure để nắm rõ kiến thức hơn.
  • So với “bien_ben_ngoai” do được định nghĩa là biến toàn cục và được sử dụng trực tiếp bên trong hàm “setInterval()” nên hoàn toàn có thể tác động.

Ghi chú

  • Hàm: setInterval(function, timer, params…)
  • Đối số:
  1.       function: tên của hàm(Không bọc trong nháy như thế này “day_la_ten_ham” và nên nhớ không có 2 dấu “()” ở sau tên hàm) hoặc anonymous function/closure.
  2.       timer: thời gian thực thi lại hàm.
  3.       params: đối số cần truyền vào hàm theo thứ tự và sẽ nhận lại bên trong hàm cũng theo thứ tự như ta đã truyền vào.
  • Mức độ phổ biến: Ít
  • Thực tế: thường sử dụng khi cập nhật thời gian hoặc các chức năng cần thời gian để thực hiện lại như reload chatbox, refresh top bài viết bằng AJAX.

4. Tìm hiểu hàm “setTimeout()”

Ở phần trước, chúng ta đã tìm hiểu về hàm “setInterval()”, dùng để thực hiện công việc nào đó cần lặp lại liên tục trong một khoảng thời gian được chỉ định. Vậy một câu hỏi đặt ra là “chúng ta có thể thực hiện công việc nào đó trong thời gian chỉ định và thực hiện chỉ một lần duy nhất hay không?” thì câu trả lời sẽ là “Có!” và đó chính làm hàm “setTimeout()” bên trong Javascript (JS).

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Demo Javascript</title>
</head>
<body>
	<button type="button" onclick="hen_gio();">Hẹn giờ</button>
	<input type="text" id="thoi_gian" value="3000" placeholder="Nhập thời gian mili-giây">mili-giây
	<script type="text/javascript" charset="utf-8">
		function hen_gio() {
			var thoi_gian = document.getElementById('thoi_gian');
			setTimeout(function() {
				alert('Hello World!');
			}, thoi_gian.value);
		}
	</script>		
</body>
</html>

Như vậy, chắc phần nào các bạn đã hiểu được công dụng của nó đúng không nào. Nó chỉ thực hiện một công việc nào đó sau khoảng thời gian được ấn định trước đó và chỉ thực hiện một lần. Và cách dùng nó hoàn toàn giống với phần trước mà chúng ta đã xem, nên các bạn có thể thử truyền đối số hoặc sử dụng các cách gọi hàm mà trước đó chúng ta đã làm với “setInterval()”.Ví dụ trên khi các bạn chạy, các bạn sẽ thấy có một nút nhấn “Hẹn giờ”. Và khi các bạn nhấn vào nút này, sau một khoảng thời gian đã ấn định trước đó. Các bạn sẽ thấy thông báo “Hello World!” được hiện lên và khi các bạn tắt đi thì hành động hiển thị thông báo không còn hiển thị nữa, nhưng nếu các bạn thay thế nó thành hàm “setInterval()” các bạn sẽ thấy nó được gọi mãi mãi cho đến khi các bạn tắt Website.

Ghi chú

  • Hàm: setTimeout(function, timer, params…)
  • Đối số:
  1.             function: tên của hàm(Không bọc trong nháy như thế này “day_la_ten_ham” và nên nhớ không có 2 dấu “()” ở sau tên hàm) hoặc anonymous function/closure.
  2.             Timer: thời gian thực thi lại hàm.
  3.             Params: đối số cần truyền vào hàm theo thứ tự và sẽ nhận lại bên trong hàm cũng theo thứ tự như ta đã truyền vào.
  • Mức độ phổ biến: Ít
  • Thực tế: thường sử dụng khi dùng để trì hoãn thời gian gọi AJAX mỗi lần ở các chức năng search, giúp giảm tải cho server khi cứ mỗi kí tự thêm vào thì chúng ta đều gửi lên server thì không được tối ưu.

Cuối cùng, chúng ta cũng đã kết thúc được bài học về Javascript và HTML DOM trong bài viết này. Ở bài học sau, chúng ta sẽ cùng Tìm hiểu sự kiện trong Javascript như thế nào nhé.