Thứ Sáu, 16 tháng 8, 2013

Jquery cho người mới bắt đầu - Giới thiệu

1.jQuery là gì
jQuery là 1 thư viện javascript giúp cho việc lập trình javascript của bạn nhanh hơn thú vị hơn.
2 .Hello world
Bước 1: Download jQuery ở trên trang chủ jquery.com
Bước 2: Tạo 1 file html với nội dung như sau:
<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Hello world</title>
        <script src="jquery.js"></script>
    </head>
<body>
   <div id="result"></div>
   <script>
    $(document).ready(function(){
        $('#result').html('Hello world!');
    });
   </script>
</body>
</html>
Giải thích code
Đầu tiên bạn thêm đoạn script có chứa nội dung của jQuery vào đầu trang để có thể sử dụng các hàm trong jQuery
$(document).ready(function(){
    $('#result').text('Hello world!');
});
Đoạn code này sẽ tạo ra chữ Hello world! là nội dung bên trong thẻ div có id là result.
$(document).ready. Đoạn này jQuery sẽ kiểm tra xem DOM đã sẵn sàng để javascript thực thi hay chưa.
Chú ý: Luôn luôn viết code jQuery của bạn trong document ready.
3. Event trong jQuery
Khi bạn xem một trang web bạn thường có rất nhiều thao tác với trang web đó như click vào một link nào đó, nhấn phím để chuyển sang bài tiếp theo, di chuột vào một tấm ảnh . Tất cả những hành động đó được gọi là event. Trong jQuery cung cấp rất nhiều event tương ứng với các hành động đó của bạn.
Trong khuôn khổ bài viết này tôi chỉ để cập đến sự kiện click và cách để handle nó. Bạn hoàn toàn có thể áp dụng ví dụ của tôi với các sự kiện khác.
Code html
<button id="btn">Click me!</button>
Code js
$(document).ready(function(){
    $('#btn').click(function(){
        alert('Hello world');
    });
});
Đoạn code trên sẽ hoạt động như sau: Khi bạn click vào nút button với id là btn thì 1 hộp thoại sẽ xuất hiện với thông báo là "Hello world";
function bên trong click chính là function để bạn handle sự kiện khi bạn click vào nút button hay nói 1 cách khác như sau : khi click vào button thì làm cái gì sau đó.
Bạn có thể viết luôn handle function như ví dụ trên cũng được hoặc có 1 cách khác bạn có thể tạo 1 function bên ngoài và truyền nó vào như sau:
//Hàm handle không có bất kỳ tham số nào
function myfunction(){
    alert('Hello world');
}

$(document).ready(function(){
    //Truyền tên hàm vào trong sự kiện click
    $('#btn').click(myfunction);
});
=> 2 ví dụ đều cho kết quả tương đương
4. Một số hiệu ứng
fadeIn : Hiện thành phần được chọn từ mờ đến sáng dần
$('p').fadeIn(200)// Thẻ p sẽ hiện ra từ từ sau 200ms
=> Đọc thêm : fadeIn
fadeOut: Làm trong suốt thành phần được chọn 1 cách từ từ
$('p').fadeOut(200)// Thẻ p sẽ từ từ biến mất sau 200ms
=> Đọc thêm : fadeOut
hide: Ẩn thành phần được chọn ngay lập tức
$('p').hide() //Thẻ p ẩn đi ngay lập tức
=> Đọc thêm : hide
show: Hiển thành phần được chọn ngay lập tức
$('p').show() //Thẻ p hiện ra ngay lập tức
=> Đọc thêm : show
animate: Tạo hiệu ứng chuyển động cho thành phần được chọn
 $('p').animate({
    left: '-=50'//Thẻ p dịch chuyển sang trái 50px
},200, function(){
    //Code callback ở đây
});
=> Đọc thêm : animate
slideUp: Hiệu ứng xổ xuống ( hay dùng làm dropdown menu )
//html
<ul>
    <li>Menu1</li>
    <li>Menu2</li>
    <li>Menu3</li>
    <li>Menu4</li>        
</ul>
<button></button>
//jquery
$('button').click(function(){
    $('ul').slideUp();
});
=> Đọc thêm : slideUp
slideDown: Tương tự slideUp nhưng là hiệu ứng cuộc lên
//html
<ul>
    <li>Menu1</li>
    <li>Menu2</li>
    <li>Menu3</li>
    <li>Menu4</li>        
</ul>
<button></button>
//jquery
$('button').click(function(){
    $('ul').slideDown();
});
=> Đọc thêm : slideDown
slideToggle : Chuyển đổi giữa slideUp và slideDown
//html
<ul>
    <li>Menu1</li>
    <li>Menu2</li>
    <li>Menu3</li>
    <li>Menu4</li>        
