#javascript #html
#javascript #HTML
Вопрос:
Я ищу идеи о том, как обнаружить объекты, которые находятся в HTML DOM, но они явно не представлены в исходном коде HTML.
Как вы, возможно, знаете, если у меня есть исходный код HTML, содержащий следующее:
<table id="myTbl">
<tr id="row1">
<td id="name">George</td>
</tr>
</table>
… HTML DOM добавит <tbody>
объект в дерево объектов без изменения исходного кода, понимая, что исходный код подразумевает это. Таким образом, в DOM структура такая, как если бы исходный код HTML был:
<table id="myTbl">
<tbody>
<tr id="row1">
<td id="name">George</td>
</tr>
</tbody>
</table>
У меня есть функция javascript, которая просматривает дерево DOM, и мне нужно определить, когда я столкнулся с объектом, который подразумевается, то есть он есть в DOM, но не в исходном коде HTML.
Есть идеи, как это сделать? Может быть, в объекте есть какой-то атрибут, который сообщает, получен ли он из источника или нет?
Комментарии:
1. Вы не можете сказать. Почему вы этого хотите?
2. Спасибо, что посмотрели. У меня есть некоторые переменные, содержащие объекты, которые совпадают с некоторыми объектами таблицы DOM, за исключением подразумеваемых объектов атрибута tbody. Я хотел бы знать, было ли tbody неявным или явным, чтобы я мог игнорировать / ссылаться на него в переменной.
Ответ №1:
Может быть сохранено в document.body.onload
строке начального document.body.innerHTML
Затем, когда вы захотите выполнить проверку, сначала протестируйте, чтобы убедиться, что они все те же.
Если нет, сравните обе строки и найдите различия.
Я думаю, это нормально, если у вас не слишком тяжелая страница.
Комментарии:
1. Это не сработает для элементов TBODY, поскольку они добавляются сразу после анализа HTML.
2. @David, при первом чтении HTML-кода TBODY уже находятся там.
Ответ №2:
Читая ваш комментарий, вам просто нужно определить, был ли <tbody>
тег добавлен в процессе рендеринга, а не присутствует ли он в исходном коде?
Если да, то почему бы не изменить исходный код, который действительно содержит, <tbody>
применив атрибут <tbody class="exp">
, тогда, когда вы проходите по DOM, вы знаете, что любой узел tbody, не обладающий этим атрибутом, был вставлен механизмом рендеринга.
Ответ №3:
Новая идея, основанная на идее Алекса. По-прежнему требуется повторная выборка всего DOM, но иначе поступить невозможно. Вы могли бы реализовать эту же логику на стороне сервера, если это возможно в вашем приложении. Использование jQuery для краткости:
function getInsertedElements(callback){
$.get('.', function(content){
callback($(content
.replace(/(<w [^>] classs*=s*")/gi, '$1from-source ')
.replace(/(<w )(?![^>]* classs*=)/gi, '$1 class="from-source"')
).find(':not(.from-source)'));
});
}
это даст вам список всех вставленных элементов 🙂 Возможно, потребуется некоторое уточнение, например, в отношении совпадения кавычек class="
, поскольку цитата там технически необязательна. Также не тестировался, но должен работать.
Обратите внимание, что с помощью этого метода вы получаете обратно новые элементы, а не те, которые в данный момент существуют в вашем DOM, так что, если это важно, просто имейте это в виду.
Комментарии:
1. Это хорошая идея, но я не могу с чистой совестью проголосовать за нее 😉
2. разгромил большую часть этой идеи, эта мне нравится больше 🙂
3. Интересно. Я не очень хорошо разбираюсь в jQuery, но есть ли основная идея в этих строках? 1. Получите копию исходного кода. 2. Измените все классы на «из исходного кода» 3. Просмотрите полученный DOM и найдите все объекты без класса «из исходного кода». Если это то, что делает приведенный выше скрипт, я думаю, это сработает.
4. @Jonathan — Это именно то, что он делает. Регулярное выражение должно нормально работать без jQuery, который является единственной немного сложной его частью. Одно отличие — он фактически добавляет имя класса «из исходного кода», хотя для целей этого вы могли бы с радостью заменить его, а затем проверить
obj.className=='from-source'
5. Я думаю, что тогда это сработает. Безусловно, перезагрузка страницы сопряжена с большими накладными расходами, но в этом конкретном приложении я могу обойтись без этого. Большое спасибо!