来自http://www.erichynds.com/blog/tips-for-developing-jquery-ui-widgets
方法三:小部件伪选择器
在#jquery IRC 频道中,yayQuery 成名的 Adam Sontag 注意到小部件工厂的一个未记录的特性:为所有小部件自动生成伪选择器。有了这个,查询特定类型的所有小部件的 DOM 非常简单:
// gimme all dialogs
$(":ui-dialog");
上面的选择器返回创建每个实例的 DOM 元素的对象。无需维护自己的缓存或将 DOM 元素存储在每个小部件中。使用这个伪选择器关闭所有其他打开的对话框实例很简单:
// ui.dialog.js
open: function(){
// close all open dialogs, excluding this instance
$(":ui-dialog").not(this.element).each(function(){
var $this = $(this);
if($this.dialog("isOpen")){
$this.dialog("close");
}
});
// rest of open code here
}
我已经在此页面的控制台中测试了两个选择器:http: //jqueryui.com/resources/demos/dialog/default.html
$('.ui-dialog')
[
<div class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-front ui-draggable ui-resizable" tabindex="-1" role="dialog" aria-describedby="dialog" aria-labelledby="ui-id-1" style="position: absolute; height: auto; width: 300px; top: 341.5px; left: 711px; display: block;">
<div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix">…</div>
<div id="dialog" class="ui-dialog-content ui-widget-content" style="width: auto; min-height: 107px; max-height: none; height: auto;">…</div>
<div class="ui-resizable-handle ui-resizable-n" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-e" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-s" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-w" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-sw" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-ne" style="z-index: 90;"></div>
<div class="ui-resizable-handle ui-resizable-nw" style="z-index: 90;"></div>
</div>
]
-
$(':ui-dialog')
[
<div id="dialog" class="ui-dialog-content ui-widget-content" style="width: auto; min-height: 107px; max-height: none; height: auto;">
<p>…</p>
</div>
]
因此 .ui-dialog 选择整个对话框元素,而 :ui-widget 仅选择允许您调用对话框方法的对话框小部件。