Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为所有jQuery选择器插入前缀?_Javascript_Jquery - Fatal编程技术网

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

Javascript 如何为所有jQuery选择器插入前缀?,javascript,jquery,Javascript,Jquery,我需要扩展的主jQuery函数在任何选择器传递给它之前插入前缀 比如说 jQuery.prefix = '#newBody '; jQuery('.content') 就跟 jQuery('#newBody .content') 我试着运行这个代码 window.oldJquery = jQuery; window.jQuery = window.$ = function( selector, context) { console.log('+',selector); ret

我需要扩展的主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')

这两种方法都将为您的搜索提供正确的上下文。

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

var $$ = getSelector = function(){
    return '#id ' + s;
};
您可以将选择器作为第一个参数传递给
getSelector
函数调用,而不是将选择器作为简单字符串传递给jQuery:

$($$('.some-class'))
也就是说

$('#id .some-class')

一两周前我也遇到过类似的问题。结果证明我做的很乏味,但效果很好。很容易验证它是否正确完成

将有如下代码:

$(something)...
您可能使用了jQuery而不是$。无论哪种方式,你都必须搜索它。没办法。如果修改jQuery本身,就可以使其正常工作。JavascriptMVC在他们的控制器中实现了这一点。我怀疑他们花了很长时间来调试和验证它是否工作并且没有损坏任何东西

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

var $prefix = $('#newBody ');
在您找到它的每个地方,将其替换为以下代码:

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

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

$prefix.find(something)...
我重复一遍,它对我很有效,调试起来并不困难。另外,它没有打乱任何其他jQuery调用


中有一些关于这种形式的jQuery选择器的评论,这是个坏主意。你想解决什么问题?你太懒了,在这个过程中,jQuery无法使用……我有很多行代码,我想强制所有jQuery选择器只从特殊的tag@Xakki显然这是个坏主意。。。花点时间做些真正的工作。一个简单的CTRL+F甚至可以帮你做到这一点。但请查看我文章中的最后一个片段,看看这听起来是否像正则表达式的工作!这不是我所遇到的。最后,我需要扩展jQuery函数,如果我不能重新定义jQuery,这将无法实现他的(选择不当的)目标。
(\$\([^\)]+)\)
\1, \$prefix\)
$prefix.find(something)...