Sunday, July 25, 2010

Những cách viết hay JavaScript trong SharePoint - Phần 3

3) Đăng ký StartUpScript hay BlockScript

Có rất nhiều lý do chúng ta đăng 1 đoạn script, thông thường trong C# có 4-5 cách để đăng ký. Đôi khi, lập trình viên cứ quen cách viết mặc định là ClientScript.RegisterClientScriptBlock, tác hại là code không chạy được, bỗng dưng...bực bội.

Tham khảo đoạn code sau nha:

<form action="page.aspx?...">

<script language="javascript">
var myWP = document.getElementById("ms-WP01");
var myCal = myWP.getElementsByTagName("DIV");
myCal[0].style.border = "1px solid red";
</script>

<div id="ms-WP01">
<div id="182C-0123-DB46EF67687-021C" class="ms-cal">
....
</div>
</div>

</form>

Lúc chạy trang web IE nó báo error JavaScript vàng khè ở thanh status bar, click đúp vào thì thấy "myWP is null or undefined", còn chạy Firefox thì im um bà rù.

Thắc mắc: code mình không sai, dò lại thấy trong hàm OnPrerender viết như sau

string strCode = @"var myWP = document.getElementById("ms-WP01");
var myCal = myWP.getElementsByTagName("DIV");
myCal[0].style.border = "1px solid red";";
if (!Page.ClientScript.IsRegisterClientScriptBlock("MyCode"))
{
Page.ClientScript.RegisterClientScriptBlock(this.getType(), "MyCode", strCode, true);
}

Lạ nhỉ, code đúng, build thành công nhưng chạy thì nó báo lỗi. Đơn giản thôi vì cái code JavaScript nó chạy từ trên xuống, đến đoạn nào thực thi ngay đoạn đó, code của chúng ta chạy cũng chẳng có gì phức tạp. myWP chắc chắn sẽ null, vì đến khi chạy lúc đó đối tượng ms-WP01 chưa được Render ra, document nó chưa hiểu ms-WP01 là cái mô tê gì hết.

Do vậy, để tránh những trường hợp thế này chúng ta nên để ý, đoạn code chúng ta đặt ở vị trí nào cho phu hợp, trong trường hợp này chúng ta đặt ở vị trí trước khi kết thúc tag FORM, nghĩa là dùng hàm RegisterStartUpScript, thì mọi chuyện được giải quyết êm xui.

Chúc các bạn thành công.

No comments: