2011-04-12 26 views
0

我有許多不同的元件的形式。在準備功能,我結合像這樣爲這些「變化」:jquery的變化()結合在第一變化不觸發(ASP.NET確認)

$(function(){ 
    $('#someControlID').change(nameOfHandlerFunction); 
    .... (similar code for all controls) 
} 

它的工作如預期的下拉列表,但對於文本框,文本域和複選框,處理函數沒有得到直到時間我改變了這個值。我在處理程序中放置了一個調試器語句來仔細檢查。如果我專注於文本框,修改文本並留下焦點,我必須再次執行此操作才能使處理程序運行。任何想法可能會導致這種行爲?

編輯:這是在IE 8中觀察到的。

謝謝!

+0

什麼瀏覽器你看到這個?你能舉一個例子到http://jsfiddle.net嗎? – 2011-04-12 15:36:29

+0

那麼,這個小提琴第一次工作:http://jsfiddle.net/tPzqf/所以它可能是你的結局。您應該在這裏發佈您的代碼 – JohnP 2011-04-12 15:37:21

+0

您的示例在我正在開發的瀏覽器(IE8)中正常工作。 jsfiddle是一個非常方便的網站!讓我在代碼中進行更多的挖掘,看看我能弄清楚什麼。 – 2011-04-12 15:45:10

回答

1

ASP.NET是罪魁禍首。我沒有在我的問題中提到它,因爲我不認爲它是相關的,但是你去了。有問題的控件與ASP.NET Validator控件相關聯。在檢查時,控制元素的「onchange」被設置爲一個稱爲「ValidatorOnChange」的函數。不知何故,在這些控件上調用jQuery的「change()」會導致上述不良行爲。

我工作圍繞這一問題通過我自己的事件處理程序 - 這可能不是每個人的選擇,但我不得不在加載庫提供此功能,所以我用它和網頁的工作現在。

新的代碼如下所示:

var el = document.getElementById('someControlId'); 
el.onchange = appendFunction(el.onchange, nameOfHandlerFunction); 

這裏是萬一方法本身這可以幫助別人。

function appendFunction(fn1, fn2) { 
    var result; 

    // if neither arguments are functions, return an empty function. 
    // if only one argument is a function, return that. 
    if (typeof (fn1) !== 'function' && typeof (fn2) !== 'function') { 
     result = function() { return; }; 
    } 
    else if (typeof (fn1) === 'function' && typeof (fn2) !== 'function') { 
     result = fn1; 
    } 
    else if (typeof (fn1) !== 'function' && typeof (fn2) === 'function') { 
     result = fn2; 
    } 
    else { 
     result = function() { 
      fn1(); 
      fn2(); 
     } 
    } 
    return result; 
}