2012-06-21 63 views
0

我對Web開發相當陌生,我想我認爲我掌握了它的唯一主要問題,遇到了跨瀏覽器兼容性問題。設置接收事件的函數調用超時不適用於IE7

我在網頁上有一個textarea,用戶輸入完成後會調用一個函數。爲了做到這一點,我正在使用jQuery和setTimeout在調用函數之前等待一下。這確保了在每次按鍵後都不會調用該功能。我不希望它在每次按鍵後調用,因爲該函數會向請求處理並返回的servlet發送請求。

該代碼在Chrome上運行正常(我使用Chrome進行調試),但它不適用於IE7。那就是:

var timer = null; 
$("#scriptInput").keypress(function() { 
    clearTimeout(timer); 
    var thisEvent = window.event; 
    timer = setTimeout(function() {validateScript(thisEvent);}, 500);   
}); 


function validateScript(evt) { 
    var code = (evt.keyCode) ? evt.keyCode : evt.which; 

    //check which key was pressed... 
    //don't need to send a request on key presses of CAPSLOCK, SHIFT, and ARROW keys 
    if(code != 20 && code != 16 && code != 37 && code != 38 && code != 39 && code !=40){ 
    sendRequest(2); 
    } 
} 

正如你所看到的,我已經在實施與IE7的兼容性進行了大量的嘗試,但都無濟於事:\

它必須與至少IE7兼容,因爲它會被許多使用IE7並且沒有升級權限的機器所使用。

讓我知道你是否需要任何信息! 謝謝!

P.S. 「scriptInput」是它正在影響的textarea的id。

+3

'VAR thisEvent = window.event;' - 獲得擺脫這一點,並將函數頭從'function()'改爲'function(thisEvent)'。 – ThiefMaster

+1

@ ThiefMaster:只需詳細說明:'$(「#scriptInput」)。keypress(function(thisEvent){' –

+0

@ThiefMaster:這是一個答案。 –

回答

3

var thisEvent = window.event;是不是跨瀏覽器兼容 - 並不是所有的瀏覽器使用全局event對象,但函數的參數來代替。

的jQuery始終爲您提供了一個事件對象作爲函數的參數,所以只需刪除上面的分配和改變你的代碼是這樣的:

$("#scriptInput").keypress(function(thisEvent) { 
    ... 
}); 

的jQuery也歸爲按鍵的各種屬性爲e.which所以你可以擺脫var code = (evt.keyCode) ? evt.keyCode : evt.which;,並且一直使用evt.which


您還可以改善/縮短整個事情多一點。如果添加另一個庫是好的我會用_.debounce從Underscore.js做的時機:

$("#scriptInput").keypress(_.debounce(validateScript, 500)); 

相反Underscore.js的,你也可以使用一個jQuery plugin providing that functionality

如果添加額外的第三方代碼是不是我的計時器存儲元素,而不是一個(可能是全局)變量上的一個選項:

$("#scriptInput").keypress(function(e) { 
    var $this = $(this); 
    window.clearTimeout($this.data('timer')); 
    $this.data('timer', window.setTimeout(function() { 
     validateScript(e) 
    }, 500)); 
}); 
+0

這是一個非常有用的答案,非常感謝!我最終使用了下劃線庫中的_.debounce函數。 – dr7164