</ul>
<button></button>
//jquery
$('button').click(function(){
    $('ul').slideToggle();
});
=> Đọc thêm : slideToggle

Tổ chức và sử dụng lại code trong nodejs

Phần lớn lập trình viên đều quen thuộc với khái niệm tổ chức code trong ứng dụng của mình. Việc tổ chức code 1 cách logic sẽ cho chúng ta khả năng sử dụng lại những code mà ta đã viết. Chúng ta thông thường sẽ tách và nhóm những đoạn code lặp lại hoặc được sử dụng lại một cách thường xuyên thành các function, nhiều function xử lý chung 1 logic nào đó chúng ta lại tổ chức thành các class. Các class và function đó được tổ chức vào các file và đặt vào thư mục như lib hoặc classes... Còn các code thông thường thì có thể sẽ được tổ chức vào thư mụcapplication hoặc một thư mục bất kỳ nào khác tuỳ vào project của chúng ta.
1. Tổ chức và sử dụng lại các hàm chức năng
Khi chúng ta thực hiện một ứng dụng nào đó, của bất kỳ ngôn ngữ nào, thường sẽ có những thời điểm mà code của chúng ta viết tất cả trong 1 file. Điều này sẽ dẫn đến việc rất khó để kiểm soát được code của chúng ta nếu xảy ra lỗi. Vì thế, thay vì tống hết đống code đó trong 1 file, chúng ta hãy xem lại xem những phần code nào có thể tách ra và chuyển chúng sang một file khác.
Đối với 1 số ngôn ngữ thực thi như PHP hay Ruby, chúng ta thường dùng khái niệm include file để tổ chức ứng dụng của chúng ta. Phần lớn việc include có nghĩa là các code xử lý trong file include sẽ thực thi ở phạm vi Global. Điều này có nghĩa là bất kỳ biến hay hàm nào chúng ta khai báo trước đó sẽ có khả năng bị ghi đè (overwrite) bởi code trong các file include đó.
Giả sử với PHP, ứng dụng của bạn có một phương thức thực hiện việc đổi tỷ giá đồng USD như sau:
function changeVNDToUSD($number, $rate = 20000) {
  $number = (int) $number;

  if ($rate > 0)
     return round($number / $rate, 2);
  else return 0;
}

include 'currency_helper.php';
Sau đó bạn include 1 file giả sử là currency_helper.php ngay dưới phương thức changeVNDToUSD mà trong file currency_helper.php bạn lại khái báo 1 phương thức cũng tên changeVNDToUSD, bạn sẽ nhận được lỗi: Fatal error: Cannot redeclare changeVNDToUSD.
Để tránh điều này, trong PHP chúng ta có thể dùng namespaces, với Ruby là modules. Đối với Nodejs, nó cung cấp cho chúng ta hệ thống module cực kỳ mạnh mẽ, ta có thể tách code và require code mà không lo bị xung đột với các code mà ta đã viết trước đó. Một khi muốn sử dụng 1 phương thức hay một đoạn code nào đó ở phạm vi Global, chúng ta cần phải thông qua đối tượng là exports hoặc module.exports. Và đây chính là cách mà chúng ta tạo module trong nodejs.
2. Tạo module trong nodejs
currency_helper.js
var df_rate = 20000;

function changeVNDToUSD(number, rate) {
  var rate = rate || df_rate;
  if (rate > 0)
     return Math.round(number / rate, 2);
  else return 0;
}

exports.changeVNDToUSD = changeVNDToUSD;
// C2: module.exports = changeVNDToUSD;
app.js
var currency = require('./currency_helper'); // File currency_helper.js cùng thư mục với app.js
console.log(currency.changeVNDToUSD(200000)); // $10
// C2: console.log(currency(200000)); // $10
Hãy chú ý đến phần comment ở cuối file currency_helper.js, nếu chúng ta sử dụng exports.changeVNDToUSD = changeVNDToUSD thì ở fileapp.js chúng ta phải gọi phương thức thông qua đối tượng currency là currency.changeVNDToUSD. Còn nếu chúng ta sử dụng C2, gán trực tiếp phương thức changeVNDToUSD với đối tượng module.exports thì ở file app.js ta sẽ gọi trực tiếp phương thức khi require:currency(200000). Ngoài ra chúng ta có thể sử dụng phương thức changeVNDToUSD một lần bằng cáchrequire('./currency_helper.js').changeVNDToUSD(200000) mà không cần phải khai báo.
3. Exports nhiều phương thức
Như đã đề cập ở trên, trong nodejs chỉ những phương thức nào được gán với đối tượng exports thì chúng ta mới có thể sử dụng được ở các module khác. Các phương thức khác trong cùng file sẽ được coi là các private method
currency_helper.js
var df_usd_rate = 20000;
var df_eu_rate = 40000;

