2009-05-21 2 views
4

я загружаю некоторые HTML с помощью Ajax с этим форматом:JQuery: Разбираем/Манипулирование HTML без выполнения скриптов

мне нужно перебрать каждого DIV в ответ и обрабатывать отдельно. Наличие отдельной строки для содержимого HTML каждого div, сопоставленного с идентификатором, удовлетворяет моим требованиям. Тем не менее, divs может содержать теги скриптов, которые мне нужно сохранить, но не выполнить (они будут выполняться позже, когда я буду вставлять 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 ... */); 

Но я волнуюсь, что какой-то глупый DEV собирается прийти и поставить что-то подобное в одном из дивы:

<script> var foo = '</script>'; // ... </script> 

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

EDIT: Вот решение, которое я придумал:

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 только уникальные строки, как «### я должен был бы быть идиотом, чтобы вставить эту строку в моем content unescaped, потому что он сломал все ### ', а callback - функция, ожидающая идентификатор div и содержимое div. Это работает только потому, что я знаю, что divs будет иметь только атрибут id, а id будет иметь специальный префикс Я полагаю, кто-то мог бы добавить div в свой контент с идентификатором, имеющим тот же префикс, и он тоже повредил бы.

Итак, t люблю это решение. У кого-нибудь есть лучший?

ответ

3

FYI. Использование unescaped в любом сценарии JavaScript вызывает эту проблему в браузере. Разработчики должны избегать этого, так что нет оправдания. Таким образом, вы можете «доверять», что может сломаться в любом случае.

<body> 
<div> 
    <script> 
    alert('<script> tags </script> are not '+ 
     'valid in regular old HTML without being escaped.'); 
    </script> 
</body> 

См

http://jsbin.com/itevu

, чтобы увидеть его сломать. :)

+0

Я предполагаю, что это означает, что мое первое решение будет безопасным. Мне это не нравится, но это работает. – noah

2

В некоторых случаях удаление тегов сценария приводит к недопустимой HTML:

<html> 
    <head> 
    </head> 
    <body> 
     <p>This should be 
     <script type="text/javascript"> 
      document.writeln("<b"); 
     </script>>bolded</b>. 
    </body> 
</html> 
-2

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

function preventJS(html) { 
    return html.replace(/<script(?=(\s|>))/i, '<script type="text/xml" '); 
} 

И сохраняет скрипт-теги внутри DOM, поэтому сценарии могут быть использованы в дальнейшем.

Я описал этот способ в своем блоге здесь - JavaScript: How to prevent execution of JavaScript within a html being added to the DOM.

Смежные вопросы