Ответ 1
Динамически добавить jQuery и jQuery UI в iframe (demo):
$('iframe')
.load(function() {
var win = this.contentWindow,
doc = win.document,
body = doc.body,
jQueryLoaded = false,
jQuery;
function loadJQueryUI() {
body.removeChild(jQuery);
jQuery = null;
win.jQuery.ajax({
url: 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js',
dataType: 'script',
cache: true,
success: function () {
win.jQuery('.sortable').sortable({ cursor: 'move' });
}
});
}
jQuery = doc.createElement('script');
// based on https://gist.github.com/getify/603980
jQuery.onload = jQuery.onreadystatechange = function () {
if ((jQuery.readyState && jQuery.readyState !== 'complete' && jQuery.readyState !== 'loaded') || jQueryLoaded) {
return false;
}
jQuery.onload = jQuery.onreadystatechange = null;
jQueryLoaded = true;
loadJQueryUI();
};
jQuery.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js';
body.appendChild(jQuery);
})
.prop('src', 'iframe-test.html');
Обновление: Andrew Ingram правильно, что пользовательский интерфейс jQuery хранит и использует ссылки на window
и document
для страницы, на которой пользовательский интерфейс jQuery загружен. Загружая jQuery/jQuery UI в iframe, он имеет правильные ссылки (для iframe, а не внешнего документа) и работает как ожидалось.
Обновление 2: Исходный фрагмент кода имел тонкую проблему: порядок выполнения динамических тегов script не гарантируется. Я обновил его, чтобы пользовательский интерфейс jQuery загружался после того, как jQuery готов.
Я также включил код получения в загружать LABjs динамически, чтобы не требовалось опроса.