Как добавить предварительный тег внутри тега кода с помощью jQuery?

Я пытаюсь использовать jQuery для форматирования блоков кода, в частности, чтобы добавить тег <pre> внутри тега <code>:

$(document).ready(function() {
   $("code").wrapInner("<pre></pre>");
});

Firefox правильно применяет форматирование, но IE помещает весь блок кода в одну строку. Если я добавлю оповещение

alert($("code").html());

Я вижу, что IE вставил дополнительный текст в тег pre:

<PRE jQuery1218834632572 = "null">

Если я перезагружу страницу, номер, следующий за jQuery, изменится.

Если я использую wrap() вместо wrapInner(), чтобы обернуть <pre> вне тега <code>, и IE, и Firefox обработают это правильно. Но разве <pre> не должен работать и внутри<code>?

Я бы предпочел использовать wrapInner(), потому что затем я могу добавить класс CSS в тег <pre> для обработки всего форматирования, но если я использую wrap(), мне нужно поместить CSS форматирования страницы в тег <pre> и форматирование текста / шрифта в тег <code>. , или Firefox и IE задыхаются. Ничего особенного, но я бы хотел, чтобы это было как можно проще.

кто-нибудь еще сталкивался с этим? Я что-то пропустил?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
12
0
7 026
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы используете последнюю версию jQuery? Что если вы попробуете

$("code").wrapInner(document.createElement("pre"));

Так лучше или результат такой же?

Кстати, я не знаю, связано ли это, но предварительные теги внутри тегов кода не будут проверяться в строгом режиме.

Ответ принят как подходящий

В этом разница между элементами блочный и встроенный. pre - это элемент блочного уровня.. Нельзя помещать его в тег code, который может содержать только встроенный контент.

Поскольку браузеры должны поддерживать любой ужасный суп из тегов, который они могут найти в реальной сети, Firefox пытается делать то, что вы имеете в виду. IE обрабатывает это по-другому, и это нормально по спецификации; поведение в этом случае не определено, потому что этого никогда не должно происходить.

  • Не могли бы вы вместо заменять элемента code использовать pre? (Из-за проблемы с блокировкой / встроенным кодом технически это должно работать, только если элементы находятся внутри элемент с «потоком» содержимого, но браузеры в любом случае могут делать то, что вы хотите.)
  • Почему это вообще элемент code, если вам нужно поведение pre?
  • Вы также можете дать элементу code возможность сохранения пробелов pre с помощью CSS white-space: pre, но, очевидно, IE 6 учитывает это только в строгом режиме.

Использование тега кода может быть оправдано как более семантическое, а не потому, что оно делает его правильным.

nickf 23.09.2008 10:40

Как указано в markpasc, элемент PRE внутри элемента CODE не допускается в HTML. Лучшее решение - изменить свой HTML-код для использования

<pre><code> (which means a preformatted block that contains code) directly in your HTML for code blocks.</code></pre>

Вы можете использовать html (), чтобы обернуть его:

$('code').each(function(i,e)
{
    var self = $(e);
    self.html('<pre>' + self.html() + '</pre>');
});

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

Другие вопросы по теме