【问题标题】:How to access context given in query from inside plugin?如何从插件内部访问查询中给出的上下文?
【发布时间】:2014-08-29 14:35:26
【问题描述】:

可以执行以下操作:

$(selector, context)

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

$(selector, context).pluginX()

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


编辑:

我假设文档是指“上下文”,但我猜它并不总是文档。就我而言,我正在做像$(sel, iframe.contentDocument).pluginX() 这样的跨文档工作,我想确保如果插件执行$('body').append,那么它应该执行$('body', theSameDocumentContext).append。希望对您有所帮助。

【问题讨论】:

  • 不检查上下文,检查.prevObject
  • @Karl-AndréGagnon 你能进一步解释一下吗?
  • 看我的回答。希望对您有所帮助。
  • 为什么需要上下文?可能有一种更好的方法可以做到这一点,不需要以这种方式检索上下文。
  • @AdamLynch 跨文档是否附加了自己的 jQuery 版本?如果他们这样做了,解决方案可能就像获取对该 jQuery 实例对象而不是根对象的引用一样简单。使用 jQuery 处理跨文档可能很困难,例如,事件冒泡不会总是按预期工作。

标签: javascript jquery iframe plugins jquery-plugins


【解决方案1】:

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

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

但是这个不靠谱,变种太多了。 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);
}

【讨论】:

  • 没关系,this.prevObject.get(0).ownerDocument 将完成这项工作(或者 this.prevObject.get(0) 如果它已经是一个文档。
【解决方案2】:

$(selector, context) 与 $('context selector') 相同,您可以通过 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();

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

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多