背景:
jQuery 选择器调用的第二个“上下文”参数(例如:jQuery(selector, context)
)可以为选择器引擎提供一个下降的起点。
如果您需要控制 IFRAME(同一域中)中的内容,这通常很有用。你只需通过iframe.contentWindow.document
作为“上下文”参数。
如果任何 JavaScript 代码加载到使用 jQuery 的 IFRAME 中,并且是从外部窗口的范围调用,然后任何引用$
or jQuery
该代码实际上是实例jQuery
从外窗。
当 IFRAME 中的 JavaScript 代码(例如 Bootstrap.js)执行类似操作时,问题就出现了$(document)
(或者没有“上下文”参数的其他选择器)。当从外部窗口调用该代码(在 iframe 内定义)时,document
引用外部窗口中的 HTMLDocument 元素 - 这通常不是期望的结果。
问题:
如果能够创建一个 jQuery 的词法范围副本/包装器,它具有默认的“上下文”参数(由创建它的人提供),那将非常有用。
Example:
// 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
above?
Why?
有时您想要隔离第 3 方 HTML 组件,这些组件(虽然您从安全角度信任它们)从 CSS / JavaScript 污染角度来看行为不当。
Bootstrap.js 就是一个很好的例子。它调用$(document)
相当多,并且执行其他类似的无上下文选择器调用。如果 jQuery 可以按照我描述的方式重新定义范围,那么可以很容易地隔离这个“不是最佳”编写的库。
此外,使用相同的方法会非常有帮助$.data(el, ...)
从两个框架收集,如果没有一些上下文管理,这是相当棘手的。