Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<wc-example>, его код лежит здесь.<x-todo> элементов.<template> это не совсем темплейтинг. Скорее механизм отложить фрагмненты разметки, пока они не пригодятся. Подставлять данные в содержимое <template> нужно вручную, с помощью js.applyAuthorStyles = false)Они дают возможность вставлять в документ фрагменты разметки из других файлов.
Да. Это жопа конкретная
<fieldset class="gbqff gb_j" id="gbqff">
<legend class="gbxx"></legend>
<div id="gbfwa" class="gbqfwa ">
<div id="gbqfqw" class="gbqfqw ">
<div id="gbqfqwb" class="gbqfqwc">
<table cellspacing="0" cellpadding="0" id="gs_id0" class="gstl_0 lst-t" style="height: 27px; padding: 0px;">
<tbody>
<tr>
<td id="gs_ttc0" style="white-space: nowrap;" dir="ltr"></td>
<td id="gs_tti0" class="gsib_a">
<div id="gs_lc0" style="position: relative;">
<input id="gbqfq" class="gbqfif" name="q" type="text" autocomplete="off" value="" style="border: none; padding: 0px; margin: -0.0625em 0px 0px; height: 1.25em; width: 100%; background-image: url(data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D); background-color: transparent; position: absolute; z-index: 6; left: 0px; outline: none; background-position: initial initial; background-repeat: initial initial;" dir="ltr" spellcheck="false">
<div class="gbqfif" id="gs_sc0" style="background-color: transparent; color: transparent; padding: 0px; position: absolute; z-index: 2; white-space: pre; visibility: hidden; background-position: initial initial; background-repeat: initial initial;"></div>
<input class="gbqfif" disabled="" autocomplete="off" aria-hidden="true" id="gs_taif0" dir="ltr" style="border: none; padding: 0px; margin: 0px; height: auto; width: 100%; position: absolute; z-index: 1; background-color: transparent; -webkit-text-fill-color: silver; color: silver; left: 0px; visibility: hidden;"><input class="gbqfif" disabled="" autocomplete="off" aria-hidden="true" id="gs_htif0" dir="ltr" style="border: none; padding: 0px; margin: 0px; height: auto; width: 100%; position: absolute; z-index: 1; background-color: transparent; -webkit-text-fill-color: silver; color: silver; transition: all 0.218s; -webkit-transition: all 0.218s; opacity: 0; left: 0px; text-align: left;">
</div>
</td>
<td class="gsib_b">
<div class="gsst_b" id="gs_st0" style="line-height: 27px;" dir="ltr">
<a class="gsst_a" href="javascript:void(0)" aria-label="Listening for "Ok Google"" style="display: none;"><span class="gsri_ha gsst_e" id="gsri_hok0"></span></a><a class="gsst_a" href="javascript:void(0)" aria-label="Search by voice"><span class="gsri_a gsst_e" id="gsri_ok0"></span></a>
<div id="chmo">
<div id="chm">
<div class="chmp">
<div class="chmpi chmp"></div>
</div>
<div style="display: none;">
<div class="chma"></div>
<div>Not listening. Something went wrong.</div>
<div><a>Restart listening</a><a style="padding-left: 10px;">Help</a></div>
</div>
<div style="display: none;">
Hotword detection is off.
<div><a>Start listening for "Ok Google"</a></div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</fieldset>
<div class="google-search"></div>
<google-search></google-search>
<template> это не совсем шаблонизатор. Его задача не в том, чтобы взять данные и подставить их в разметку. Это скорее «хранилище» html кода, который вы планируете использовать не сразу, как только документ загрузится, а позже.content. Сомневаюсь что браузеры тут могут накуролесить.Еще пример (более подходящий) — у нас есть страница с комментариями к статье на хабре. Вместо того чтобы изобретать велосипед или шаблон внутри js кода или делать скрытый div а потом копировать его, можно один раз создать template и вставлять его на страницу каждый раз с новыми данными по кнопке «Написать».По сути точно так же оно происходит и сейчас, только не в template, а в div, js или через ajax. Если есть шаблон, то как вы его не назовите он шаблон и есть. И точно так же количество манипуляций не изменится. Мне кажется разница только в том, что раньше мы это делали разными способами, а сейчас эта практика унифицируется.
var html = '<li><img src="'+ url1 +'"></li><li><img src="'+ url2 +'"></li>...'
. IDE с таким кодом работают плохо. Скрытые теги будут обрабатываться, да и могут нарушать валидность документа. Новый тег от этих проблем избавит.Новый тег от этих проблем избавит.Сэр, но как?
ng-src, нужные лишь затем, чтобы браузер не послал на сервер запрос до подстановки всех переменных. Исчезнут стили, задача которых — скрыть от пользователя служебный мусор — опять-таки, до первого раскрытия переменных.<template> просто держит ваш шаблон «на готове», как его заполнять данными — дело ваше.<template> и Object.observe для подстановки данных в шаблоны: polymer data-bindings.Мне, почему-то вспомнились слайдеры, которые сегодня используются повсеместно, одна лишь возможность делать слайдер с помощью template уже греет душу.Какое именно предполагается в этом преимущество? Вы хотите вставить слайдер именно в DOM и редактировать его DOM дереве? Если вставить в основную страницу, то это очень плохая идея. Если шаблон в отдельном html файле, то это будет менее эффективно, чем компонентная система на JS. Если вы хотите редактирвать в IDE, то это не проблема и задача shadow DOM. Это можно сделать и сейчас существующими средствами и эффективнее.
— И как сказано ниже в комментариях «У кастомных тэгов можно задавать свой прототип для объектов DOM — вот это реально крутая вещь»Не могли бы вы пояснить зачем вообще это нужно? Зачем нам прототипы в DOM? Нужно наоборот избегать манипуляции элементами DOM.
Карусель, которую Вы привели в пример, не семантична изначально ну и ID в веб инспекторе смотрится страшно.Вас напугали картинки закодированные в коде страницы? Ну так это не элемент семантики. Замените в уме эти картинки привычными вам img src="". Это же просто страничка так сделана, что бы без внешних файлов можно было скопировать.
Когда я говорил про слайдер, я имел ввиду ситуацию с предзагрузкой изображений.Не совсем понимаю связь template с предзагрузкой изображений. Не могли бы вы пояснить, как сделать предзагрузку картинок с помощью template? И вопрос про прототипы остается.
Не совсем понимаю связь template с предзагрузкой изображений. Не могли бы вы пояснить, как сделать предзагрузку картинок с помощью template?
И вопрос про прототипы остается.
У меня как то тоже недавно была идея добавить библиотеку в PHP которая позволяла бы простые типы хранить в объектах, а вместо функций использовать методы этих объектов (под впечатлением от Python и JS)
var html = '<img src="' + image +'>"'. Он может быть только временным решением. Библиотеки шаблонов, по сути, делают тоже самое, только эскейпят данные. Вариант сносный, но выглядит скорее как хак.<template><template>.<template> с нужным шаблоном. Его содержимое уже распаршено, с ним можно работать как с любым элементов в DOM.<template> определённо однородней и «чище».<template> работаем на очень ограниченном его «участке».Уже сейчас все это лаконично и шустро работает, даже без shadow dom.
2. Подставить данные, используя DOM API. Нет необходимости заботится о вредоностности данных.Где тут написано, что это должно делаться без js?
2. Провернуть множество операций со строками. Эскейпить данные вручную.Почему во втором случае у вас получается без кода логики и не нужно эскейпить.
и
2. Подставить данные, используя DOM API. Нет необходимости заботится о вредоностности данных.
a). Загрузить AJAX-ом
б). Найти в DOM элемент, содержащий шаблон, извлечь шаблон оттуда.
Найти в DOM тег <template> с нужным шаблоном. Его содержимое уже распаршено, с ним можно работать как с любым элементов в DOM.
Подставить данные, используя DOM API. Нет необходимости заботится о вредоностности данных.
Провернуть множество операций со строками. Эскейпить данные вручную.
Вставить получившуюся строку в DOM. Браузер парсит строку, рендерит содержимое.
Сэр, но как?
Куда оно денется?
<template>
<li></li>
<li></li>
</template>
оздаешь шаблон, данные сами туда фьюить, и готово
и не надо ничего эскейпитьДа, я именно так и говорил. Где вы тут нашили «и не надо никакого js»?
innerHTML.> Содержимое тегов парсится браузером, но не вызывает выполнение скриптов
Вообще скрипты итак не выполняются при вставке с помощью innerHTML.
<template>
<script>alert(1);</script>
</template>
alert(1); не выполнится до тех пор, пока мы не сделаем импорт содержимого шаблона: var tmpl = document.querySelector('template');
var tmplBody = document.importNode(tmpl.content);
document.body.appendChild(tmplBody);
<my-tabs/> будет эквивалентен <ul class="my-tabs"/>. Поэтому в плане ускорения стандартизации никаких значительных плюсов у кастомных тэгов нет перед теперешним подходом создания виджетов.jquery и querySelector() это подтверждает. Promises возможно когда-нибудь попадут в стандарт. <img src="bad-url"></img> <!-- почему так-то? -->
<img src="bad-url" /> <!-- а не так? -->
<img src="bad-url">
Когда-нибудь мечтали о том, чтобы в HTML был тег <menu>
<content> создаёт insertion point, куда проецируется содержимое хоста.select тега <content>. Как в этом примере (для просмотра нужен Chrome Canary со включенными флагами). <article>bla bla</article>
<div class="picture"></div>
<content select="article"></content>
<figure>
<content select=".picture"></content>
</figure>
imported = document.importNode(content);
var comment = t.content.cloneNode(true)
Web Components — будущее Web