繁体   English   中英

如何为所有jQuery选择器插入前缀?

[英]How can I insert a prefix for all jQuery selectors?

我需要扩展的主要jQuery函数在将任何选择器传递给它之前插入前缀。

例如

jQuery.prefix = '#newBody ';
jQuery('.content')

将与

jQuery('#newBody .content')

我尝试运行此代码

window.oldJquery = jQuery;
window.jQuery = window.$ = function( selector, context) {
    console.log('+',selector);
    return oldJquery(selector, context );
}

但是我最后一个jQuery对象。

**

当前代码无变化

**

我不知道jQuery中的功能,但是您可以使用find

jQuery('#newBody').find('.content')

您可以将其包装在一个函数中,然后也调用该函数:

function my$(selector) {
  return jQuery('#newBody').find(selector);
}

用法:

my$('.content');

我建议创建一个包装方法。 只需创建一个接受选择器的小方法,然后将前缀和选择器传递给jQuery并返回结果。

例:

var prefix = '#newBody';

function jqPrefix(selector)
{
  return jQuery(prefix + ' ' + selector);
}

然后,您将调用jqPrefix('.content')而不是jQuery('.content')

您可以通过几种方式来做到这一点而不会造成破坏(如您目前所想)。 一种方式如下所示:

var $prefix = jQuery('#newBody');
$prefix.find('.content');

另一种方式,可能会消耗更多的资源,但仍会保持无损,如下所示。

var $Prefix = function(selectors) {
    return jQuery("#newBody " + selectors);
};

$Prefix(".content"); //jQuery("#newBody .content");

编辑:如果要替换所有jQuery ,以便它们只是特定元素的子代,则可以尝试以下操作。 本质上,我们正在做的是创建一个新的作用域,并将jQuery变量重新定义为$Prefix (来自上一个代码片段),因此您无需重写所有内容。

var $Prefix = function(selectors) {
    return jQuery("#newBody " + selectors);
};

(function(jQuery){

}($Prefix));

应该做的就是更新代码。 您可以使用正则表达式进行查找/替换,如下所示:

find: /\$\('(.*?)'\)/ig
replace: $('#newSelector \1') OR $('\1', '#newSelector')

两者都会为您的搜索提供正确的上下文。

您可以使用$ .extend

$.extend($.expr['#'],{
    newBody: function(a) {
        return true;
    }
});

参见示例

最简单,最安全和...好吧,聪明的方法是使用包装器实现所需的功能,而不是覆盖jQuery。
如其他答案所述,您可以制作一个将前缀添加到当前选择器的包装器(例如jqPrefix ),或者可以为选择器本身制作一个包装器:

var $$ = getSelector = function(){
    return '#id ' + s;
};

而不是将thet选择器作为简单字符串传递给jQuery,您可以传递以选择器作为第一个参数的getSelector函数调用:

$($$('.some-class'))

转化为

$('#id .some-class')

我在一两周前遇到过同样的问题。 原来我的工作很乏味,但效果很好。 验证它是否正确很容易。

将有如下代码:

$(something)...

您可能使用了jQuery而不是$。 无论哪种方式,您都必须搜索它。 没办法。 如果您修改jQuery本身,则可以使其正常工作。 JavascriptMVC是在其Controller中完成的。 我怀疑他们花了很长时间调试并验证它是否有效并且没有破坏任何东西。

首先将这样的代码放在某个地方:

var $prefix = $('#newBody ');

在找到它的每个位置,将其替换为以下代码:

$(something, $prefix)...

请注意,您所做的只是在编辑器中插入或粘贴文本,这非常快,尤其是当您的编辑器能够搜索结束括号并将光标留在其前面时。 在Eclipse中,可以将搜索和替换字符串与正则表达式一起使用。 它们就是这些(替换字符串中的逗号后有空格)。

(\$\([^\)]+)\)
\1, \$prefix\)

请注意,在内部(在最新的jQuery版本中)这完全像:

$prefix.find(something)...

它对我有用,我重复一遍,调试起来不是很困难。 另外,它没有弄乱任何其他jQuery调用。

这个StackOverflow问题中有一些关于这种形式的jQuery选择器的评论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM