2008-08-13 38 views
56

Trong ASP.NET User Control của tôi tôi thêm một số hoạt Javascript để sự kiện window.onload:Thêm nhiều sự kiện window.onload

if (!Page.ClientScript.IsStartupScriptRegistered(this.GetType(), onloadScriptName)) 
    Page.ClientScript.RegisterStartupScript(this.GetType(), onloadScriptName, 
    "window.onload = function() {myFunction();};", true);    

Vấn đề của tôi là, nếu đã có một cái gì đó trong trường hợp onload, hơn thế này ghi đè lên nó. Làm thế nào tôi sẽ đi về việc cho phép hai điều khiển người dùng cho mỗi JavaScript thực thi trong sự kiện onload?

Chỉnh sửa: Cảm ơn thông tin về thư viện của bên thứ ba. Tôi sẽ ghi nhớ chúng.

+1

dont wee không cần thư viện stinkin! fyi, đối với firefox, window.attachEvent ('load', myFunction); không window.attachEvent ('ONload', myFunction); –

Trả lời

93

Hầu hết các "giải pháp" gợi ý là Microsoft-cụ thể, hoặc yêu cầu các thư viện cồng kềnh. Đây là một cách tốt. Điều này làm việc với các trình duyệt tuân thủ W3C và với Microsoft IE.

if (window.addEventListener) // W3C standard 
{ 
    window.addEventListener('load', myFunction, false); // NB **not** 'onload' 
} 
else if (window.attachEvent) // Microsoft 
{ 
    window.attachEvent('onload', myFunction); 
} 
+1

Lưu ý: chức năng được gán (myFunction) trong window.attachEvent ('onload', myFunction); luôn luôn bị sa thải sau khi bất kỳ chức năng nào được gán cho window.onload – user961954

+1

xin lỗi thưa bạn, NB ** không ** tải trọng 'nghĩa là gì? – meJustAndrew

+0

@meJustAndrew có nghĩa là khi bạn sử dụng addEventListener, bạn không sử dụng 'onload' bạn chỉ sử dụng 'load'. – fmacdee

1

Tôi không biết nhiều về ASP.NET, nhưng tại sao không viết chức năng tùy chỉnh cho sự kiện onload mà lần lượt gọi cả hai chức năng cho bạn? Nếu bạn có hai chức năng, hãy gọi cả hai từ một tập lệnh thứ ba mà bạn đăng ký cho sự kiện.

2

Bạn đã cân nhắc sử dụng một cái gì đó như JQuery cung cấp một khuôn khổ để làm sạch thêm nhiều trình xử lý sự kiện?

+2

Bạn có thể mở rộng điều này không? – adhanlon

2

Hãy thử điều này:

window.attachEvent("onload", myOtherFunctionToCall); 

function myOtherFunctionToCall() { 
    // do something 
} 

chỉnh sửa: hey, tôi chỉ nhận được sẵn sàng để đăng nhập với Firefox và định dạng lại này bản thân mình! Vẫn không có vẻ để định dạng mã cho tôi với IE7.

1

Thực tế, theo số this MSDN page, có vẻ như bạn có thể gọi hàm này nhiều lần để đăng ký nhiều tập lệnh. Bạn chỉ cần sử dụng các khóa khác nhau (đối số thứ hai).

Page.ClientScript.RegisterStartupScript(
    this.GetType(), key1, function1, true); 

Page.ClientScript.RegisterStartupScript(
    this.GetType(), key2, function2, true); 

Tôi tin rằng điều đó sẽ hiệu quả.

+0

Các tập lệnh này không được thực thi khi trang được gửi đến chúng? Không trong quá trình tải? – Ray

4

Mootools là một khung JavaScript tuyệt vời khác khá dễ sử dụng và như RedWolves đã nói với jQuery bạn có thể chỉ cần giữ nhiều trình xử lý như bạn muốn.

Đối với mọi tệp * .js tôi bao gồm tôi chỉ cần quấn mã trong một hàm.

window.addEvent('domready', function(){ 
    alert('Just put all your code here'); 
}); 

Và cũng có advantages of using domready instead of onload

17

Vẫn là một giải pháp xấu xí (mà là xa kém hơn sử dụng một khuôn khổ hay addEventListener/attachEvent) mà là để tiết kiệm hiện hành onload sự kiện:

function addOnLoad(fn) 
{ 
    var old = window.onload; 
    window.onload = function() 
    { 
     old(); 
     fn(); 
    }; 
} 

addOnLoad(function() 
{ 
    // your code here 
}); 
addOnLoad(function() 
{ 
    // your code here 
}); 
addOnLoad(function() 
{ 
    // your code here 
}); 

Lưu ý rằng các khung công tác như jQuery sẽ cung cấp một cách để thực thi mã khi DOM đã sẵn sàng và không phải khi trang tải.

DOM sẵn sàng có nghĩa là HTML của bạn đã tải nhưng không phải các thành phần bên ngoài như hình ảnh hoặc bảng định kiểu, cho phép bạn được gọi trước khi sự kiện tải kích hoạt.

4

Tôi đã có một vấn đề tương tự hiện nay vì vậy tôi giải quyết nó có một index.js như sau:

window.onloadFuncs = []; 

window.onload = function() 
{ 
for(var i in this.onloadFuncs) 
{ 
    this.onloadFuncs[i](); 
} 
} 

và trong các tập tin js bổ sung mà tôi muốn đính kèm sự kiện onload tôi chỉ phải làm điều này :

window.onloadFuncs.push(function(){ 
// code here 
}); 

Tôi thường sử dụng jQuery mặc dù, nhưng lần này tôi bị giới hạn trong các js thuần túy buộc phải sử dụng tâm trí của mình trong một thời gian!

1

Bạn có thể làm điều này với jquery

$(window).load(function() { 
    // jQuery functions to initialize after the page has loaded. 
}); 
Các vấn đề liên quan