2009-12-07 2 views
0

Я следующий код JS (разделась до минимального размера, где до сих пор существует проблема)JQuery проблемы с HTML() обработками в Opera

<html> 
<head> 
<script type="text/javascript" src="jquery.js"></script> 
</head> 
<body> 
<div id="debug">this is <em>test</em></div> 
<script type="text/javascript"> 
    var string1 = $('#debug').html(); 
    var string2 = string1.replace(/<em>/g, '<strong>'); 
    string2 = string2.replace(/<\/em>/g, '</strong>'); 
    $('#debug').html(string2); 
</script> 
</body> 
</html> 

В Firefox все работает и < эм > метки заменяются < сильного >.

Но в Опере <em> находятся на месте. Кроме того, любые другие теги HTML не захватываются регулярными выражениями вообще.

Есть ли способ исправить это поведение? Мне нужно не только заменять теги, но и анализировать их содержимое (например, атрибуты href).

ответ

3

Opera возвращает теги в верхнем регистре, например. <EM>. Вы должны изменить ваши регулярные выражения для работы регистронезависимо:

var string2 = string1.replace(/<em>/gi, '<strong>'); 
string2 = string2.replace(/<\/em>/gi, '</strong>'); 
+0

@ technix.in.ua Opera просто создание нормированного представление исходного HTML и выбирает, чтобы имена тегов в верхний регистр. Firefox делает обратное и делает все теги именами строчными. –

+0

В дополнение к Firefox, Safari & Chrome также нормализуется в нижнем регистре. Opera следила за возвращаемым значением TagSoup [tm] .innerHTML IE, чтобы быть «совместимым», но Opera в последние годы старалась дистанцироваться от копирования ошибок IE. Вообще говоря, это имеет смысл (IMHO), учитывая, что теги XHTML и атрибуты в любом случае должны быть строчными. В этом случае нормализация IE/Opera является ударом. Теги верхние, атрибуты ниже (или camelCase) и только правильно цитируются по атрибутам со значениями, установленными ... но я отбрасываю ... – scunliffe

+0

Я не совсем понимаю утверждение, что имена тегов и атрибутов «должны быть» в нижнем регистре. Логика для того, что делает IE, очень проста: IE изобрел innerHTML, поэтому они по определению правильные, и браузеры, которые хотят его поддерживать, должны выяснить, что делает IE. (Конечно, теперь он стандартизован в HTML5, поэтому, когда HTML5 выпущен, это больше не применяется.) – hallvors

0

Ваши регулярные выражения, не соответствующие в Опере, как она нормализовалась все HTML-теги в верхний регистр попробовать с // ГИ

Однако если вы («разбор содержимого»), я бы рекомендовал делать правильные манипуляции с DOM и не использовать регулярные выражения.

1

Не используйте строковые методы, когда вы можете использовать методы DOM:

$("#debug em").each(function() { 
    var newElem = document.createElement("strong"); 
    for (int i=0; i<this.childNodes.length; ++i) { 
     newElem.appendChild(this.childNodes[i]); 
    } 
    this.parentNode.replaceNode(newElem, this); 
}); 
Смежные вопросы