66

私の ASP.NET ユーザー コントロールでは、JavaScript をwindow.onloadイベントに追加しています。

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

私の問題は、イベントに既に何かがあるonload場合、これが上書きされることです。onloadイベントで 2 つのユーザー コントロールがそれぞれ JavaScript を実行できるようにするにはどうすればよいでしょうか?

編集:サードパーティのライブラリに関する情報をありがとう。それらを心に留めておきます。

4

8 に答える 8

105

提案されている「ソリューション」のほとんどは、Microsoft固有のものであるか、肥大化したライブラリを必要とします。これが1つの良い方法です。これは、W3C準拠のブラウザおよびMicrosoftIEで機能します。

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}
于 2009-03-27T01:34:31.973 に答える
18

現在のイベントを保存するという醜い解決策 (フレームワークやaddEventListener/を使用するよりもはるかに劣る) がまだあります。attachEventonload

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
});

jQuery のようなフレームワークは、ページの読み込み時ではなく、DOM の準備が整ったときにコードを実行する方法を提供することに注意してください。

DOM の準備ができているということは、HTML は読み込まれているが、画像やスタイルシートなどの外部コンポーネントは読み込まれていないことを意味し、load イベントが発生するずっと前に呼び出される可能性があります。

于 2008-08-13T13:44:52.163 に答える
6

今日も同様の問題があったのでindex.js、次のようにして解決しました。

window.onloadFuncs = [];

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

そして、onloadイベントを添付したい追加のjsファイルでは、これを行うだけです:

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

私は通常 jQuery を使用しますが、今回は純粋な js に制限され、しばらく頭を使う必要がありました。

于 2010-12-01T02:48:09.350 に答える
3

Mootoolsはもう1つの優れたJavaScriptフレームワークであり、非常に使いやすく、RedWolvesがjQueryで述べたように、必要な数のハンドラーをチャックし続けることができます。

含めるすべての*.jsファイルについて、コードを関数でラップするだけです。

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

また、onloadの代わりにdomreadyを使用する利点もあります

于 2008-08-13T04:16:01.500 に答える
2

これを試して:

window.attachEvent("onload", myOtherFunctionToCall);

function myOtherFunctionToCall() {
    // do something
}

編集:ねえ、私はFirefoxでログインし、これを自分で再フォーマットする準備をしていました!それでもIE7でコードをフォーマットしていないようです。

于 2008-08-13T03:31:16.847 に答える
1

実際、このMSDNページによると、この関数を複数回呼び出して、複数のスクリプトを登録できるようです。別のキーを使用する必要があります(2番目の引数)。

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

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

私はそれがうまくいくはずだと信じています。

于 2008-08-13T03:39:06.160 に答える
1

私は ASP.NET についてよく知りませんが、両方の関数を呼び出す onload イベント用のカスタム関数を作成してみませんか? 2 つの関数がある場合は、イベント用に登録した 3 番目のスクリプトから両方を呼び出します。

于 2008-08-13T03:26:40.617 に答える
1

jqueryでこれを行うことができます

$(window).load(function () {
    // jQuery functions to initialize after the page has loaded.
});
于 2012-08-30T08:37:31.777 に答える