0

我需要扩展的主 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 对象。

**

无需更改当前代码

**

4

7 回答 7

4

我不知道 jQuery 中有这样的功能,但你可以使用find

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

您可以将它包装在一个函数中并调用该函数:

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

用法:

my$('.content');
于 2012-12-27T16:03:32.237 回答
2

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

例子:

var prefix = '#newBody';

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

然后你会打电话jqPrefix('.content')而不是jQuery('.content').

于 2012-12-27T16:04:09.617 回答
1

有几种方法可以做到这一点而不会造成破坏(就像你现在一样)。一种方法如下:

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

另一种方式,可能会消耗更多资源,但仍然是非破坏性的,如下所示。

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

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

编辑:如果您想替换 alljQuery以使它们成为特定元素的唯一子级,您可以尝试以下操作。本质上,我们正在做的是创建一个新范围并将jQuery变量重新定义为$Prefix(来自之前的代码片段),这样您就不需要重写所有内容。

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

(function(jQuery){

}($Prefix));
于 2012-12-27T16:05:47.257 回答
1

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

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

其中任何一个都将为您的搜索提供正确的上下文。

于 2012-12-27T16:13:53.673 回答
0

一两个星期前我遇到了同样的问题。我所做的结果很乏味,但工作得很好。很容易验证它是否正确完成。

会有如下代码:

$(something)...

你可能使用了 jQuery 而不是 $. 无论哪种方式,您都必须搜索它。没有办法解决它。如果你修改 jQuery 本身,你可以让它工作。JavascriptMVC 在他们的控制器中做到了。我怀疑他们花了很长时间来调试并验证它是否有效并且没有破坏任何东西。

在开头的某个地方放一些这样的代码:

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

在您找到它的每个地方,将其替换为以下代码:

$(something, $prefix)...

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

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

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

$prefix.find(something)...

它对我有用,我再说一遍,调试起来并不难。另外,它没有搞砸任何其他 jQuery 调用。

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

于 2012-12-27T17:16:30.600 回答
0

你可以使用$.extend

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

请参阅示例

于 2012-12-27T16:05:16.950 回答
0

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

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

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

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

这转化为

$('#id .some-class')
于 2012-12-27T16:17:27.347 回答