jQuery: автоматическое исправление тегов
Сегодня jQuery 1.3.1 и Firefox 3.5 преподнесли мне сюрприз… Даже можно сказать “нагло украли” полчаса времени. Указываю конкретные версии, потому что не успел проверить - случилось бы в другом окружении тоже самое. А было дело так…
Я работал над плагином под WordPress и делал достаточно стандартные элементы ajax-интерфейса. Замялся над такой штукой (схематически):
1) ajax-запросом подгружаю на страницу список .tpl файлов из определенной папки и их содержимое,
2) названия этих файлов показываю списком ссылок, а контент расставляю в невидимые слои,
3) при клике на ссылку с именем файла, его содержимое переносится из невидимого слоя в textarea для редактирования следующим образом:
$(’textarea[name=my_textarea]‘).attr(’value’, $(’#my_div’).html());
И все было нормально, пока… Пока я не начал тестировать систему на реальных файлах. А реальные файлы представляли из себя специальные темплейты парсинга контента, и в одном из них были следующие строки:
<title>
{{title}}
</spl_title>
jQuery принимало и записывало текст файла совершенно нормально, а вот переносило в textarea в таком виде:
<title>
{{title}}
</title>
Такая вот себе система автодетекта “ошибок”. “Несуществующие” с точки зрения html-логики теги, типа </meta> (закрывающий) просто не отображались.
Поразмыслив над случившимся, могу сделать один только вывод: при вызове .html(), jQuery продолжает работать с DOM-деревом, а не точным содержимым блока. Каждый элемент DOM при это идентифицируется по открывающему тегу и закрывает его jQuery так, как считает нужным (чтобы сохранить целостность).
Пришлось переделать немного логику интерфейса… А примерчик в коллекцию поучительных.
Понравился пост? Будь в курсе последних событий: подпишись на RSS-ленту.!
Также читайте по теме:
- 3 июля

И как же вы переделали логику?
2mihdan:
Сделал то, чего пытался избежать - дополнительный ajax-запрос. Т.е. при клике на ссылку “Редактировать” система дает ajax-запрос, получает содержимое соответствующего файла и помещает его непосредственно в поле для редактирования.
Сейчас думаю проверить еще один вариант - сохранять с помощью jQuery-механизма .data().
Можно было бы просто сохранять в строковые переменные javascript навроде:
var templates = {
'one.tpl': 'some contents',
'two.tpl': 'some other contents'
}
и тогда не придется плясать с бубном
Тоже вариант