人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

javascript について。

window.onload = function(){};

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

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

よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:JavaScript 回避
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

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

ならば

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

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

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

◎質問者からの返答

あっ すいません。

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

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

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

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

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

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

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

失礼しました。

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


2 ● Km1967
●0ポイント

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

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

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

<script type="text/javascript" src="ほげほげ.js">call hogehoge</script>
◎質問者からの返答

ありがとうございます


3 ● a532
●22ポイント

(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つの関数にまとめてしまう。

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

????????????

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

◎質問者からの返答

ありがとうございます


4 ● kebo987654
●33ポイント ベストアンサー

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 );
}
◎質問者からの返答

素晴らしい!

これにします。

ありがとうございます。

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

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


5 ● ardarim
●33ポイント

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

複数の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以外の変数名や関数名でも競合してしまう可能性が考えられます。

◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