jQuery: обход ответа AJAX в Chrome / Safari - PullRequest
3 голосов
/ 16 июня 2010

Я пытаюсь просмотреть ответ AJAX, который содержит удаленную веб-страницу (вывод HTML).

Моя цель состоит в том, чтобы пройтись по элементам 'script', 'link' и 'title' удаленной страницы - при необходимости загрузить их и вставить их содержимое на текущую страницу.

Отлично работает в FF / IE, но по какой-то причине - Chrome & Safari ведет себя по-разному: Когда я запускаю цикл .each () для ответа, Chrome / Safari, кажется, пропускает все, что находится в разделе страницы.

Вот мой текущий код:

$.ajax({
    url: 'remoteFile.php',
    cache: false,
    dataFilter: function(data) { 
        console.log(data); 
        /* The output seems to contain the entire response, including the <head> section - on all browsers, including Chrome/Safari */

        $(data).filter("link, script, title").each(function(i) {
            console.log($(this)); 
            /* IE/FF outputs all of the link/script/title elements, Chrome will output only those that are not in the <head> section */
        });

        console.log($(data)); 
        /* This also outputs the incomplete structure on Chrome/Safari */

        return data;
    },
    success: function(response) {}
});

Я уже давно борюсь с этой проблемой, я нашел несколько других подобных случаев в поиске в Google, но реального решения не найдено. Это происходит как в jQuery 1.4.2, так и в jQuery 1.3.2.

Я действительно не хочу анализировать ответ с помощью .indexOf () и .substring () - мне кажется, это будет излишним для клиента.

Большое спасибо заранее!

1 Ответ

1 голос
/ 16 июня 2010

Я думаю, что это связано с тем, как jQuery обрабатывает строки HTML и создает из них узлы DOM. Среди множества других вещей, jQuery создаст временный <div> и установит его innerHTML для любого HTML, который вы передаете $(...), создавая таким образом группу DOM-узлов, которые можно извлечь из <div> и передать обратно Вы как коллекция jQuery.

Проблема, как мне кажется, возникает из-за элементов <html>, <head> и <body>, которые плохо реагируют на добавление к элементу <div>. Браузеры, как правило, ведут себя по-разному, - некоторые, кажется, игнорируют эти элементы верхнего уровня и просто возвращают вам их содержимое - другие полностью игнорируют элементы и даже не дают вам своих потомков.

Кажется, способ избежать этой кросс-браузерной проблемы - просто заменить проблемные элементы некоторыми другими поддельными элементами перед анализом. Э.Г.

$(
    // replace <html> with <foohtml> .. etc.
    data.replace(/<(\/?)(head|html|body)(?=\s|>)/g, '<foo$1$2')
).filter("link, script, title").each(function(i) {
    console.log($(this));
    // do your stuff
});

Кроме того, я не думаю, что filter будет достаточно, поскольку он не будет нацелен на потомки. Это может быть лучшим подходом:

$(
    // replace <html> with <foohtml> .. etc.
    data.replace(/<(\/?)(head|html|body)(?=\s|>)/g, '<foo$1$2')
).find('link,script,title').andSelf().filter("link,script,title").each(function(i) {
    console.log($(this));
    // do your stuff
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...