Чтобы продемонстрировать, что я после, рассмотрим следующий jsfiddle:
http://jsfiddle.net/5TNVK/4/
За исключением того, что я хочу, чтобы он вставлял HTML только в соответствующий селектор, а не в каждый селектор.Я пытаюсь сделать так, чтобы каждый селектор совпадал с самим собой.При каждом ajax-запросе я получаю около 5 элементов со страницы, которую я загружаю, и затем анимацию и тому подобное с ними.В настоящее время я сначала делаю вызов ajax, затем перебираю массив селекторов, присваивая каждому html () результаты find ().Это очень быстро во всех браузерах, отличных от IE, но занимает около 1000 мс или более в IE8 при поиске только 5 элементов.
Я полагаю, что есть более простой способ ajax GET страницы один раз , .find () каждый селектор отправляет на него, а затем вставляет результаты в тот же селектор.Кроме того, он должен вызывать только один раз .
Кажется, я не могу понять, как на самом деле перебирать каждый self
.Я также хотел бы, чтобы я просто вставил URL без конечных селекторов.Функция уже знает, какие селекторы использовать в .find()
, потому что это будет то же самое, что было передано ей.
В идеале это будет так:
$('#foo, .bar, #test[href=moo]').my_load('newpage.html');
Где элемент текущей страницы с id = foo вставляется с элементом newpage.html с id = foo, и то же самое для class = bar и т. Д.
Редактировать:
ПослеЕще несколько сравнительных тестов и так далее. Похоже, именно метод .find () заставляет IE8 быть настолько медленным в 1.4.4.Нахождение 5 элементов по одному в 3k html требует 1000 мс в 1.4.4, в 1.3.2 - около 600 мс.
Редактировать 2:
Сохранение прежнего состояния, в котором я находилсяполучить исходный код HTML заранее, я использую эту функцию для анализа исходного кода html и получения селекторов.Это работает около 200 мс в IE.Так что это улучшение, но мне сказали остерегаться innerHTML.
jQuery.fn.extend({
super_load: function(html,callback ) {
var self = this;
var htmls = $(html).find(self.selector);
for (var i =0; i < self.length; i++){
self[i].innerHTML = htmls[i].innerHTML;
}
if ( callback ) {
callback.call(this,html);
}
return this;
}
});