我可以为 jQuery 提供默认的“上下文”吗?

2024-04-20

背景:

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, ...)从两个框架收集,如果没有一些上下文管理,这是相当棘手的。


实际上,这会相当简单:

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 版本中,或者任何时候,有可能出现context参数破坏了正常行为)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以为 jQuery 提供默认的“上下文”吗? 的相关文章

随机推荐