如何从插件内部访问查询中给出的上下文?

时间:2014-08-29 14:35:27

标签: javascript jquery iframe plugins jquery-plugins

可以执行以下操作:

$(selector, context)

$.fn.pluginX如何找出给定的上下文是什么?例如:

$(selector, context).pluginX()

我的情况是第三方插件假定窗口/文档是当前的。


编辑:

我假设文档是由" context"表示的,但它并不总是我猜的文档。在我的情况下,我正在处理像$(sel, iframe.contentDocument).pluginX()这样的跨文档内容,我想确保如果插件执行$('body').append,那么它应该$('body', theSameDocumentContext).append。希望有所帮助。

2 个答案:

答案 0 :(得分:1)

jQuery元素具有.context属性。您可以在插件中使用它:

$.fn.pluginX = function(){
    console.log(this.context);
}

但这不可靠,变种太多了。上下文的值始终为document,除非您传递HTMLElement(就像那样):

$('p', document.getElementsByTagName('div')[0]);

但你可以传递不同的背景:

//All working :
$('p', document.getElementsByTagName('div'));
$('p', document.querySelector('div'));
$('p', document.querySelectorAll('div'));
$('p', document.getElementByID('id'));
$('p', 'div');
$('p', $('div'));
$('p', $('div').add('p'));
///... ran out of ideas

现在,重要的是要知道传递上下文是exactly the same has doing .find()

$('p', 'div') === $('div').find('p');

此外,jQuery总是在链接时存储以前的jQuery对象。如果是初始调用(不使用遍历方法),则前一个对象将是文档。

了解这些信息,如果您想获得“真实”上下文,您可以获得最后一个元素。 jQuery具有属性.prevObject。使用它:

$.fn.pluginX = function(){
    console.log(this.prevObject);
}

答案 1 :(得分:0)

$(选择器,上下文)与$('上下文选择器')相同,你可以通过this.selector获取它,但是对于链式选择器来说这可能很棘手。

例如:

$('.articles', '.section').pluginX()
//within the pluginX  plugin function definition you can call this.selector

$.fn.pluginX = function(){
    ...
    //this.selector = '.section .articles';
    //this.selector.split(' ')[0] = '.section' //scope
    ...
}

但如果我们有

,上述计算将失败
$('.articles .writer', '.section').pluginX();

$('.writer', '.section .articles').pluginX();

如果您对选择器或上下文有一些假设,那么它可以帮助您起草逻辑。让我知道这可以帮助您,或者您可以详细说明您的具体要求,我们可以尝试找到解决方案。