【问题标题】:jQuery .find(selector) troubles when selecting ajax.net element选择 ajax.net 元素时 jQuery .find(selector) 的麻烦
【发布时间】:2011-03-01 03:09:58
【问题描述】:

我正在尝试查找具有动态生成 ID 的 ajax.net 扩展器元素。我正在尝试连接一个事件处理程序以在按下“转义”时关闭所有 ajax.net 模式弹出窗口。我很困惑为什么其中一种有效而另一种无效。

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

最终目标是能够在不将 ID 硬连接到选择器中的情况下找到元素:

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

【问题讨论】:

  • 仅供参考:$find 是 MS AJAX 中的快捷方式;不是 jQuery。

标签: jquery asp.net ajax.net


【解决方案1】:

我现在看到 $find 和 .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() 遍历它们。

【讨论】:

    【解决方案2】:

    相信您会发现$find 操作需要一个ID。除非我大错特错,否则它没有模式匹配功能。 (有关$find$get 的更多信息,请参阅http://mattberseth.com/blog/2007/08/the_everuseful_get_and_find_as.html

    您可以考虑使用已知的弹出客户端 ID 填充 JavaScript 变量,使用非常有用的 <%= mpePopup.ClientID %> 页面文字绑定语法或其他适合您情况的方法。下面是一个简单的 ASPX 标记示例,其中mpePopup 是页面类的成员:

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

    【讨论】:

    • 想象一个场景,其中许多用户控件,每个都带有模式弹出扩展器,被添加到同一个文档中。这个想法是编写一个事件处理程序,在从文档级别按退出键时关闭任何打开的模式弹出窗口,而不是每个用户控件一个处理程序。我想我可以将在用户控件中解析的 ClientID 添加到全局列表变量并在文档级别对其进行迭代......api.jquery.com/find 的文档建议(对我而言)标准 jQuery 选择器应该可以工作。
    • @Gabe - 请注意 jQuery .find() 方法和 MS AJAX $find 快捷方式是非常不同的东西。 jQuery 方法返回一个围绕 DOM 元素的 jQuery 包装器,而 MS AJAX 方法查找单个 JavaScript 组件(“行为”)。也就是说,将客户端 ID 添加到可以在客户端迭代的 javascript 数组是关闭弹出窗口的一种可行策略。我希望从上面提供的代码中得出解决方案是非常可行的。
    • @Gabe:啊哈。我看到你发布的解决方案。这是一个聪明的方法。太棒了。
    猜你喜欢
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2013-09-02
    • 2011-08-30
    相关资源
    最近更新 更多