Алгоритмический, автоматический Ajax - PullRequest
2 голосов
/ 01 августа 2011

Я создал фреймворк, который генерирует на сервере дерево HTML "DOM" в виде дерева объектов Python, а затем выплевывает его в виде строки для отправки клиенту. Это происходит с помощью рекурсивного обхода дерева в глубину: например, div будет выплевывать открывающий div, выплевывать весь детский html, а затем выплевывать закрывающий "/div".

Это дерево разбито на концептуальные компоненты, как показано ниже:

график http://lhy.mit.edu/media/Flow_Chart.png

Это показывает только первые два уровня иерархии; на реальном сайте есть еще много: например, каждый комментарий в панели комментариев является автономным компонентом, каждая кнопка в строке меню является автономным компонентом. Как видите, различные компоненты не обязательно должны находиться на одной и той же глубине в дереве. То, что составляет «компонент», решено мной.

Мне нужна строка complete html для каждого компонента (все, начиная с корневого узла этого компонента и далее), а также строка частичная HTML для каждого компонента ( HTML этого компонента, за исключением HTML его дочерних элементов). Например, частичный HTML основного раздела будет тегом html, head и двумя тегами div only . С другой стороны, complete html для основного раздела будет представлять собой каждый узел на странице.

Как бы я это сделал? Я мог бы просто найти complete HTML-строку каждого компонента и подкомпонента, пометить границы каждого подкомпонента какой-либо строкой и выполнить Regex-Removals, чтобы найти partal HTML-строка для каждого компонента, но это кажется неуклюжим и неэффективным.

Я мог бы сделать итеративно-углубленную DFS, останавливаясь на границе между компонентом и его подкомпонентами, пока не будет исследован каждый узел в этом компоненте. Затем у меня был бы частичный HTML для каждого компонента, но тогда мне нужно было бы сделать аналогичные хакерские вставки Regex-Inserts, чтобы позже создать complete HTML для каждого компонента.

Я мог бы сделать и то и другое, но это заняло бы два прохода и было бы дорого, хотя, возможно, не так дорого, как приведенная выше гимнастика Regex.

Я мог бы создать очередь приоритетов у Дейкстры, чтобы каждый компонент имел более высокий приоритет, чем его дочерние элементы. Оно будет проходить по дереву в правильном порядке, заканчивая каждый компонент, прежде чем перейти к его дочерним элементам, но я понятия не имею, как получить из него последнюю правильно сформированную строку HTML.

Цель всего этого состоит в том, чтобы сервер мог разумно и полностью автономно определять минимальный набор компонентов на странице клиента, которые необходимо изменить при переходе между двумя произвольными страницами.

Если я создаю новую страницу на моем сайте, мне нужно не более Ноль дополнительных строк кода, чтобы он плавно переходил с любой существующей страницы.

Но сначала мне нужно привести в порядок мои алгоритмы обхода графиков html-spewing. Есть идеи?

1 Ответ

0 голосов
/ 01 августа 2011

Я предполагаю, что ваш клиент - это код Javscript, поскольку вы ничего не указали.

Не делай ничего слишком сложного. В частности, ради бога не пытайтесь использовать регулярные выражения для работы с HTML .

Ваш сервер отправляет вам полностью функциональную строку HTML? В этом случае вы можете преобразовать это в реальный DOM, с которым вы можете работать (есть много способов сделать это), а затем использовать .innerHTML элемента, чтобы получить ваши "полные html" и использовать .tagName для получить имя тега.

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

Если вы действительно хотите использовать меньше грубой силы, чем найти способ запрашивать / получать уведомления только об интересных изменениях, не обращая внимания на все. Затем, учитывая часть, которая должна быть изменена, и текст, вам просто нужно сделать что-то вроде

document.getElementById('mainCommentArea').innerHTML = newHTML;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...