Javascript


18
Nov 09

IE message: Operation aborted

Few days ago, I assigned a task to fix a problem: IE showed an error message box and crashed when load a heavy page (it took about 40-50s to load completly) .

I thought, maybe cause of problem is Javascript (syntax error) and I checked whole the page. Hix, nothing happened :( After I Googled, I found the main reason are:

  1. The HTML file is being parsed
  2. Script is executing
  3. The executing script attempts to add, or remove an element from an unclosed ancestor in the markup tree (not including the script block’s immediate parent element).

So I refactored code by move all JS function call into $(document).ready( … ) (I used jQuery) to make sure the script will be excute after the page loaded successful. whew, the problem has been resolved :)

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

1
Nov 09

Determining the Number of Days in a Month with Javascript

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:

[-]?View Code JAVASCRIPT
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 :D

Source: http://snippets.dzone.com/posts/show/2099

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

8
Sep 09

Parse single Javascript object in Jquery by $.ajax method

Chưa thử test với Jquery phiên bản mới nhất, mới chạy trên bản 1.2.1 (dự án hiện tại đang dùng :( ). Khi sử dụng $.ajax như bên dưới thì phát sinh lỗi:

[-]?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$.ajax({
	type: "POST",
	url: document.location.href,
	data: "card_type=" + cardType + "&card_number=" + cardNumber,
	dataType: 'JSON',
	cache: false,
	success: function(responses){
	    if(!responses.has_error)
	    {
	 	alert("Please enter valid Card Number.");
	 	return false;
	    }
       }
});

thì bị lỗi. Mặc dù response là {‘has_error’: false;} nhưng lại không nhảy vào khối lệnh IF.
Cách khắc phục rất đơn giản:

[-]?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
...
success: function(responses){
    var obj = eval('('+responses+')');
    if(!obj .has_error)
    {
	alert("Please enter valid Card Number.");
	return false;
    }
}

Lưu ý: Chỉ xảy ra lỗi này nếu response là single object, nếu nó là mảng các object thì cứ $.each rồi get theo key, val thì lại ko sao :(

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

15
Jan 08

Drag n Drop Islands

Kéo và thả nào :D

Giờ chưa có thời gian viết code cụ thể được, cứ để link demo đã, khi nào rảnh quay lại viết sau :p

http://donamkhanh.com/lab/ajax/drag_n_drop_island

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

31
Dec 07

Get Alexa Rank

Sau mấy hôm làm mấy cái Get Yahoo Avatar, Get Domain, giờ đến thằng Alexa rank.

Thật ra mình muốn làm cái get rank này lâu lắm rồi, từ cái hồi xem cái kết quả này. Nhưng khi bắt tay vào thì gặp khó khăn 1 chút. Alexa “chơi khó” bằng cách sinh ra mấy cái thẻ . Cách này của Alexa hay phết, khi mình copy kết quả rank, paste nó lại ra số linh ta linh tinh. Giờ thì biết tại sao. Nhưng biết là 1 chuyện, làm được lại là 1 chuyện. Googled, thấy quá trời giải pháp. Trong đó có 1 chú cũng giải quyết theo cách của mình (bóc tách, dùng cURL). Nhưng (lại nhưng), Alexa nó có cho tra theo dạng xml thì tại sao lại không dùng nhỉ, bóc tách làm gì cho mệt cơ chứ. Vậy là theo hướng dùng XML

Okie, done!

Demo http://donamkhanh.com/lab/ajax/get_alexa_rank (Alexa chỉ tính rank cho domain chính thôi chứ ko tính cho từng subdomain đâu nha, bác nào nhập blog Yahoo hay Opera thấy rank cao đừng sướng nhá)

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

30
Dec 07

Currency converter

If you want to convert from your currency to other currency or else, you can use this utility. It get result from Yahoo Finance (Ask value) so you can trust return value

Technology:

This code is free (GNU license) but if you make money by it, you can share to me, I don’t refuse money :p

For demo: http://donamkhanh.com/lab/ajax/currency_converter

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]

29
Dec 07

Get Yahoo avatar – “Lừa đảo”

Trước tiên vào link này: http://donamkhanh.com/lab/ajax/get_ym_avatar

Thử lấy avatar của 1 vài nick xem sao. Chính xác phải không nào? (nick nào không có avatar sẽ hiển thị ảnh mặc định – xấu mù)

Okie!

Giờ bạn vào link này: http://img.msg.yahoo.com/avatar.php?yids=karate_hn1984&format=gif

Thay yids=karate_hn1984 thành nick của bạn, điều gì xảy ra nhỉ :)

Okie!

Lại quay lại trang trước: http://donamkhanh.com/lab/ajax/get_ym_avatar

View source (Ctrl + U trong FF, Ctrl + F3 trong Opr) & xem mấy dòng comment :) )

[Digg] [Reddit] [del.icio.us] [Facebook] [Technorati] [Google] [StumbleUpon]