Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.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 如何从插件内部访问查询中给定的上下文?_Javascript_Jquery_Iframe_Plugins_Jquery Plugins - Fatal编程技术网

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

Javascript 如何从插件内部访问查询中给定的上下文?,javascript,jquery,iframe,plugins,jquery-plugins,Javascript,Jquery,Iframe,Plugins,Jquery Plugins,可以执行以下操作: $(selector, context) 但是$.fn.pluginX如何找出给定的上下文是什么?例如: $(selector, context).pluginX() $('.articles', '.section').pluginX() //within the pluginX plugin function definition you can call this.selector $.fn.pluginX = function(){ ... /

可以执行以下操作:

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

$(selector, context).pluginX()
$('.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
    ...
}

我有一个例子,第三方插件假定窗口/文档是当前窗口/文档


编辑:
我假设文档的意思是“上下文”,但我猜它并不总是文档。在我的例子中,我正在做跨文档的事情,比如
$(sel,iframe.contentDocument).pluginX()
,我想确保如果插件做
$('body').append
,那么它应该做
$('body',sameDocumentContext.).append
。希望有帮助。

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

$.fn.pluginX = function(){
    console.log(this.context);
}
但这是不可靠的,有太多的变种。上下文的值将始终为
document
,除非您传递
HTMLElement
(如下所示):

但您可以传递不同的上下文:

//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
现在,重要的是要知道传递上下文是:

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

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

$.fn.pluginX = function(){
    console.log(this.prevObject);
}
$(selector,context)与$('context selector')相同,您可以通过这个.selector获得它,但是对于链式选择器来说,这可能很棘手

例如:

$(selector, context).pluginX()
$('.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();


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

不要检查上下文,检查
.prevObject
@Karl AndréGagnon你能进一步解释吗?看我的答案。希望能有帮助。你为什么需要上下文?可能有一种更好的方法,不需要以这种方式检索上下文。@AdamLynch跨文档是否附加了自己版本的jQuery?如果他们这样做了,那么解决方案可能非常简单,只需获得对该jQuery实例对象的引用,而不是根对象的引用。使用jQuery跨文档工作可能会很困难,例如,事件冒泡并不总是像预期的那样工作。无论如何,
this.prevObject.get(0)。ownerDocument
将完成此工作(或者
this.prevObject.get(0)
,如果它已经是一个文档。
$('.writer', '.section .articles').pluginX();