Как HTML-теги работают внутри тега script?
Например, просмотр-источник в профиль общественной карьеры Джоэля Сполька
<script type="text/html" id="stackexchangeanswerswidget">
<h3>Top Answers</h3>
<div class="answers">
</div>
</script>
<script type="text/html" id="topanswer">
<div class="top-answer">
<div class="top-answer-stats">{{= shared.htmlEncode(Score) }}</div>
<span class="top-answer-title"><a href="{{=AnswerLink}}">{{= shared.htmlEncode(Title) }}</a></span>
<a class="add-answer">add</a>
<br class="clear" />
</div>
</script>
<script type="text/html" id="answer-view">
<div class="answer">
<div class="answer-stats {{= shared.htmlEncode(Site.toLowerCase().replace(/ /g, '')) }}">
<div class="score">
<strong>{{= shared.htmlEncode(Score) }}</strong>
<div class="votecount">votes</div>
</div>
<img class="answer-logo" src="{{= shared.htmlEncode(FaviconUrl) }}" />
</div>
<div class="answer-content">
<span class="q">Q:</span>
<div class="answer-top">
<a class="answer-title" href="{{= shared.htmlEncode(AnswerLink) }}">{{= shared.htmlEncode(Title) }}</a><br />
</div>
<span class="a">A:</span><div class="answer-body">{{= Body }}</div>
<div class="more-button" style="text-align:center; clear:both; display:none;"><a class="more">More</a></div>
</div>
</div>
</script>
Как HTML-теги работают внутри тега script? и/или Какая технология используется для этих тегов html и шаблонов одинаковых кодов {{= .... }}
внутри тегов script?
Ответы
Ответ 1
В теге <script>
вы можете поместить все, что хотите. Если вы укажете тип контента, отличный от Javascript (или другого языка сценариев, который понимает браузер), он не будет интерпретироваться браузером, и вы можете просто получить к нему доступ в виде обычного текста. Поскольку содержимое тегов <script>
рассматривается как CDATA, содержимое не анализируется, и вы можете хранить неконкретизированные XML или HTML в содержимом (до тех пор, пока вы не ставите тег </script>
в содержимое, так как это закроет ваш элемент).
Это используется, например, в SVG Web, polyfill, который позволяет использовать встроенный SVG в HTML и преобразовать его на собственный SVG в браузерах, которые его поддерживают, или Flash в браузерах, которые этого не делают. Это позволяет встраивать SVG в браузеры, которые не поддерживают его изначально, обертывая его тегом <script>
, поэтому браузер не пытается и не анализирует его как HTML.
В случае SO-карьеры, похоже, они хранят шаблоны для использования с Backbone.js и Underscore.js в тегах <script>
, так как это удобное место для вставки шаблонов в HTML. Вот фрагмент их кода, где они захватывают шаблон и предоставляют его движку шаблонов Underscore:
TopAnswerView = Backbone.View.extend({
template: _.template($("#topanswer").html()),
events: {
"click .add-answer": "addAnswerToCV"
},
Ответ 2
Ключ находится в атрибуте script типа. Установив его в type = "text/html" , он не запускается движком JavaScript браузера. Вместо этого он используется для других вещей, например, для шаблонов. Этот пример, похоже, использует эти теги для шаблонов.
Ознакомьтесь с этой веб-трансляцией MIX 2011, которая показывает, как что-то подобное используется в Knockout.js:
http://channel9.msdn.com/events/mix/mix11/FRM08