вторник, 1 мая 2012 г.

Локализация области действия скрипта Mathjax

В разрабатываемом приложении, которое позволяет студентам интерактивно решать задачи по линейной алгебре, студент вводит части своего решения (формулы) с помощью специального элемента управления, который для краткости называется шагом студента. Для студентов предусмотрено два вида интерфейса ввода шагов: "легкий" и "трудный". В легком интерфейсе студенту предоставляется шаблон("скелет") формулы, который он может заполнять математическими символами с помощью drag-and-drop.

Дмитрием был разработан тестовый пример, в котором на странице располагалось текстовое представление шаблона формулы (на рис - 1), математические символы, которые можно тащить и бросать в шаблон (2), сам шаблон, сгенерированный на основе текстового представления (3), и динамически генерирующееся скриптом Mathjax представление измененного шаблона (4).



А вот как выглядел этот пример при частично заполненной формуле:


Далее выяснилось, что если на html-странице расположено несколько шаблонов формул (а они в разрабатываемом приложении все заполняются математическими символами из одной и той же таблицы), то при заполнении очередного шаблона "гадится" генерирующееся mathjax'ом представление других шаблонов.

В тестовом примере обращение к элементам на странице шло по классу CSS. Например:


Для решения этой проблемы создала тестовый пример с двумя шаблонами для заполнения. 
Всем значимым элементам html дала id, при этом id назначала так:

То есть, у одинаковых по функциональному назначению элементов id отличались только номерами в конце. Функцию, которая обрабатывает бросание математического символа на шаблон формулы, изменила так: То есть, алгоритм был такой: получаем идентификатор шаблона, куда сброшен математический символ. 
Из него получаем номер шаблона (1 или 2), далее формируем идентификатор визуального представления, которое должно обновиться и просим Mathjax обновить только одинhtml  элемент -- с этим идентификатором.

В процессе решения этой проблемы помогла страница, которую порекомендовал Дмитрий.