function changeVNDToUSD(number, rate) {
  var rate = rate || df_usd_rate;
  if (rate > 0)
     return Math.round(number / rate, 2);
  else return 0;
}

function changeVNDToEU(number, rate) {
  var rate = rate || df_eu_rate;
  if (rate > 0)
     return Math.round(number / rate, 2);
  else return 0;
}

function changeUSDToVND(number, rate) {
  var rate = rate || df_eu_rate;
  return Math.round(number * rate, 2);
}

exports.changeVNDToUSD = changeVNDToUSD;
exports.changeVNDToEU = changeVNDToEU;
Giả sử trong file currency_helper.js ta có 3 phương thức như trên. Nếu ta chỉ exports 2 phương thức là changeVNDToUSD vàchangeVNDToEU thì ở các module khác ta chỉ có thể sử dụng 2 phương thức này, còn phương thức changeUSDToVND là phương thức private củacurrency_helper.js
app.js
var currency = require('./currency_helper'); // Lưu ý là k cần phần mở rộng .js
console.log(currency.changeVNDToUSD(1200000)); // $60
console.log(currency.changeVNDToEU(1200000)); // 30 euro
console.log(currency.changeUSDToVND(20)); // TypeError: Object #<Object> has no method 'changeUSDToVND'
Như vậy là đến thời điểm này, chúng ta đã có thể hiểu được cách tổ chức, phân tách code sử dụng module trong node, cách tạo 1 module và require module của ta trong các module khác. Nhưng nếu chỉ có thế thì làm sao nói hệ thống module trong node là mạnh mẽ được? Nếu bạn còn nghi ngờ điều này, xin chào mừng bạn đến với thế giới của module trong node: NPM
4. NPM: Thế giới của các module
Nghe giới thiệu có vẻ mỹ miều thế nhưng thực ra npm là 1 package manager của Node. Ta có thể sử dụng nó để cài cắm các module package khác của tất cả mọi lập trình viên trên thế giới mà đã được publish trên NPM. Hoặc chúng ta cũng có thể publish những module package mà chính ta viết cho cộng đồng sử dụng.
Cài đặt 1 npm module
Trong /Desktop/my_project
Mở terminal (Với Windows bạn có thể sử dụng PowerShell) và gõ lệnh sau:
$npm install request
NPM sẽ thực hiện tìm kiếm và nếu tìm thấy nó sẽ download về thư mục node_modules trong my_project cho chúng ta. Trong trường hợp này npm sẽ clone 1github repo từ https://github.com/mikeal/request
request module sẽ được đặt trong /Desktop/my_project/node_modules/request
Trong file /Desktop/my_project/app.js, ta sẽ load module request vào bằng dòng code sau:
var request = require('request');
Lưu ý là trong require, chúng ta chỉ cần đặt tên giống với tên thư mục trong node_modules là được.
Ta có thể cài đặt 1 module ở phạm vi global bằng cách thêm tham số -g đằng sau lệnh npm install
$npm install coffee-script -g
Tuy nhiên, những module là global thì ta không thể require chúng trong ứng dụng của chúng ta. Hãy lưu ý đến phần này.
Ngoài cách cài đặt từng module sử dụng lệnh npm install chúng ta còn có 1 cách khác cũng rất tiện lợi đó là định nghĩa các module cần thiết cho ứng dụng của chúng ta trong file package.json
{
    "name": "My App",
    "version": "1",
    "dependencies": {
       "connect": "1.8.7",
       "request": "lastest"
    }
}
Lưu ý là file package.json cần phải được đặt ở root của ứng dụng của chúng ta. Thực hiện cài đặt các npm module bằng lệnh npm install. Npm sẽ tự động đọc file json và tải về các gói đã được định nghĩa trong file.
Tổng kết
Chúng ta đã đi qua 4 phần của series về Nodejs trên hanoijs. Nếu bạn vẫn chưa đọc các phần khác của series thì truy cập vào Nhập môn Nodejs để theo dõi. Tuy mọi thứ từ lúc bắt đầu đến giờ vẫn chỉ là những khái niệm ở mức low level nhưng hanoijs hy vọng bạn đã có 1 cái nhìn cơ bản nhất về các nội dung trên nodejs. Phần tiếp theo của series, hanoijs sẽ cùng các bạn tìm hiểu 1 web framework chạy trên node có tên là Expressjs. Happy coding!!

