1

このスクリプトは、マウスオーバーやクリックなど、各マウスイベントで画像を「ロールオーバー」します

img src が変更されました。問題は、 onClick イベントによって実行される関数の実行を遅らせようとしていたことです。

関数を settimeout に変更しようとしましたが、成功しませんでした

setTimeOut('functionName(param1, param2)', 5000);

設定されたタイムアウトをカプセル化する関数を呼び出す必要はありません

私は何を間違っていますか?

       <a href="yourpage.htm">
    <img src="images/Button2_Normal.PNG" width="150" id="img2" 
onmouseover="mOver(this, image2)" onmouseout="mOut(this, image2)" onclick="mActive(this, image2)" />
                    </a> 

                    <a href="yourpage.htm">
          <img src="images/Button1_Normal.PNG"  width="150" id="img1" 
       onmouseover="mOver(this, image1)" onmouseout="mOut(this, image1)" onclick="mActive(this, image1)">
</a>
  • JavaScript

    var image1 = new Array("images/Button1_Normal.PNG", "images/Button1_MouseClick.PNG", "images/Button1_MouseOver.PNG");
    var image2 = new Array("images/Button2_Normal.PNG", "images/Button2_MouseClick.PNG", "images/Button2_MouseOver.PNG");
    
    var preloadImages = new Array();  // preloads images
    function Loadimages(images) {
    
        for (i = 0; i < images.length; i++) {
            preloadImages[i] = new Image()
            preloadImages[i].src = images[i]
        }
    }
    Loadimages(image1);
    
    
    lastN = ""
    
    function mOver(obj, images) {
        if (lastN != obj.id) {
            document.images[obj.id].src = (images.length == 3 ? images[2] : images[1])
        }
    }
    
    function mOut(obj, images) {
        if (lastN != obj.id) {
            document.images[obj.id].src = images[0]
        }
    }
    
    function mActive(obj, images) {
        var ts1 = document.getElementById('img1');
        if (typeof obj != "string") { obj = obj.id }
    
        document.images[obj].src = images[1]
        if (lastN != "" && lastN != obj) {
            document.images[lastN].src = images[0]
        }
        lastN = obj
    }
    function timeout_init(obj,images) {
        setTimeout('mActive(obj, images)', 5500);
    }
    
4

2 に答える 2

3

閉鎖はうまくいくはずです:

function timeout_init(obj,images) {
  setTimeout(function() {
    mActive(obj, images);
  }, 5500);
}

evalのような機能を避けるもう 1 つの理由です。現在の実装では、JavaScript エンジンは " 'mActive(obj, images)'" 文字列をeval()受け取り、それをグローバル コンテキストで使用しようとします。その時までに、元の変数objimages変数は長い間失われています。

閉鎖すると、その関数が終了したにもかかわらず、無名関数は引き続きtimeout_init()引数にアクセスできます。しかし、変数は内部関数によって参照されていたため、生き残りました。

于 2012-09-26T18:53:20.870 に答える
0

でパラメータを渡すことができますsetTimeout。これは で引数として使用できます mActive

   setTimeout(mActive, 5500, obj, images);
于 2012-09-26T19:06:51.743 に答える