2010-07-25 71 views
2

我有這樣的代碼:setTimeout和鼠標移開問題

function beforemouseout() { 
    if ($(this).val() == '') { 
    $(this).val($(this).attr('title')); 

    } 
    else { 

    } 
    setTimeout('beforemouseout()',3000); 
} 
$(".other").click(function() { 
    $(this).val(''); 
    $(".other").mouseout(beforemouseout); 
}); 
<input id="hour" type="text" class="other" autocomplete="off" value="hour" title="hour" /> 
<input id="hour" type="text" class="other" autocomplete="off" value="minutes" title="minutes" /> 

但螢火蟲給我一個錯誤:beforemouseout沒有定義。 爲什麼? 我在jsfiddle.net上試過了,它沒有給出錯誤,但結果並不是我所期望的。我期望當我點擊#hour來隱藏文本,並且當onmouseout被觸發時等待5秒,然後 - 做檢查

+2

是真的正是你的代碼是什麼樣子?因爲如果是這樣,我不認爲你會得到那個錯誤。螢火蟲說這個錯誤發生在哪一行? – Pointy 2010-07-25 13:01:42

+0

您可以將'setTimeout('beforemouseout()',3000)''重寫爲'setTimeout(beforemouseout,3000)',這樣更有效率,因爲不需要進行運行時評估。 – Eric 2010-07-25 13:05:36

+0

我在jsfiddle.net上試過了,它並沒有給出錯誤,但結果並不是我所期望的。我期望當我點擊#hour來隱藏文本,並且當onmouseout被觸發時等待5秒,然後 - 做檢查 – lam3r4370 2010-07-25 13:09:10

回答

3

更改您的setTimeout這樣的:

setTimeout(beforemouseout ,3000); 

否則它在全球背景下尋找beforemouseout,如果你的代碼是不是在那裏(它的內/納入到另一種閉合任何類型),它不會找到它。我在這裏猜測,它在ready處理程序中,因爲您在其旁邊張貼HTML,這意味着您正在使用片段。

從整體角度來看,如果你可以避開它,絕不會傳遞一個字符串到setTimeout()setInterval(),它會導致很多不需要的副作用......就像這樣。相反,通過直接引用像我有以上,是完全明確的,以及...使其工作:)


Edit(對於問題的評論):看來你後,實際上是什麼仍然有點不同於它的寫法。從我收集的內容中,您需要延遲將缺省值恢復至<input>。有幾種方法可以做到這一點,這裏有一個:

function beforemouseout() { 
    if ($(this).val() == '') { 
    $(this).val($(this).attr('title')); 
    } 
} 
$(".other").click(function() { 
    $(this).val('').mouseout(function() { 
    setTimeout($.proxy(beforemouseout, this), 3000); 
    }); 
}); 

You can give it a try here

+1

啊,是的,可能就是這樣。 – Pointy 2010-07-25 13:04:12

+0

我相信''beforemouseout'中'this'的值在從'setTimeout()'調用時會不正確。 – user113716 2010-07-25 13:20:08

+0

@patrick - 這就是['。$ .proxy()'](http://api.jquery.com/jQuery.proxy/)用於;)給演示嘗試看看它的工作 – 2010-07-25 13:21:08

1

是不傳遞字符串作爲setTimeout函數的參數希望你會完成。 順便說一下,我認爲setTimeout不是必需的。如果在鼠標懸空時每次都爲空,那麼您將填寫'標題'字段。如果你同時使用setTimeout和mouseout,這會增加你函數的指數級調用。我想你理解我的觀點。
感謝

+0

我不認爲這是正確的。代碼編寫的方式,該函數應該對引用它的任何東西都可見。如果代碼在文檔中,情況就會如此。準備好的處理程序,或者如果它只是全局範圍內的代碼。 – Pointy 2010-07-25 13:03:20

0

變化$(".other").mouseout(beforemouseout);這樣:

$(".other").mouseout(function(){ 
    beforemouseout(); 
}); 
+0

這不會有幫助,它會通過打破'this'引用而受到傷害,它會指向'window'而不是你的答案中的元素:)'beforemouseout.apply(this);'會工作...但是,這是一個非常漫長而昂貴的方式來編寫已有的作品:) – 2010-07-25 13:08:47

+0

@Nick:保留其他,然後只需添加函數代碼片段即可。 – Marwelln 2010-07-25 13:16:48

+0

我不會跟着你...無論如何,最好用代碼糾正你的答案,因爲其他人會在以後找到這個:) – 2010-07-25 13:20:01