Posso fornecer "contexto" padrão para jQuery?

Fundo:

O segundo argumento de "contexto" para a chamada do seletor do jQuery (por exemplo:jQuery(selector, context)) pode ser fornecido para dar ao motor do seletor um ponto de partida a partir do qual descer.

Isso geralmente é útil se você precisar controlar o conteúdo em um IFRAME (no mesmo domínio). Você simplesmente passaiframe.contentWindow.document como o argumento "contexto".

Se algum código JavaScript é carregado no IFRAME que faz uso de jQuery, e éCHAMADO DO ÂMBITO DA JANELA EXTERNA, então, qualquer referência a$ oujQuery nesse código será realmente a instância dejQuery da janela externa.

O problema surge quando o código JavaScript no IFRAME (digamos Bootstrap.js) faz algo como$(document) (ou faz algum outro seletor sem um argumento "contexto"). Quando esse código (definido dentro do iframe) é chamado a partir da janela externa,document refere-se ao elemento HTMLDocument da janela externa - que geralmente não é o resultado desejado.

Questão:

Seria super útil poder criar um copy / wrapper de jQuery com escopo léxico que tenha um argumento de "contexto" padrão, fornecido por quem quer que o crie.

Exemplo:

// 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';

A questão é, é possível escrever algo comojQueryWithContext acima?

Por quê?

Às vezes você quer isolar componentes HTML de terceiros que (enquanto você confia neles de uma perspectiva de segurança) são mal comportados de uma perspectiva de poluição CSS / JavaScript.

Bootstrap.js é um bom exemplo. Chama$(document) um pouco justo, e faz outras chamadas seletoras sem contexto. Se o jQuery pudesse ser redefinido no escopo da maneira que eu descrevo, então essas bibliotecas 'não otimizadas' poderiam ser facilmente isoladas.

Além disso, pode ser muito útil usar o mesmo$.data(el, ...) coleção de ambos os quadros, e isso é bastante complicado sem algum gerenciamento de contexto.

questionAnswers(1)

yourAnswerToTheQuestion