Tối ưu cách viết Jquery

1. Luôn luôn sử dụng phiên bản jQuery mới nhất
Các nhà phát triển jQuery luôn tìm cách tối ưu để phiên bản sau chạy mượt và dung lượng nhẹ hơn các phiên bản trước . Bạn còn đợi chờ gì nữa mà không vào ngay trang chủ jquery.com để tải phiên bản jquery mới nhất về máy tính của mình.
Có 1 điểm các bạn cần lưu ý : tính đến thời điểm viết bài này phiên bản jQuery mới nhất là 2.0.2, phiên bản này thay đổi rất nhiều thứ ví dụ như : bỏ hỗ trợ ie6, ie7, ie8, bỏ live ... đọc thêm thông tin ở đây.
2.Ưu tiên ID hơn Class
Select theo id sẽ nhanh hơn rất nhiều so với việc dùng class, vì khi bạn select theo id jQuery sẽ dùng luôn hàm navative của trình duyệt là getElementByID, các bạn biết đấy cái nào có sẵn cũng tốt mà :D.
Để kiểm tra xem tốc độ giữa 2 việc này bạn hãy tạo 1 tài liệu html với nội dung đơn giản như sau
<div id="list"></div>
Sau đó bạn bật console lên và paste đoạn code này vào
// Example creating a list and filling it with items
//  and selecting each item once

console.time('class');
var list = $('#list');
var items = '<ul>';

for (i=0; i<1000; i++) {
    items += '<li class="item' + i + '">item</li>';
}

items += '</ul>';
list.html (items);

for (i=0; i<1000; i++) {
    var s = $('.item' + i);
}
console.timeEnd('class');

console.time('id');
var list = $('#list');
var items = '<ul>';

for (i=0; i<1000; i++) {
    items += '<li id="item' + i + '">item</li>';
}

items += '</ul>';
list.html (items);

for (i=0; i<1000; i++) {
    var s = $('#item' + i);
}
console.timeEnd('id');
3.jQuery làm việc từ phải qua trái
Điều này có vẻ hơi ngược một chút. Nhưng đó là cách mà jQuery làm việc, chúng ta cùng xét ví dụ sau để hiểu rõ hơn về điều này.
 <div id="box">
   <p> Hello </p>
 </div>

//Cach1
console.time('a');
$('#box p');
console.timeEnd('a');

// Cach 2.
console.time('b');
$('p','#box');
console.timeEnd('b');
Cách 1: Đầu tiên jquery sẽ chọn ra tất cả các thẻ p sau đó từ các thẻ p chọn được đó mới tìm xem thẻ p nào có cha với id là box, thử tưởng tượng tài liệu của bạn có 1000 thẻ p thì sẽ mất rất nhiều thời gian để select. => Không tối ưu
Cách 2: jQuery sẽ tìm phần tử có id là box trước sau đó mới tìm các thẻ p trong nó, tìm kiếm 1 thành phần khi biết được sẽ tìm kiếm từ đâu nhanh hơn rất nhiều so với việc " mò kim đáy bể" giống như cách 1
4.Giữ cho code của bạn dễ nhìn hơn
jQuery luôn return ra 1 đối tượng vì vậy bạn có thể hoàn toàn sử dụng cách viết sau:
$('#myID').find('p').fadeIn()
5.Cache
Sử dụng biến trung gian để lưu kết quả select của bạn là cách tốt nhất để tối ưu tốc độ của jQuery
//Cach ket qua select vao bien a
var a = $('#select');
$('#myID').click(function(){
   a.fadeOut();
});

//Khong viet theo cach nay nhe
$('#select').fadeIn();

$('#myID').click(function(){
    $('#select').fadeOut();
});
Cách thứ 2 jQuery phải đi tìm phần tử có id là select tới 2 lần, nếu bạn cache nó vào 1 biến thì lần sau bạn chỉ việc sử dụng biến đó như 1 selector bình thường.
6.Tránh thao tác quá nhiều lên DOM
Bạn nên hạn chế việc tác động quá nhiều lên DOM . Nếu không quá cần thiết bạn lên dùng html hay cho append , prependafter.
7. Sử dụng find
Khi bạn muốn tìm 1 thành phần con trong 1 thành phần cha , cách tốt nhất bạn lên tìm thành phần cha trước sau đó mới tìm thành phần con.
$('#myID p') => cách này jQuery tìm thẻ p trước sau đó mới tìm thẻ p có cha là #myID
$('#myID').find('p') => cách này tối ưu hơn cách trên vì jQuery tìm #myID trước sau đó tìm p trong myID => Tối ưu