2012-09-26 66 views
1

此腳本正在每個鼠標事件上對圖像 執行「翻轉」操作。 mousover並單擊嘗試使用settimeout避免分離的函數

IMG SRC改變, 的問題是,我試圖拖延 通過onClick事件執行的功能 的執行。

我試圖改變功能的setTimeout,但沒有成功

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

nither調用封裝了設定的時間進行

什麼我做錯了什麼功能?

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

切勿將字符串傳遞給'setTimeout'。永遠。 – jbabey

+0

@jbabey好吧,這是一個很好的...只是所以我知道。並感謝那作爲一個先行者,以避免考慮目前的做法。沒有線索可以解決這個問題。 – LoneXcoder

回答

3

閉幕應該工作:

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

它的另一個理由避免eval樣的功能。使用當前實現的JavaScript引擎將採用「'mActive(obj, images)'」字符串,並嘗試在全局上下文中使用eval()。到那個時候,原來的objimages變量很久就失去了。

閉合您的匿名函數仍然可以訪問timeout_init()參數,儘管該函數已完成。但是,由於內部函數引用了變量,所以變量仍然存在。

+0

thnks很多!要試一試 – LoneXcoder

+0

感謝您提供清晰,快速和完美的解決方案 – LoneXcoder

0

您可以在setTimeout中傳遞參數。這將作爲參數在mActive中提供。

setTimeout(mActive, 5500, obj, images); 
+0

只需提醒一下 - 在'setTimeout'中傳遞附加參數不會**在我們最喜歡的瀏覽器(IE)中工作。 –

+0

是的,我只測試它只在IE10中工作。 – Anoop

+0

很高興知道這是'我們'最喜歡我在一家公司工作,使用ie爲應用程序 – LoneXcoder