Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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 我可以提供默认值吗;上下文“;到jQuery?_Javascript_Jquery_Iframe - Fatal编程技术网

Javascript 我可以提供默认值吗;上下文“;到jQuery?

Javascript 我可以提供默认值吗;上下文“;到jQuery?,javascript,jquery,iframe,Javascript,Jquery,Iframe,背景: 可以提供jQuery选择器调用的第二个“context”参数(例如:jQuery(选择器,上下文)),为选择器引擎提供一个下降起点 如果需要控制IFRAME(在同一域中)中的内容,这通常很有用。只需将iframe.contentWindow.document作为“context”参数传递 如果任何JavaScript代码加载到使用jQuery的IFRAME中,并从外部窗口的范围调用,那么该代码中对$或jQuery的任何引用实际上都将是外部窗口中的jQuery的实例 当IFRAME(比如B

背景:

可以提供jQuery选择器调用的第二个“context”参数(例如:
jQuery(选择器,上下文)
),为选择器引擎提供一个下降起点

如果需要控制IFRAME(在同一域中)中的内容,这通常很有用。只需将
iframe.contentWindow.document
作为“context”参数传递

如果任何JavaScript代码加载到使用jQuery的IFRAME中,并从外部窗口的范围调用,那么该代码中对
$
jQuery
的任何引用实际上都将是外部窗口中的
jQuery
的实例

当IFRAME(比如Bootstrap.js)中的JavaScript代码执行类似于
$(document)
(或者执行没有“context”参数的其他选择器)的操作时,问题就出现了。当从外部窗口调用该代码(在iframe中定义)时,
document
引用外部窗口中的HTMLDocument元素-这通常不是期望的结果

问题:

如果能够创建一个具有默认“context”参数的jQuery的词汇范围的副本/包装器(由创建它的人提供),那将非常有用

例如:

// jQuery already exists out here
var iframe = document.createElement('IFRAME');
iframe.addEventListener('DOMContentLoaded', function(){

    // code in here can already refer to $ for 'outer' jQuery

    // code in here can refer to $local for 'inner' jQuery by virtue of...
    var $local = jQueryWithContext($, iframe.contentWindow.document);

    // code loaded with IFRAME will use $local by virtue of ...
    iframe.contentWindow.jQuery = iframe.contentWindow.$ = $local;

});
iframe.src = '/path/to/iframe/content.html';
问题是,是否可以编写类似上面的
jQueryWithContext
之类的东西

为什么?

有时,您希望隔离第三方HTML组件,而这些组件(虽然您从安全角度信任它们)从CSS/JavaScript角度来看是错误的

js就是一个很好的例子。它调用
$(document)
,并执行其他类似的无上下文选择器调用。如果jQuery可以按照我描述的方式重新定义范围,那么这个“非最佳”编写的库可以很容易地被隔离


此外,从两个框架中使用相同的
$.data(el,…)
集合非常有用,如果没有一些上下文管理,这是非常棘手的。

实际上,这相当简单:

function jQueryWithContext( selector, context ) {
  // I added the possibility to overwrite the context here, but you could delete
  return $( selector, context || iframe.contentWindow.document );
}
jQueryWithContext( '#main' ).show();
但要将其强制应用于插件,您可能需要这样做:

jQuery.noConflict(); // keep the real jQuery for now
$ = function( selector, context ){
  return new jQuery.fn.init( selector, context || iframe.contentWindow.document );
};
$.fn = $.prototype = jQuery.fn;
jQuery.extend( $, jQuery ); // copy static method
// Then override default jQuery
jQuery = $;

这是一种工作,但它可能会破坏
$()
的一些用法(现在可能不会,但在未来的jQuery版本中,或者任何时候出现
上下文
参数都可能破坏正常行为)。

为什么iframe不加载jQuery本身并使用自己的jQuery对象呢?当然可以。但是,您需要在两个窗口中创建双向管道,以便来回调用。这使得简单地对现有HTML+JS内容进行分帧变得更加困难。另外,$.data对于每个jQuery实例都是不同的,这可能不是理想的.Hm。那么,是内部框架使用外部框架的jQuery,还是外部框架使用内部框架的jQuery?若然,原因为何?显式交互API在这里似乎更合适,因为它不那么脆弱(不假定其他页面有jQuery或其DOM正是我们所期望的),通常对其他开发人员更具可读性,并且完全避免了这些问题。(当然,这是我掌握的有限信息…)使用外部框架的jQuery的内部框架(如果存在,则覆盖内部框架的jQuery)。所有关于脆弱性的观点都非常好,等等。我想有时候我只是想“分帧”一些内容,而不想太多。:-)如果我真的需要像样的双向编排,我总是可以编写它,但我不喜欢在默认情况下付出代价-/jQuery还有许多其他方法,您可以使用$.something(而不是选择器调用)调用它们。如果这些方法在没有内容的情况下(内部)进行选择器调用,那么这可能是一种有限的方法。您认为可能是这种情况吗?这就是为什么我将函数重命名为非
$
,以便实际代码不会中断的原因。但您希望强制此默认上下文为
$
;那么插件会无缝地使用它吗?是的(对于插件)。我想我真正的问题是,jQuery是否从非选择器方法内部进行选择器调用?如果是的话,这些也需要修补。@David SkyMesh:如果是的话,那么我想只相对于当前选择,所以这些应该不是问题。我添加了一个在我看来似乎是覆盖默认jQuery的解决方案。(未彻底测试)