javascript について。


window.onload = function(){};

これを同一ページで2回使うと動かなくなってしまいます。
回避方法を教えてください。

配られている2つのjavascriptの両方で
これが使われているときにどうすればよいのかが知りたいです。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/06 23:20:08
  • 終了:2010/03/07 17:00:15

ベストアンサー

id:kebo987654 No.4

kebo987654回答回数38ベストアンサー獲得回数102010/03/07 09:20:23

ポイント33pt

window.onload = function(){};の部分を修正することで解決出来そうです。

prototype.jsをお持ちなら、こんな風に。

<script type="text/javascript" src="prototype.js"><!--//--></script>
<script type="text/javascript"><!--
	Event.observe( window, "load", function(){
		alert( "window.onload" );
	}, false );
//--></script>

※prototype.jsはPrototype JavaScript framework: Download Prototypeより入手できます。

prototype.jsを使わない場合はIEならattachEvent, IE以外ならaddEventListenerを使って実装できます。

if( document.all )
{
	window.attachEvent( "onload", function(){
		alert( "window.onload" );
	} );
}
else
{
	window.addEventListener( "load", function(){
		alert( "window.onload" );
	}, false );
}
id:worldtravel

素晴らしい!

これにします。

ありがとうございます。

prototypeはこれのタグも書いてもらわなければならないので、

下のコードを使わせて頂きます。

2010/03/07 16:58:34

その他の回答(4件)

id:Km1967 No.1

Km1967回答回数224ベストアンサー獲得回数352010/03/06 23:36:16

ポイント12pt
window.onload = function(){
    処理A;   
};
window.onload = function(){
    処理B;
};

ならば

window.onload = function(){
    処理A;   
    処理B;
};

のように結合すればコールは1回だけとなり、上から順に処理される。

順番を逆にすると違う結果になる場合もあるため書く順序はよく考える必要があるがケースバイケースのため言及はできない。

id:worldtravel

あっ すいません。

教えて頂いたことは知っていました。

例えば自分が配るコードにこれを使いたいのですが、

使う人が他で配られているコードを使っていて、

その中にも同じように書かれているときに問題が発生しています。

また、これらを使う方はjsに関する知識もないため、

仰るようなことをして下さい。とも言えません。

最初の質問で書こうと思ったのですが省略してしまいました。

失礼しました。

引き続きよろしくお願いします。

2010/03/06 23:43:03
id:Km1967 No.2

Km1967回答回数224ベストアンサー獲得回数352010/03/07 00:01:40

これらを使う方はjsに関する知識もない

あまりスマートではないが外部jsファイルとして配布するようにして

HTMLファイルのbodyタグ内に1行いれこんでもらうといった手はどうだろう?

<script type="text/javascript" src="ほげほげ.js">call hogehoge</script>
id:worldtravel

ありがとうございます

2010/03/07 16:54:01
id:a532 No.3

a532回答回数31ベストアンサー獲得回数22010/03/07 03:29:53

ポイント22pt

(1)addEventListener・attachEventを使う。

--------------------

function a() {

alert("関数a");

}

function b() {

alert("関数b");

}

if(window.addEventListener) {

window.addEventListener("load", a, false);

window.addEventListener("load", b, false);

}

else if(window.attachEvent) {

window.attachEvent("onload", a);

window.attachEvent("onload", b);

}

--------------------

ただし、実行順にバラつきが生じる可能性がありますので、順番が処理に関係するのであれば2つの関数を1つにまとめてしまうなどしたほうが安全です。

------------

(2)onloadのイベントで2つの関数を実行する関数でラップする

--------------------

function a() {

alert("関数a");

}

function b() {

alert("関数b");

}

window.onload = function() {

a();

b();

}

--------------------

結局1つのonload枠を塞いでしまうことに変わりはありませんが、2つの関数を連続して実行することができるでしょう。

------------

(3)最初から2つの関数を1つの関数にまとめてしまう。

イベントが同じなら合体してもいいのかなーという気もします。配布されているライブラリ等であればライセンスの問題が生じる可能性もあります。

------------

手軽なところではこのような処理をされるのがよいのではないでしょうか。

id:worldtravel

ありがとうございます

2010/03/07 16:54:07
id:kebo987654 No.4

kebo987654回答回数38ベストアンサー獲得回数102010/03/07 09:20:23ここでベストアンサー

ポイント33pt

window.onload = function(){};の部分を修正することで解決出来そうです。

prototype.jsをお持ちなら、こんな風に。

<script type="text/javascript" src="prototype.js"><!--//--></script>
<script type="text/javascript"><!--
	Event.observe( window, "load", function(){
		alert( "window.onload" );
	}, false );
//--></script>

※prototype.jsはPrototype JavaScript framework: Download Prototypeより入手できます。

prototype.jsを使わない場合はIEならattachEvent, IE以外ならaddEventListenerを使って実装できます。

if( document.all )
{
	window.attachEvent( "onload", function(){
		alert( "window.onload" );
	} );
}
else
{
	window.addEventListener( "load", function(){
		alert( "window.onload" );
	}, false );
}
id:worldtravel

素晴らしい!

これにします。

ありがとうございます。

prototypeはこれのタグも書いてもらわなければならないので、

下のコードを使わせて頂きます。

2010/03/07 16:58:34
id:ardarim No.5

ardarim回答回数897ベストアンサー獲得回数1452010/03/07 15:47:54

ポイント33pt

こちらの方法でいけそうです。

複数のjsライブラリを利用する際にonloadを書き換える方法[to-R]


使用例

myOnload = function(){
    window.alert("ライブラリ2のonload");
}

if(window.addEventListener){
    window.addEventListener("load", myOnload, false);
} else {
    window.attachEvent("onload", myOnload);
}

ただ、window.onloadを書き換えるライブラリというのは、そもそも他のライブラリと共存することを考えていない可能性がありますので、window.onload以外の変数名や関数名でも競合してしまう可能性が考えられます。

id:worldtravel

こういうページがあったんですね。

やはり同じ悩みを持つ人がいたんですね。

ありがとうございました。

2010/03/07 16:59:12
  • id:km1967
    配布jsにwindows.onloadはマズイだろ
  • id:y_mori
    jQueryが使えるのであれば、ready(fn)というイベントが使えます。

    http://semooh.jp/jquery/api/events/ready/fn/

    ただし、逆にonloadは使えなくなってしまいますが。
  • id:worldtravel
    コメントありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません