Javascript 我是否可以复制$,以便它在创建jQuery对象时始终使用上下文?

Javascript 我是否可以复制$,以便它在创建jQuery对象时始终使用上下文?,javascript,jquery,Javascript,Jquery,我需要将我构建的一个小画布应用程序整合到一个巨大的Sharepoint网站中,在那里我无法控制任何事情。应用程序将进入“Web部件”包装div。为了让我的JS保持整洁,我想我可以克隆一个jQuery版本,它总是使用我的包装器对象作为上下文,这样我就可以确保我永远不会选择和更改包装器之外的任何内容,比如: var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get (function($){ $('p').addCla

我需要将我构建的一个小画布应用程序整合到一个巨大的Sharepoint网站中,在那里我无法控制任何事情。应用程序将进入“Web部件”包装
div
。为了让我的JS保持整洁,我想我可以克隆一个jQuery版本,它总是使用我的包装器对象作为上下文,这样我就可以确保我永远不会选择和更改包装器之外的任何内容,比如:

var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get

(function($){
   $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)
无论如何,我尝试过的事情都没有成功。我尝试使用了
$.proxy
,但没有像我预期的那样工作(因为上下文在这里是另一回事……)

这就是我目前所处的困境:

function getContextifiedjQuery(ctx) {

    var fn = function () {

        return $.call(arguments[0], ctx);
    }

    $.each($, function (k, v) {
        fn[k] = v;
    });

    return fn;

}

var wrapper$ = getContextifiedjQuery('#wrapper');

wrapper$('p').css('color', 'red');
wrapper$.each([1, 2, 3], function () {
    alert(this)
});

这就像一个简单的测试用例,但当我试图在我的项目中使用它时,我得到了循环引用,结果出了问题。我在这里遗漏了什么?

您使用
$(“p”)
所做的基本上是

ctxjQuery('#wrapper-el')('p')
如果你想脱离上下文,那就是

(function($){
   $.find('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)
如果您想编写包装器,它看起来像这样,但它只支持find()。它将压倒一切

function ctxjQuery(context) {
    return function (selector) {
        return $(context).find(selector);
    }
}

var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get

(function ($) {
    $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)

再想想,你可以这样做:

function ctxjQuery(context) {
    var fnc = function(selector){  return $(context).find(selector); };
    var $Fnc = $.extend( fnc, $);
    return $Fnc;    
}

var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get

(function ($) {
    console.log($.each);
    $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)


它会打碎很多东西!!!示例
$(“

”)

将不会创建元素,因为它已用find()重载。基本上,您需要重新创建jQuery核心函数才能获得所有功能

您使用
$(“p”)
所做的基本上是

ctxjQuery('#wrapper-el')('p')
如果你想脱离上下文,那就是

(function($){
   $.find('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)
如果您想编写包装器,它看起来像这样,但它只支持find()。它将压倒一切

function ctxjQuery(context) {
    return function (selector) {
        return $(context).find(selector);
    }
}

var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get

(function ($) {
    $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)

再想想,你可以这样做:

function ctxjQuery(context) {
    var fnc = function(selector){  return $(context).find(selector); };
    var $Fnc = $.extend( fnc, $);
    return $Fnc;    
}

var ctxed$ = ctxjQuery('#wrapper-el'); //this is what I don't get

(function ($) {
    console.log($.each);
    $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$)

它会打碎很多东西!!!示例
$(“

”)

将不会创建元素,因为它已用find()重载。基本上,您需要重新创建jQuery核心函数才能获得所有功能

试试这个

var ctxed$ = function (selector)
{
    return $(selector, '#wrapper-el');
}
(function($){
   $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$);
试试这个

var ctxed$ = function (selector)
{
    return $(selector, '#wrapper-el');
}
(function($){
   $('p').addClass('awesome'); //should only affect elements inside #wrapper-el
})(ctxed$);

感谢您的澄清,但我是否可以将此应用于我不希望更改闭包内代码的情况?@m90更新了我的答案,向您展示了如何使您的想法发挥作用,但它将覆盖所有其他内容。感谢您的编辑,我现在终于得到了您的答案:)找到就可以了,唯一“丢失”的东西将是
$。每个
,我可以像我最初的方法那样复制它吗(在$上迭代并复制内容)?请参阅:
extend
看起来很聪明!我自己应该想到的。我在你发布这篇文章后马上编辑了它,每个都包含美元,但是你会破坏我的文章中说的其他东西。谢谢你的澄清,但我也可以将此应用于我不希望更改闭包内代码的情况吗?@m90更新了我的答案,向您展示了如何使您的想法发挥作用,但它将覆盖所有其他内容。感谢您的编辑,我现在终于得到您的答案:)找到就可以了,唯一“缺少”的是
$。每个
,,我可以像我最初的方法那样复制它吗(迭代$并复制内容)?请参阅:
extend
看起来很聪明!我自己应该想到的。我在你发布这篇文章后马上编辑了它,每个都包含美元,但是你会破坏我的帖子上说的其他东西。