Работа с ответом AJAX с помощью методов DOM - PullRequest
3 голосов
/ 03 июня 2010

Я извлекаю весь HTML-документ через AJAX - и это прекрасно работает. Но мне нужно извлечь некоторые части этого документа и что-то с ними делать.

Использование фреймворка (jquery, mootools и т. Д.) Не вариант.

Единственное решение, которое я могу придумать, - это получить текст HTML-документа с помощью регулярного выражения (да, я знаю, ужасно), т.е. <body>(.*)</body> поместите это в DOM текущей страницы в скрытый элемент и работайте с ним оттуда.

Есть ли более простой / лучший способ?

Обновление

Я провел некоторое тестирование, и вставка всего HTML-документа в созданный элемент ведет себя немного по-разному в протестированных мной браузерах. Например:

  • FF3.5: сохраняет содержимое тегов HEAD и BODY
  • IE7 / Safari4: включает только то, что между ...
  • Opera 10.10: сохраняет заголовок и все, что в нем, содержит содержимое тела

Поведение IE7 и Safari идеальное, но разные браузеры делают это по-разному. Поскольку я загружаю предопределенный HTML-документ, я думаю, что собираюсь использовать regEx, чтобы получить то, что я хочу, и вставить его в элемент DOM - если у кого-то нет других предложений.

1 Ответ

5 голосов
/ 03 июня 2010

Элементы могут существовать, не находясь на самой странице. Просто добавьте HTML в фиктивный div.

var wrapper = document.createElement('div');
wrapper.innerHTML = "<ul><li>foo</li><li>bar</li></ul>";
wrapper.getElementsByTagName('li').length; // 2

Учитывая ваши правки, мы сталкиваемся с неприятной ситуацией, так как вы хотите getElementById. Скорее всего, это было бы легко, если бы вы могли просто создать новый виртуальный документ с помощью document.implementation.createDocument, но IE его вообще не поддерживает.

Использование регулярных выражений - грязное дело, а что если мы увидим что-то вроде <body><input value="</body>" /></body>? Возможно, вы могли бы просто сделать свое регулярное выражение жадным, чтобы оно перешло к последнему экземпляру </body>, но если вы столкнетесь с проблемами, может потребоваться более тщательный анализ. Даже если полный фреймворк не подходит, вам может понадобиться использовать что-то вроде Sizzle , ядро ​​библиотек, таких как jQuery, для поиска нужного элемента. Или, если вы действительно чувствуете себя в пуристском настроении, вы можете написать рекурсивную функцию поиска самостоятельно, но зачем использовать этот удар, если кто-то другой уже воспользовался им?

var response_el = document.createElement('html'), foo;
response_el.innerHTML = the_html_elements_content;
foo = Sizzle('#foo', response_el);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...