Я загружаю HTML через Ajax в следующем формате:
<div id="div1">
... some content ...
</div>
<div id="div2">
...some content...
</div>
... etc.
Мне нужно перебирать каждый div в ответе и обрабатывать его отдельно. Наличие отдельной строки для содержимого HTML каждого div, сопоставленного с идентификатором, удовлетворит мои требования. Тем не менее, div может содержать теги сценария, которые мне нужно сохранить, но не выполнить (они будут выполнены позже, когда я вставлю HTML-код в документ, поэтому выполнение во время синтаксического анализа будет плохим). Моей первой мыслью было сделать что-то вроде этого:
// data being the result from $.get
var clean = data.replace(/<script.*?</script>/,function() {
// insert some unique token, save the tag, put it back while I'm processing
});
$('<div/>').html(clean).children().each( /* ... process here ... */);
Но я волнуюсь, что придет какой-нибудь глупый разработчик и поместит что-то вроде этого в один из div:
<script> var foo = '</script>'; // ... </script>
Что бы все испортить. Не говоря уже о том, что все это похоже на взлом с самого начала. Кто-нибудь знает лучший способ?
РЕДАКТИРОВАТЬ: Вот решение, которое я придумал:
var divSplitRegex = /(?:^|<\/div>)\s*<div\s+id="prefix-(.+?)">/g,
idReplacement = preDelimeter+'$1'+postDelimeter;
var r = data.replace(<\/div>\s*$/,'').
replace(divSplitRegex,idReplacement).split(preDelimeter);
$.each(r,function() {
var content;
if(this) {
callback.apply(null,this.split(postDelimeter));
}
});
Где preDelimiter и postDelimeter - это просто уникальные строки, такие как "### Я должен быть идиотом, чтобы встраивать эту строку в мой контент без экранирования, потому что он сломает все ### ', а callback - это функция, ожидающая div id и содержимое div. Это работает только потому, что я знаю, что div будет иметь только атрибут id, а id будет иметь специальный префикс. Я предполагаю, что кто-то может добавить div в свой контент с идентификатором, имеющим тот же префикс, и тоже все испортил.
Итак, я до сих пор не люблю это решение. У кого-нибудь есть лучший?