February 1st, 2010
Tags: Công việc
Posted in Linh tinh | No Comments »
November 18th, 2009
Posted in Javascript, Trick | 2 Comments »
November 1st, 2009
Cuối tuần vừa rồi, bác Cảnh (my leader) có triển khai 1 task cho tôi với nội dung là: “chỉnh lại core của con calendar.js để ngày mặc định khi hiệp popup calendar sẽ là ngày hiện tại cộng một” (dĩ nhiên nếu đã nhập ngày trước đó rồi thì vẫn phải focus đúng).
Rất may là con calendar của tác giả Alf Magne Kalleland đã xử lý việc focus ngày nếu text field đã có giá trị nên việc của tôi lúc này khá nhàn hạ:
- Nếu textfield đã có giá trị rồi thì ko làm gì cả
- Nếu chưa có:
+ Lấy ngày hiện tại & cộng thêm 1 đơn vị
+ Nếu giá trị vừa cộng > tổng số ngày trong tháng hiện tại thì tăng tháng lên 1 đơn vị & ngày hiện tại = 1
+ Nếu tháng vừa cộng > 12 thì tăng năm hiện tại lên 1, ngày & tháng hiện tại = 1
Cái khó ở đây chính việc xác định tổng số ngày trong tháng bằng Javascript. Khó ở đây không phải thuật toán, khó ở đây chỉ đơn giản là làm thế nào để viết…càng ngắn càng tốt.
Nếu làm theo kiểu như trong các sách họp lập trình hoặc trong trường học thì sẽ phải if else (switch case) các tháng 30 ngày (4, 6, 9, 11), tháng có 31 ngày (1, 3, 5, 7, 8, 10, 12) và tháng 2 có 28 ngày (năm nhuận sẽ là 29). Ở đây lại phải xác định năm nhuận là năm như thế nào (chia hết cho 400), dài dòng ghê :p
Đối tượng Date của Javascript cho quá tải tham số date truyền vào & sẽ tự động tính toán số dư ngày thừa ra đó theo ngày hiện tại. Do đó để tính số ngày trong 1 tháng bằng Javascript chỉ cần dùng 1 dòng sau:
1
2
3
4
| function daysInMonth(iMonth, iYear)
{
return 32 - new Date(iYear, iMonth, 32).getDate();
} |
Keke… vậy là task 1 giờ đã được giải quyết trong vòng chưa đầy 5′. Suỵt, bí mật
Source: http://snippets.dzone.com/posts/show/2099
Posted in Javascript | No Comments »
October 31st, 2009
Đã bao giờ bạn sử dụng AJAX (jQuery) để check username tồn tại như sau chưa?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| function checkUser(u) {
var isExist = false;
$.post(
'index.php',
{'username': u},
function(ret) {
isExist = ret;
}
);
return isExist;
}
if( checkUser('donamkhanh') ) {
alert('donamkhanh already exist');
}
else {
alert('donamkhanh does not exist');
} |
Theo bạn, nếu chạy đoạn mã trên thì sẽ ra kết quả nào (giả sử rằng server script hoàn toàn chạy chính xác, trả về giá trị true/false hay 1/0 gì đó & username donamkhanh đã tồn tại)?
Do mặc định trong jQuery tất cả các request đều được sent asynchronous nên trong quá trình send request thì hàm checkUser đã return luôn giá trị lúc khởi tạo biến isExist = 0 rồi. Vậy nên kết quả luôn thông báo là username donamkhanh chưa tồn tại
Cách fix rất đơn giản, sử dụng thuộc tính async của $.ajax. Các hàm $.post hay $.get không có thuộc tính này vì
This is jQuery’s low-level AJAX implementation. See $.get, $.post etc. for higher-level abstractions that are often easier to understand and use, but don’t offer as much functionality (such as error callbacks).
Code ở trên sẽ sửa lại như sau:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function checkUser(u) {
var isExist = false;
$.ajax({
async: false,
type: "POST",
url: "ajax.php",
data: "username=" + u,
success: function(msg){
isExist = msg;
}
});
return isExist;
} |
Nếu set async = false, jQuery sẽ sử dụng synchronous cho các request. Ở ví dụ này bạn có thể thấy nó chưa thực sự cần thiết (vì có thể nhét đoạn check vào luôn trong callback function của $.post, $.get hay bất cứ ajax method nào của jQuery), tuy nhiên nếu bạn phải viết nhiều hàm (ajax) và các hàm này lấy kết quả của nhau để tính toán thì việc set synchronous là bắt buộc. Nếu không thì sẽ xảy ra tình trạng nhiều biến nhiều hàm lon ton cầm đèn dầu chạy trước ô tô ^^
Posted in Ajax, jQuery | No Comments »
October 9th, 2009
Posted in Trick | No Comments »
September 19th, 2009
Tags: Linh tinh, Unit Test
Posted in Linh tinh | No Comments »
September 8th, 2009
Posted in Ajax, Javascript, Trick, jQuery | No Comments »
July 13th, 2009
Posted in Concept | 1 Comment »
July 3rd, 2009
Posted in Trick | No Comments »