Javascript 我是否可以复制$,以便它在创建jQuery对象时始终使用上下文?
我需要将我构建的一个小画布应用程序整合到一个巨大的Sharepoint网站中,在那里我无法控制任何事情。应用程序将进入“Web部件”包装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
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
看起来很聪明!我自己应该想到的。我在你发布这篇文章后马上编辑了它,每个都包含美元,但是你会破坏我的帖子上说的其他东西。