2011-03-01 58 views
1

我試圖找到一個動態生成的ID ajax.net extender元素。我試圖連接一個事件處理程序來關閉所有ajax.net模式彈出式窗口,當'escape'被按下時。我很困惑,爲什麼這些作品之一,而不是。jQuery .find(selector)遇到麻煩時,選擇ajax.net元素

$find('ctl00_MainContent_ucUserControl1_mpePopup'); //returns the element 
$find('[id="ctl00_MainContent_ucUserControl1_mpePopup"]'); //returns null 

的最終目標是能夠找到的元素,而不硬接線標識加入選擇:

$find('[id$="_mpePopup"]'); //return all elements that end with "_mpePopup" 
+0

只是FYI:'$ find'是MS AJAX中的一個快捷方式;不是jQuery。 – kbrimington 2011-03-01 03:33:04

回答

0

我相信你會發現$find操作需要一個ID。除非我大錯特錯,否則其中沒有模式匹配功能。 (有關$find$get更多信息,請參閱http://mattberseth.com/blog/2007/08/the_everuseful_get_and_find_as.html

你可能會考慮填充一個JavaScript變量與已知彈出客戶端ID,利用不斷有幫助<%= mpePopup.ClientID %>頁文字的綁定語法或一些其他方法方便您的情況。下面是ASPX標記,其中mpePopup是頁面類的成員的一個簡單的例子:

<script type="text/javascript"> 
    function closePopup() { 
     var mpePopupID = '<%= mpePopup.ClientID %>'; 
     var mpePopupBehavior = $find(mpePopupID); 
     // ... 
    } 
</script> 
+0

想象一下,許多用戶控件(每個都帶有模式彈出式擴展器)都被添加到同一個文檔中。這個想法是編寫一個單一的事件處理程序,它可以在文檔級別關閉所有打開的模式彈出窗口,而不是每個用戶控件的一個處理程序。我想我可以將用戶控件中解析的ClientID添加到全局列表變量,並在文檔級別遍歷它。.... http://api.jquery.com/find/上的文檔建議(對我)標準jQuery選擇器應該可以工作。 – GabeFC 2011-03-02 14:56:38

+0

@Gabe - 請注意,jQuery'.find()'方法和MS AJAX'$ find'快捷方式是非常不同的東西。 jQuery方法返回一個圍繞DOM元素的jQuery包裝器,而MS AJAX方法找到一個JavaScript組件(「行爲」)。也就是說,將客戶端ID添加到您可以在客戶端上迭代的JavaScript數組是一種關閉彈出窗口的可行策略。我期望從上面提供的代碼中獲得解決方案是相當可行的。 – kbrimington 2011-03-02 19:38:29

+0

@加貝:啊哈。我看到你的發佈解決方案。這是一個聰明的方法。布拉沃。 – kbrimington 2011-03-02 19:39:53

1

我現在看到有$之間的差異發現和.find()。我沒有意識到這一點,但是一旦提到$ find()是一個MS Ajax快捷方式,我更深入地研究了一下將jQuery與MS Ajax結合在一起的解決方案。

var popups = $.grep(Sys.Application.getComponents(), 
       function (elem, index) { 
        return $(elem).attr('_name') == 'ModalPopupBehavior'; 
       } 
      ); 
$(popups).each(function() { this.hide(); }); 

問題是$ find(id)只是返回Sys.Application._components [id]處的元素。 'id'在這種情況下是索引,所以你不能使用部分字符串或模式。

一旦您將該集合轉換爲數組,但您可以使用jQuery.grep()返回滿足某些條件的元素數組(在這種情況下,我注意到'_name'更容易使用一個屬性選擇器)並用jQuery.each()遍歷它們。