2008-10-03 70 views
9

當IE中的用戶觸發事件時,它將設置爲window.event對象。查看觸發事件的唯一方法是訪問window.event對象(據我所知)使用jQuery以編程方式在Javascript中爲IE觸發事件

如果以編程方式觸發事件(如通過jQuery觸發事件),會導致ASP.NET驗證器出現問題。在這種情況下,window.event對象存儲上次用戶觸發的事件。

當以編程方式激發onchange事件以使其中附帶有ASP.NET驗證程序的文本框時,驗證會因爲它正在查看觸發最後一個事件的元素而中斷,而不是驗證程序所用的元素。

有沒有人知道解決這個問題的方法?這似乎是一個可以解決的問題,但從網上查看,大多數人只是想辦法忽略問題而不是解決問題。


爲了解釋我專門做什麼:
我使用的是一個文本框,也有與之相關聯的2個ASP.NET驗證一個jQuery的時間選擇器插件。當時間改變時,我正在使用更新面板回發到服務器以動態地執行一些操作,所以我需要觸發onchange事件才能觸發該文本框的回發。

jQuery時間選擇器通過創建隱藏的無序列表來操作,該列表在單擊文本框時變得可見。當單擊其中一個列表項時,通過jQuery的change()方法以編程方式爲文本框觸發「更改」事件。

因爲事件的觸發器是一個列表項,所以IE將列表項視爲事件的來源,而不是文本框。

我並不太在意這個ASP.NET驗證器在文本框更改後立即工作,我只需要處理「change」事件,以便爲文本框調用回發事件。問題是驗證器在IE中引發異常,從而阻止任何事件被觸發。

Firefox(我假設其他瀏覽器)沒有這個問題。由於不同的事件模型,只有IE。有沒有人遇到過這種情況,並看到如何解決它?


我發現這個問題報道的其他幾個地方,但他們沒有提供解決方案:

回答

2

從你描述,這個問題很可能是IE使用JS的獨特事件冒泡模型的結果。

我唯一真正的答案是拋棄ASP.NET驗證器並改用jQuery表單驗證插件。然後,您的文本框可以只是一個普通的ASP Webforms控件,並且當內容發生更改併發生回發時都是好的。另外,您還需要從服務器代碼中分離出更多的客戶端問題。

我從來沒有多少運氣混合Webform客戶端控件(如表單驗證控件)與外部JS庫如jQuery。我發現更好的路線是與其中一個或另一個走,但不要混合搭配。

不是您可能正在尋找的答案。

如果你想要去一個jQuery表單驗證插件海外商品會有這一個jQuery Form Validation

+0

我遇到的問題是我的公司想嚴格使用ASP驗證器。到目前爲止,我沒有這樣做過,但我認爲我將不得不考慮使用jQuery驗證,因爲我的當前解決方案不起作用。 – 2008-10-04 02:11:08

2

考慮用JavaScript啓動事件之前設置隱藏字段_EVENTTARGET值。您需要將其設置爲服務器端標識(用客戶端ID中的$替換下劃線),以便服務器瞭解它。我在模擬按鈕點擊時這樣做,以便服務器端可以確定在結果返回時返回哪個OnClick方法 - Ajax與否,並不重要。

+0

爲什麼這不在jQuery中?你看到一個理由嗎? – 2009-08-20 02:42:41

+1

因爲jQuery不是Microsoft技術,__EVENTTARGET隱藏字段僅適用於ASP.NET Web表單,並且只有當頁面上有與元素相關聯的事件處理程序時,我才相信。國際海事組織的整個「事件」基礎的回傳模式並不適合網絡,我預計它會隨着MVC的突出而消失。 – tvanfosson 2009-08-20 11:46:49

0

這就是我解決一個類似的問題。 爲datepicker寫了一個onSelect()處理函數。 link text 在該函數中,名爲__doPostBack('textboxcontrolid','')。 這會觸發文本框到服務器的部分回發,該服務器依次調用驗證程序。

7

我有同樣的問題。使用此功能解決:

jQuery.fn.extend({ 
    fire: function(evttype){ 
     el = this.get(0); 
     if (document.createEvent) { 
      var evt = document.createEvent('HTMLEvents'); 
      evt.initEvent(evttype, false, false); 
      el.dispatchEvent(evt); 
     } else if (document.createEventObject) { 
      el.fireEvent('on' + evttype); 
     } 
     return this; 
    } 
}); 

所以我的「ONSELECT」事件處理程序日期選擇器的樣子:

if ($.browser.msie) { 
    datepickerOptions = $.extend(datepickerOptions, { 
     onSelect: function(){ 
      $(this).fire("change").blur(); 
     } 
    }); 
} 
+0

輝煌。感謝您的最佳解決方案。 – Paul 2012-08-02 09:11:56

2

這是一個普遍的問題與jQuery datepickers和ASP驗證控件。 正如你所說,錯誤的元素交叉觸發一個ASP NET JavaScript驗證例程,然後M $代碼拋出一個錯誤,因爲例程中的觸發元素是未定義的。

我解決了這個問題,與我見過的其他人不同 - 通過決定M $應該更強健地編寫代碼,並因此重新聲明一些M $驗證器代碼以應對未定義的元素。我所看到的其他東西基本上是jQuery方面的一種解決方法,並且可能會刪除可能的功能(例如,使用click事件而不是更改)。

失敗位是

for (i = 0; i < vals.length; i++) { 
     ValidatorValidate(vals[i], null, event); 
    } 

當它試圖得到一個長度爲未定義「瓦爾斯」,這將引發錯誤。

我只是說

if (vals) { 
    for (i = 0; i < vals.length; i++) { 
     ValidatorValidate(vals[i], null, event); 
    } 
} 

和她的好去。下面是最終的代碼,它重新聲明瞭整個違規函數。我把它作爲腳本包含在我的主頁或頁面的底部。

是的,如果M $決定在將來更改驗證器代碼,它會向上兼容。但人們會希望他們能夠修復它,然後我們可以完全擺脫這個補丁。

// Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix 
function ValidatorOnChange(event) { 
    if (!event) { 
     event = window.event; 
    } 
    Page_InvalidControlToBeFocused = null; 
    var targetedControl; 
    if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) { 
     targetedControl = event.srcElement; 
    } 
    else { 
     targetedControl = event.target; 
    } 
    var vals; 
    if (typeof (targetedControl.Validators) != "undefined") { 
     vals = targetedControl.Validators; 
    } 
    else { 
     if (targetedControl.tagName.toLowerCase() == "label") { 
      targetedControl = document.getElementById(targetedControl.htmlFor); 
      vals = targetedControl.Validators; 
     } 
    } 
    var i; 
    if (vals) { 
     for (i = 0; i < vals.length; i++) { 
      ValidatorValidate(vals[i], null, event); 
     } 
    } 
    ValidatorUpdateIsValid(); 
} 
+0

雖然這並沒有給出上述問題的直接答案,但它解決了Datepicker-IE的另一個問題:) – Raghav 2011-09-16 05:10:41

4

我解決這個問題有一個補丁:

window.ValidatorHookupEvent = function(control, eventType, body) { 
     $(control).bind(eventType.slice(2), new Function("event", body)); 
    }; 

更新:我已經提交的問題MS(link)。

相關問題