- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我写了很多 jQuery 插件并且有我一直使用的自定义 jQuery 选择器,比如 :focusable
和 :closeto
提供常用的过滤器。
例如:focusable 看起来像这样
jQuery.extend(jQuery.expr[':'], {
focusable: function (el, index, selector) {
return $(el).is('a, button, :input[type!=hidden], [tabindex]');
};
});
并且像任何其他选择器一样使用:
$(':focusable').css('color', 'red'); // color all focusable elements red
我注意到没有可用的 jQuery 选择器可以导航回祖先。我认为这是因为它们旨在遵循向下钻取的基本 CSS 选择器规则。
以这个例子为例:找到具有焦点的输入的标签:
$('input:focus').closest('.form-group').find('.label');
我需要用于插件的等效类型的复杂选择器,因此将这样的选择器提供为单个字符串会很有用(因此它们可以作为插件的选项提供)。 p>
例如类似于:
$('input:focus < .form-group .label');
或
$('input:focus:closest(.form-group) .label');
注意:请假设更复杂的操作并且需要祖先导航(我意识到这个特定的例子可以用 has
完成,但这没有帮助)。
例如它还需要支持这一点:
options.selector = ':closest(".form-group") .label';
$('input').click(function(){
var label = $(this).find(options.selector);
});
是否可以扩展 jQuery 选择器来扩展搜索行为(而不仅仅是添加更多 bool 过滤器)?您如何扩展自定义搜索行为?
看来一个完整的自定义选择器(如 <
)不像向 jQuery 的 Sizzle 解析器添加一个伪选择器那么容易。我目前正在看这个 Sizzle documentation ,但我发现与 jQuery 版本不一致。 (例如,运行时不存在 Sizzle.selectors.order
属性)。
作为引用,jQuery 存储 Sizzle
在其 jQuery.find
属性(property)和Sizzle.selectors
在其 jQuery.expr
属性(property)。
到目前为止我已经添加了这个:
jQuery.expr.match.closest = /^:(?:closest)$/;
jQuery.expr.find.closest = function (match, context, isXML){
console.log("jQuery.expr.find.closest");
};
并用一个简单的测试调用它:http://jsfiddle.net/z3vwk1ko/2/
但它永远不会到达 console.log 语句,我仍然得到 "Syntax error, unrecognized expression: unsupported pseudo: closest"
.在 jQuery 内部跟踪时,它试图将其应用为 filter
而不是 find
,所以我遗漏了一些关键部分。
选择器的处理从右到左(参见下面 jQuery 1.11.1 的摘录)所以如果上下文中不存在最后一个参数,它会提前中止。这意味着在我们想要在祖先的另一个 DOM 分支中查找元素的常见情况下,当前的 jQuery Sizzle 代码不会发生向上导航:
// Fetch a seed set for right-to-left matching
i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
while (i--) {
token = tokens[i];
// Abort if we hit a combinator
if (Expr.relative[(type = token.type)]) {
break;
}
if ((find = Expr.find[type])) {
// Search, expanding context for leading sibling combinators
if ((seed = find(
token.matches[0].replace(runescape, funescape),
rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
))) {
// If seed is empty or no tokens remain, we can return early
tokens.splice(i, 1);
selector = seed.length && toSelector(tokens);
if (!selector) {
push.apply(results, seed);
return results;
}
break;
}
}
}
看到这个我很惊讶,但现在意识到它使规则引擎更容易编写。但是,这确实意味着我们需要确保选择器的右端尽可能具体,因为它首先被评估。之后发生的一切都只是结果集的渐进 trim (我一直认为选择器中的第一项必须更具体以提高效率)。
最佳答案
基于大量评论,以及关于为什么这是不可能的的详细解释,我想到我想要的目标可以通过 $(document).find()
来实现。 ,但有一些目标元素的概念。也就是说,在选择器中以某种方式定位原始查询元素。
为此,我想到了以下内容,一个 :this
选择器,它是这样工作的(没有双关语意):
// Find all labels under .level3 classes that have the .starthere class beneath them
$('.starthere').findThis('.level3:has(:this) .label')
这让我们现在可以有效地向上搜索 DOM,然后向下搜索单个选择器字符串中的相邻分支!即它做的工作与此相同(但在单个选择器中):
$('.starthere').parents('.level3').find('.label')
1 - 添加一个新的 jQuery.findThis
方法
2 - 如果选择器有 :this
, 替换 id 搜索并从 document
搜索相反
3 - 如果选择器不包含 :this
通常使用原来的过程 find
4 - 使用像 $('.target').find('.ancestor:has(:this) .label')
这样的选择器进行测试在目标元素的祖先中选择一个标签
这是基于评论的修订版本,它不会替换现有的查找内容并使用生成的唯一 ID。
// Add findThis method to jQuery (with a custom :this check)
jQuery.fn.findThis = function (selector) {
// If we have a :this selector
if (selector.indexOf(':this') > 0) {
var ret = $();
for (var i = 0; i < this.length; i++) {
var el = this[i];
var id = el.id;
// If not id already, put in a temp (unique) id
el.id = 'id'+ new Date().getTime();
var selector2 = selector.replace(':this', '#' + el.id);
ret = ret.add(jQuery(selector2, document));
// restore any original id
el.id = id;
}
ret.selector = selector;
return ret;
}
// do a normal find instead
return this.find(selector);
}
// Test case
$(function () {
$('.starthere').findThis('.level3:has(:this) .label').css({
color: 'red'
});
});
已知问题:
这会留下一个空白 id
没有 id
的目标元素的属性开头的属性(这没有问题,但不像我想要的那样整洁)
由于它必须从文档中搜索的方式,它只能模拟 parents()
而不是 closest()
, 但我觉得我可以使用类似的方法并添加 :closest()
此代码的伪选择器。
第一个版本如下:
1 - 保存 jQuery 的 find
引用方法
2 - 替换为新的 jQuery.find
方法
3 - 如果选择器有 :this
, 替换 id 搜索并从 document
搜索相反
4 - 如果选择器不包含 :this
通常使用原来的过程 find
5 - 使用像 $('.target').find('.ancestor:has(:this)')
这样的选择器进行测试选择目标元素的祖先
// Save the original jQuery find we are replacing
jQuery.fn.findorig = jQuery.fn.find
// Replace jQuery find with a custom :this hook
jQuery.fn.find = function (selector) {
// If we have a :this selector
if (selector.indexOf(':this') > 0) {
var self = this;
var ret = $();
for (var i = 0; i < this.length; i++) {
// Save any existing id on the targetted element
var id = self[i].id;
if (!id) {
// If not id already, put in a temp (unique) one
self[i].id = 'findme123';
}
var selector2 = selector.replace(':this', '#findme123');
ret = ret.add(jQuery(selector2, document));
// restore any original id
self[i].id = id;
}
ret.selector = selector;
return ret;
}
return this.findorig(selector);
}
// Test case
$(function () {
$('.starthere').find('.level3:has(:this)').css({
color: 'red'
});
});
这是基于 6 小时的 jQuery/Sizzle 源代码苦读,所以要温柔。总是很高兴听到改进此替代品的方法 find
因为我是 jQuery 内部的新手 :)
现在意味着我可以解决如何做原始标签示例的初始问题:
options.selector = ".form-group:has(:this) .label";
$('input').click(function(){
var label = $(this).find(options.selector);
});
关于javascript - 是否可以创建导航祖先的自定义 jQuery 选择器?例如:closest or :parents selector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25721390/
如果我需要选择第 10 个父级,是否有更简洁的方法,然后重复 .parent() 10 次? $('#element_id').parent().parent().parent().parent().
从 angularJS 指南中的“如何创建通信指令”开始,https://docs.angularjs.org/guide/directive , 我正在尝试使用该布局来制作可导航的表单。 问题在于指
我有一个 jQuery 函数,需要获取元素父元素的位置。 它看起来像: function show(e) { //debugger; var nextTab
我正在尝试修复这个难看的代码。 RadGrid gv = (RadGrid) (((Control) e.CommandSource).Parent.Parent.Parent.Parent.Pare
我有一个 A 标签,可以触发它的曾曾曾祖 parent 的动画。以下所有方法都可以,但哪一个最有效,为什么? $(this).parent().parent().parent().parent().p
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在尝试定位绝对定位的 div 时遇到了一些问题。我猜它的工作方式应该是这样,但是我希望它与父对象的父对象而不是父对象一起使用,因为我有一个下拉列表,当我希望它像第一个一样保持在顶部时,它会跟随父对象
我正在做一些非常基本的 jQuery 东西,真正开始,我经常通过做类似的事情来向上导航 dom $(this).parent().parent().addClass('hello'); 我只是想知道是
此 HTML 结构有一个 div#page,其中当前页面内容将通过 Ajax 加载。内容始终由 section 标记组成,这些标记可以具有动态高度(相对于浏览器的百分比)或静态高度(以像素为单位)。
在 javascript 中是否有一种简单的方法来定位父对象的父对象? 我使用 this.parentNode 作为函数的元素来选择父节点,我尝试了 this.parent.parentNode 和
当遍历 pager.Pages 对象的 foreach 循环时,$data 是 self(正如预期的那样)。但是,$parent 应该是寻呼机对象,但它返回的是 WaterQualityResultV
在架构中,我想根据父级的 sibling 调整架构。 例如:如果 toggleMonday 为真,那么 weekdays -> monday 应该有一个特定的验证模式。 现在下面的例子有效。但是,它非
我想要完成的是,当用户将焦点放在文本框上时,其中的字段集将添加一个类“active_fieldset”,以便提供用户在表单中的位置的良好视觉提示。使用以下 javascript,它确实会影响父字段集,
我创建了这个函数来保存我的taches sauverTache(tache:Tache){ this.editionEnCours = true; tache.estReelle =
所以..这是我的问题..我有以下代码(示例): var GameObject = function (posX, posY, width, height) { this.posX = posX;
所以,我是 jQuery 的新手,我正在尝试更改关于函数触发器的 2 个级别的 div: 这是我的第一次尝试:我尝试找到最接近的“.node”,它是所有其他 div 的父级并编辑子 div。 fun
我想了解为什么使用 ng-repeat在repeat 的item 上有某个controller,那个item 的parent 和那个item 的祖父是同一个controller。我期待祖父成为父 Co
我想从我的组件 Controller 之一将 jsonModel 设置为我的 SAPUI5 组件。在组件内,我使用应用程序或 splitapp。 我想避免通过 ID 获取元素。从组件内的某个位置获取层
我不确定如何在标题上准确地表达出来,因为问题在我的场景中太具体了,但无论如何基本上我有两个类似于下面的外部类: class Config { public level: number = 1;
在我正在编写的这个脚本中,我发现自己连续使用 .parent() 最多七次来获取元素。虽然这有效,但似乎可以/应该有一种更简单的方法来完成我不知道的这个/功能。除了更多元素上更具体的类/ID 之外,还
我是一名优秀的程序员,十分优秀!