Есть ли способ показать HTML-фрагменты кода на веб-странице без необходимости заменять каждый <
на <
и >
на >
?
Другими словами, существует ли какой-либо тэг, который не отображает HTML, пока вы не нажмете на закрывающий тег?
Есть ли способ показать HTML-фрагменты кода на веб-странице без необходимости заменять каждый <
на <
и >
на >
?
Другими словами, существует ли какой-либо тэг, который не отображает HTML, пока вы не нажмете на закрывающий тег?
Нет, нет. В собственно HTML нет возможности избежать некоторых символов:
&
as &
<
as <
(Между прочим, нет необходимости бежать >
, но люди часто делают это по соображениям симметрии.)
И, конечно же, вы должны заключить получившийся экранированный HTML-код в <pre><code>…</code></pre>
, чтобы (а) сохранить пробелы и разрывы строк, и (б) пометить его как элемент кода.
Все другие решения, такие как перенос вашего кода в элемент <textarea>
или (устаревший) <xmp>
, сломаются. 1
XHTML, который объявлен в браузере как XML (через заголовок HTTP Content-Type
! - недостаточно просто установить DOCTYPE
) может альтернативно использовать раздел CDATA:
<![CDATA[Your <code> here]]>
Но это работает только в XML, а не в HTML, и даже это не является надежным решением, поскольку код не должен содержать закрывающий разделитель ]]>
. Так что даже в XML самое простое и надежное решение - через экранирование.
1 Показательный пример:
textarea {border: none; width: 100%;}
<textarea readonly="readonly">
<p>Computer <textarea>says</textarea> <span>no.</span>
</textarea>
<xmp>
Computer <xmp>says</xmp> <span>no.</span>
</xmp>
Простой и истинный метод для HTML:
лучший способ:
<xmp>
// your codes ..
</xmp>
старые образцы:
образец 1:
<pre>
This text has
been formatted using
the HTML pre tag. The brower should
display all white space
as it was entered.
</pre>
образец 2:
<pre>
<code>
My pre-formatted code
here.
</code>
</pre>
образец 3: (Если вы на самом деле "цитируете" блок кода, тогда будет разметка)
<blockquote>
<pre>
<code>
My pre-formatted "quoted" code here.
</code>
</pre>
</blockquote>
хороший пример с CSS:
pre{
font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
margin-bottom: 10px;
overflow: auto;
width: auto;
padding: 5px;
background-color: #eee;
width: 650px!ie7;
padding-bottom: 20px!ie7;
max-height: 600px;
}
Код подсветки синтаксиса (для проделанной работы):
rainbows (очень отлично)
лучшие ссылки для вас:
https://github.com/balupton/jquery-syntaxhighlighter
http://bavotasan.com/2009/how-to-wrap-text-within-the-pre-tag-using-css/
http://alexgorbatchev.com/SyntaxHighlighter/
Вид наивного метода отображения кода будет включать его в текстовое поле и добавить отключенный атрибут, поэтому его нельзя редактировать.
<textarea disabled> code </textarea>
Надеюсь, что это поможет кому-то найти простой способ получить материал.
Устаревший, но работает в FF3 и IE8.
<xmp>
<b>bold</b><ul><li>list item</li></ul>
</xmp>
Рекомендуемые:
<pre><code>
code here, escape it yourself.
</code></pre>
Я использовал <xmp>
следующим образом:
http://jsfiddle.net/barnameha/hF985/1/
В HTML? Нет.
В XML/XHTML? Вы можете использовать блок CDATA
.
Это просто. Используйте этот код xmp
<xmp id="container">
<xmp >
<p>a paragraph</p>
</xmp >
</xmp>
Устаревший тег <xmp>
по существу делает это, но больше не является частью спецификации XHTML. Он все равно должен работать, хотя во всех текущих браузерах.
Вот еще одна идея, трюк с хаком/салоном, вы можете поместить код в текстовое поле так:
<textarea disabled="true" style="border: none;background-color:white;">
<p>test</p>
</textarea>
Включение угловых скобок и кода, подобных этому в текстовой области, является недопустимым HTML и вызывает поведение undefined в разных браузерах. В Internet Explorer HTML интерпретируется, в то время как Mozilla, Chrome и Safari оставляют его неинтерпретированным.
Если вы хотите, чтобы он не редактировался и выглядел по-другому, вы можете легко стилизовать его с помощью CSS. Единственная проблема заключалась бы в том, что браузеры добавят этот маленький дескриптор перетаскивания в нижнем правом углу, чтобы изменить размер окна. Или, наоборот, попробуйте вместо этого использовать тег ввода.
Правильный способ ввода кода в текстовое поле - использовать язык на стороне сервера, например, такой PHP:
<textarea disabled="true" style="border: none;background-color:white;">
<?php echo '<p>test</p>'; ?>
</textarea>
Затем он обходит интерпретатор html и последовательно помещает неинтерпретированный текст в текстовое поле во всех браузерах.
Кроме этого, единственный способ - действительно избежать кода самостоятельно, если статический HTML или использовать серверные методы, такие как .NET HtmlEncode(), если вы используете такую технологию.
Я предполагаю:
<
не требуется экранированиеВсе ваши варианты находятся в этом дереве:
<p>
)
<
"
и &thing;
требуется экранирование: "
и &thing;
соответственно<script>
и <style>
только</script
не разрешено нигде в <script>
<textarea>
и <title>
только<textarea>
является хорошим кандидатом для переноса кода в</html>
там</textarea
по понятным причинам
</textarea
или аналогичным&thing;
требуется экранирование: &thing;
Примечание: >
не требуется экранирование. Даже в обычных элементах.
Следующая ссылка будет полезна.
http://www.freebits.co.uk/convert-html-code-to-text.html
это очень легко и дружелюбно.
Если ваша цель - показать фрагмент кода, который вы выполняете в другом месте на той же странице, вы можете использовать textContent (он чистый-js и хорошо поддерживается: http://caniuse.com/#feat=textcontent)
<div id="myCode">
<p>
hello world
</p>
</div>
<div id="loadHere"></div>
document.getElementById("myCode").textContent = document.getElementById("loadHere").innerHTML;
Чтобы получить многострочное форматирование в результате, вам нужно установить стиль css "white-space: pre;" на целевом div и писать строки индивидуально, используя "\ r\n" в конце каждого.
Вот демо: https://jsfiddle.net/wphps3od/
Этот метод имеет преимущество перед использованием textarea: Код не будет переформатировать, как это было бы в текстовом поле. (Такие вещи, как
полностью удаляются в текстовом поле)
В конечном счете лучшим (хотя и раздражающим) ответом является "избегать текста".
Однако есть много текстовых редакторов, или даже автономных мини-утилит, которые могут делать это автоматически. Поэтому вам никогда не придется бежать от него вручную, если вы этого не хотите (если это не сочетание экранированного и неэкранированного кода...)
Быстрый поиск Google показывает мне это, например: http://malektips.com/zzee-text-utility-html-escape-regular-expression.html
Вы можете использовать язык на стороне сервера, например PHP, для вставки исходного текста:
<?php
$str = <<<EOD
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="description" content="Minimal HTML5">
<meta name="keywords" content="HTML5,Minimal">
<title>This is the title</title>
<link rel='stylesheet.css' href='style.css'>
</head>
<body>
</body>
</html>
EOD;
?>
затем выгрузите значение $str
htmlencoded:
<div style="white-space: pre">
<?php echo htmlentities($str); ?>
</div>
<textarea ><?php echo htmlentities($page_html); ?></textarea>
у меня отлично работает..
"Имея в виду предложение Alexander
, вот почему я считаю, что это хороший подход"
если мы просто попробуем обычный <textarea>
, он не всегда будет работать, поскольку могут быть закрывающие теги textarea
, которые могут ошибочно закрывать родительский тег и отображать оставшуюся часть исходного кода HTML в родительском документе, что будет выглядеть неловко.
использование htmlentities
преобразует все применимые символы, такие как < >
, в объекты HTML, что исключает любую возможность утечек.
Возможно, у этого подхода есть преимущества или недостатки или лучший способ достижения тех же результатов, если так, пожалуйста, прокомментируйте, как я хотел бы учиться у них :)
Это простой трюк, и я попробовал его в Safari и Firefox
<code>
<span><</span>meta property="og:title" content="A very fine cuisine" /><br>
<span><</span>meta property="og:image" content="http://www.example.com/image.png" />
</code>
Это будет выглядеть так:
Вы можете увидеть это в прямом эфире Здесь
На самом деле есть способ сделать это. Он имеет ограничение (один), но на 100% стандартно, не устарел (как xmp) и работает.
И это тривиально. Вот оно:
<div id="mydoc-src" style="display: none;">
LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo
<!--
YOUR CODE HERE.
<script src="WidgetsLib/all.js"></script>
^^ This is a text, no side effects trying to load it.
-->
LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo
</div>
Пожалуйста, позвольте мне объяснить. Прежде всего, обычный HTML-комментарий делает работу, чтобы предотвратить интерпретацию всего блока. Вы можете легко добавить в него любые теги, все они будут игнорироваться. Игнорируется при интерпретации, но все еще доступно через innerHTML
! Итак, осталось получить содержимое и отфильтровать предыдущие и конечные токены комментариев.
За исключением (помните - ограничение) вы не можете помещать туда HTML-комментарии, поскольку (по крайней мере, в моем Chrome) их вложение не поддерживается, и самое первое "->" завершит показ.
Ну, это маленькое неприятное ограничение, но в некоторых случаях это совсем не проблема, если в вашем тексте нет комментариев HTML. И легче избежать одной конструкции, чем целая куча из них.
Теперь, что это за странная строка LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo
? Это случайная строка, похожая на хеш, которая вряд ли будет использоваться в блоке и используется для? Вот контекст, почему я его использовал. В моем случае я взял содержимое одного DIV, затем обработал его с помощью разметки Showdown, а затем вывод, назначенный в другой div. Идея заключалась в том, чтобы написать встроенную уценку в HTML файле и просто открыть в браузере, и она будет преобразовываться при загрузке на лету. Таким образом, в моем случае <!--
трансформировался в <p><!--</p>
, комментарий правильно не отображался. Работало, но загрязняло экран. Таким образом, чтобы легко удалить его с помощью регулярного выражения, была использована случайная строка. Вот код:
var converter = new showdown.Converter();
converter.setOption('simplifiedAutoLink', true);
converter.setOption('tables', true);
converter.setOption('tasklists', true);
var src = document.getElementById("mydoc-src");
var res = document.getElementById("mydoc-res");
res.innerHTML = converter.makeHtml(src.innerHTML)
.replace(/<p>.{0,10}LlNnlljn77fggggkk77csJJK8bbJBKJBkjjjjbbbJJLJLLJo.{0,10}<\/p>/g, "");
src.innerHTML = '';
И это работает.
Если кому-то интересно, эта статья написана с использованием этой техники. Не стесняйтесь загружать и заглядывать в HTML файл.
Это зависит от того, для чего вы его используете. Это пользовательский ввод? Затем воспользуйтесь <textarea>
и избегайте всего. В моем случае, и, вероятно, в вашем случае, я просто использовал комментарии, и он выполняет свою работу.
Если вы не используете уценку и просто хотите получить ее как есть из тега, тогда это еще проще:
<div id="mydoc-src" style="display: none;">
<!--
YOUR CODE HERE.
<script src="WidgetsLib/all.js"></script>
^^ This is a text, no side effects trying to load it.
-->
</div>
и код JavaScript для его получения:
var src = document.getElementById("mydoc-src");
var YOUR_CODE = src.innerHTML.replace(/(<!--|-->)/g, "");
Есть несколько способов избежать всех в HTML, ни одна из них не является приятной.
Или вы можете добавить iframe
, который загружает простой текстовый файл.
Это, безусловно, лучший способ для большинства ситуаций:
<pre><code>
code here, escape it yourself.
</code></pre>
Я бы проголосовал первым, кто предложил это, но у меня нет репутации. Я был вынужден сказать что-то, хотя ради людей, пытающихся найти ответы в Интернете.
Вот как я это сделал:
$str = file_get_contents("my-code-file.php");
echo "<textarea disabled='true' style='border: none;background-color:white;'>";
echo $str;
echo "</textarea>";
function escapeHTML(string)
{
var pre = document.createElement('pre');
var text = document.createTextNode(string);
pre.appendChild(text);
return pre.innerHTML;
}//end escapeHTML
он вернет экранированный HTML
Вы можете попробовать:
Hello! Here is some code:
<xmp>
<div id="hello">
</div>
</xmp>
Он может не работать в любой ситуации, но размещение фрагментов кода внутри textarea
будет отображать их как код.
Вы можете стилизовать текстовое поле с помощью CSS, если вы не хотите, чтобы он выглядел как реальная текстовая область.
//To show xml tags in table columns you will have to encode the tags first
function htmlEncode(value) {
//create a in-memory div, set it inner text(which jQuery automatically encodes)
//then grab the encoded contents back out. The div never exists on the page.
return $('<div/>').text(value).html();
}
html = htmlEncode(html)
Оборачивая код в div contenteditable
и устанавливая отступ white-space: pre-wrap;
, код сохраняется в соответствии с шириной и высотой:
<div class="code" contenteditable>
// code
</div>
.code {
white-space: pre-wrap;
}