ÐÐ¾Ð²Ð°Ñ ÑпеÑиÑикаÑÐ¸Ñ Â«HTML Imports» опиÑÑваеÑ, как вÑÑавиÑÑ Ð¾Ð´Ð¸Ð½ докÑÐ¼ÐµÐ½Ñ Ð² дÑÑгой пÑи помоÑи HTML-Ñега <link rel="import">.
ÐаÑем?
ÐÑ Ð²ÐµÐ´Ñ Ð¸ Ñак можем вÑÑавлÑÑÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð² докÑменÑ, пÑи помоÑи <iframe>, заÑем нÑжен еÑÑ ÐºÐ°ÐºÐ¾Ð¹-Ñо импоÑÑ? ЧÑо не Ñак Ñ iframe?
â¦Ð¡ iframe вÑÑ Ñак. Ðднако, по ÑÐ²Ð¾ÐµÐ¼Ñ ÑмÑÑÐ»Ñ iframe â ÑÑо оÑделÑнÑй докÑменÑ.
- ÐлÑ
iframeÑоздаÑÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑÐ²Ð¾Ñ Ð¾ÐºÑÑжение, Ñ Ð½ÐµÐ³Ð¾ Ñвой обÑекÑwindowи Ñвои пеÑеменнÑе. - ÐÑли
iframeзагÑÑжен Ñ Ð´ÑÑгого домена, Ñо взаимодейÑÑвие Ñ Ð½Ð¸Ð¼ возможно ÑолÑко ÑеÑезpostMessage.
ÐÑо Ñ Ð¾ÑоÑо, когда нÑжно дейÑÑвиÑелÑно в одной ÑÑÑаниÑе оÑобÑазиÑÑ ÑодеÑжимое дÑÑгой.
Ð ÑÑо, еÑли нÑжно вÑÑÑоиÑÑ Ð´ÑÑгой докÑÐ¼ÐµÐ½Ñ ÐºÐ°Ðº еÑÑеÑÑвеннÑÑ ÑаÑÑÑ ÑекÑÑего? С единÑм ÑкÑипÑовÑм пÑоÑÑÑанÑÑвом, единÑми ÑÑилÑми, но пÑи ÑÑом â дÑÑгой докÑменÑ.
ÐапÑимеÑ, ÑÑо нÑжно Ð´Ð»Ñ Ð¿Ð¾Ð´Ð³ÑÑзки внеÑÐ½Ð¸Ñ ÑаÑÑей докÑменÑа (веб-компоненÑ) ÑнаÑÑжи. РжелаÑелÑно не имеÑÑ Ð¿Ñоблем Ñ ÑазнÑми доменами: еÑли Ñж Ð¼Ñ Ð´ÐµÐ¹ÑÑвиÑелÑно Ñ Ð¾Ñим подклÑÑиÑÑ HTML Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ домена в ÑÑÑаниÑÑ Ð½Ð° дÑÑгом â Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÑо ÑделаÑÑ Ð±ÐµÐ· «плÑÑок Ñ Ð±Ñбном».
ÐнаÑе говоÑÑ, <link rel="import"> â ÑÑо аналог <script>, но Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑеннÑÑ
докÑменÑов, Ñ Ñаблонами, библиоÑеками, веб-компоненÑами и Ñ.п. ÐÑÑ ÑÑÐ°Ð½ÐµÑ Ð¿Ð¾Ð½ÑÑнее, когда Ð¼Ñ Ð¿Ð¾ÑмоÑÑим деÑали.
ÐÑÐ¸Ð¼ÐµÑ Ð²ÑÑавки
СинÑакÑиÑ:
<link rel="import" href="http://site.com/document.html">
- РоÑлиÑие оÑ
<iframe>Ñег<link rel="import">Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð² лÑбом меÑÑе докÑменÑа, даже в<head>. - ÐÑи вÑÑавке ÑеÑез
<iframe>докÑÐ¼ÐµÐ½Ñ Ð¿Ð¾ÐºÐ°Ð·ÑваеÑÑÑ Ð²Ð½ÑÑÑи ÑÑейма. Ð ÑлÑÑае Ñ<link rel="import">ÑÑо не Ñак, по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ Ð²Ð¾Ð¾Ð±Ñе не показÑваеÑÑÑ.
HTML, загÑÑженнÑй ÑеÑез <link rel="import"> Ð¸Ð¼ÐµÐµÑ Ð¾ÑделÑнÑй DOM докÑменÑа, но ÑкÑипÑÑ Ð² нÑм вÑполнÑÑÑÑÑ Ð² обÑем конÑекÑÑе ÑÑÑаниÑÑ.
Файл, загÑÑженнÑй ÑеÑез <link rel="import">, обÑабаÑÑваеÑÑÑ, вÑполнÑÑÑÑÑ ÑкÑипÑÑ, ÑÑÑоиÑÑÑ DOM докÑменÑа, но не показÑваеÑÑÑ, а запиÑÑваеÑÑÑ Ð² ÑвойÑÑво link.import.
ÐÑ Ñами ÑеÑаем, где и когда его вÑÑавиÑÑ.
РпÑимеÑе ниже <link rel="import" href="timer.html"> подклÑÑÐ°ÐµÑ Ð´Ð¾ÐºÑÐ¼ÐµÐ½Ñ timer.html и, поÑле его загÑÑзки, вÑзÑÐ²Ð°ÐµÑ ÑÑнкÑÐ¸Ñ show. ÐÑа ÑÑнкÑÐ¸Ñ ÑеÑез link.import.querySelector('time') вÑбиÑÐ°ÐµÑ Ð¸Ð½ÑеÑеÑÑÑÑÑÑ ÑаÑÑÑ Ð¿Ð¾Ð´Ð³ÑÑжÑнного докÑменÑа и вÑÑавлÑÐµÑ ÐµÑ Ð² ÑекÑÑий:
<!DOCTYPE HTML>
<html>
<body>
<script>
function show() {
var time = link.import.querySelector('time')
document.body.appendChild(time);
};
</script>
<link rel="import" id="link" onload="show()" href="timer.html">
</body>
</html>
Ð Ñайле timer.html наÑ
одиÑÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸ ÑкÑипÑ, коÑоÑÑй его «оживлÑеÑ»:
<!DOCTYPE HTML>
<html>
<body>
<time id="timer">0</time>
<script>
var localDocument = document.currentScript.ownerDocument;
var timer = localDocument.getElementById('timer');
var timerId = setInterval(function() {
timer.innerHTML++;
}, 1000);
</script>
</body>
</html>
<!DOCTYPE HTML>
<html>
<body>
<script>
function show() {
var time = link.import.querySelector('time')
document.body.appendChild(time);
};
</script>
<link rel="import" id="link" onload="show()" href="timer.html">
</body>
</html><!DOCTYPE HTML>
<html>
<body>
<time id="timer">0</time>
<script>
var localDocument = document.currentScript.ownerDocument;
var timer = localDocument.getElementById('timer');
var timerId = setInterval(function() {
timer.innerHTML++;
}, 1000);
</script>
</body>
</html>ÐажнÑе деÑали:
- ÐоÑле загÑÑзки вÑе ÑкÑипÑÑ Ð² подклÑÑÑнном
timer.htmlвÑполнÑÑÑÑÑ Ð² конÑекÑÑе оÑновной ÑÑÑаниÑÑ, Ñак ÑÑоtimerи дÑÑгие пеÑеменнÑе ÑÑанÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑми пеÑеменнÑми ÑÑÑаниÑÑ. - ÐеÑеменнаÑ
documentâ ÑÑо докÑÐ¼ÐµÐ½Ñ Ð¾Ñновной ÑÑÑаниÑÑ. ÐÐ»Ñ Ð´Ð¾ÑÑÑпа к импоÑÑиÑованномÑ, Ñо еÑÑÑ ÑекÑÑÐµÐ¼Ñ Ð´Ð¾ÐºÑменÑÑ Ð¸Ð·Ð½ÑÑÑиtimer.htmlего можно полÑÑиÑÑ ÐºÐ°Ðºdocument.currentScript.ownerDocument. - Ð¢Ð°Ð¹Ð¼ÐµÑ Ð² загÑÑженном докÑменÑе наÑÐ¸Ð½Ð°ÐµÑ ÑабоÑаÑÑ ÑÑазÑ, новÑй докÑÐ¼ÐµÐ½Ñ Ð¾Ð¶Ð¸Ð²Ð°ÐµÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле загÑÑзки, Ñ Ð¾ÑÑ Ð´Ð¾ пеÑеноÑа Ñзлов в оÑновной докÑÐ¼ÐµÐ½Ñ ÑÑого Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¸ не видно.
РпÑимеÑе вÑÑе ÑодеÑжимÑм импоÑÑа ÑпÑавлÑл оÑновной докÑменÑ, но timer.html мог Ð±Ñ Ð¸ показаÑÑ Ñам ÑÐµÐ±Ñ Ð²Ñзовом document.body.appendChild(timer) или вÑзваÑÑ ÑÑнкÑÐ¸Ñ Ñ Ð²Ð½ÐµÑнего докÑменÑа, Ñак как Ñ Ð½Ð¸Ñ
ÐµÐ´Ð¸Ð½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи. Тогда не понадобилÑÑ Ð±Ñ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ onload.
ÐÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð²ÑÑавки, на ÑÑÐ¾Ñ Ñаз докÑÐ¼ÐµÐ½Ñ ÑолÑко подклÑÑÐ°ÐµÑ <link>, а ÑÐ°Ð¹Ð¼ÐµÑ Ð²ÑÑавлÑÐµÑ ÑÐµÐ±Ñ Ñам:
<!DOCTYPE HTML>
<html>
<head>
<link rel="import" id="link" href="timer.html">
</head>
<body></body>
</html><!DOCTYPE HTML>
<html>
<head>
<style>
#timer {
color: red;
}
</style>
</head>
<body>
<p id="timer">0</p>
<script>
var localDocument = document.currentScript.ownerDocument;
var timer = localDocument.getElementById('timer');
var timerId = setInterval(function() {
timer.innerHTML++;
}, 1000);
document.body.appendChild(timer);
</script>
</body>
</html>ÐбÑаÑим внимание â ÑÑили импоÑÑа попадаÑÑ Ð² конÑекÑÑ ÑÑÑаниÑÑ. РпÑимеÑе вÑÑе импоÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ð» и ÑÑÐ¸Ð»Ñ Ð´Ð»Ñ #timer и Ñам ÑлеменÑ.
Ðеб-компоненÑÑ
ÐмпоÑÑ Ð·Ð°Ð´Ñман как ÑаÑÑÑ Ð¿Ð»Ð°ÑÑоÑÐ¼Ñ Web Components.
ÐÑедполагаеÑÑÑ, ÑÑо главнÑй докÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼Ð¿Ð¾ÑÑиÑоваÑÑ ÑайлÑ-опÑеделениÑ, в коÑоÑÑÑ Ð±ÑдÑÑ Ð²Ñе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе HTML, JS и CSS Ð´Ð»Ñ ÑлеменÑов, а заÑем иÑполÑзоваÑÑ Ð¸Ñ .
ÐÑимеÑ:
<link rel="import" href="ui-tabs.html">
<link rel="import" href="ui-dialog.html">
<ui-tabs>...</ui-tabs>
<ui-dialog>...</ui-dialog>
Ð ÑледÑÑÑей главе Ð¼Ñ ÑазбеÑÑм ÑаÑÑиÑеннÑй пÑÐ¸Ð¼ÐµÑ Ð½Ð° ÑÑÑ ÑемÑ.
ÐовÑоÑное иÑполÑзование
ÐовÑоÑнÑй импоÑÑ Ñ Ñем же URL иÑполÑзÑÐµÑ Ñже ÑÑÑеÑÑвÑÑÑий докÑменÑ.
ÐÑли Ñайл libs.html импоÑÑиÑован два Ñаза, Ñо CSS и ÑкÑипÑÑ Ð¸Ð· него подклÑÑаÑÑÑ Ð¸ вÑполнÑÑÑÑ Ñовно один Ñаз.
ÐÑо можно иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ Ð½Ðµ подгÑÑжаÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñе завиÑимоÑÑи много Ñаз. Ð Ñама ÑÑÑаниÑа и ÐµÑ Ð¸Ð¼Ð¿Ð¾ÑÑÑ, и иÑ
подимпоÑÑÑ, и Ñак далее, могÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑаÑÑ libs.html без опаÑÐµÐ½Ð¸Ñ Ð»Ð¸Ñний Ñаз пеÑезагÑÑзиÑÑ Ð¸ вÑполниÑÑ ÑкÑипÑÑ.
ÐапÑимеÑ:
-
ÐлавнÑй Ñайл
index.htmlподклÑÑÐ°ÐµÑ Ð´Ð¾ÐºÑменÑÑ:<link rel="import" href="ui-tabs.html"> <link rel="import" href="ui-dialog.html"> ... -
ui-tabs.htmlподклÑÑаеÑlibs.html:<link rel="import" href="libs.html"> ...template и код Ð´Ð»Ñ Ñабов... -
ui-dialog.htmlÑакже иÑполÑзÑеÑlibs.html:<link rel="import" href="libs.html"> ...template и код Ð´Ð»Ñ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²...
Файл libs.html пÑи ÑÑом бÑÐ´ÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑÑн ÑолÑко один Ñаз. ÐÑо позволÑÐµÑ Ð½Ðµ боÑÑÑÑÑ Ð»Ð¸Ñнего дÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñек, иÑполÑзÑемÑÑ
пÑи опиÑании множеÑÑва компоненÑ.
ÐÑого
Тег <link rel="import"> позволÑÐµÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑиÑÑ Ð»Ñбой докÑÐ¼ÐµÐ½Ñ Ðº ÑÑÑаниÑе, пÑиÑÑм:
- СкÑипÑовое пÑоÑÑÑанÑÑво и ÑÑили Ñо ÑÑÑаниÑей бÑдÑÑ Ð¾Ð±Ñие.
- ÐокÑÐ¼ÐµÐ½Ñ DOM â оÑделÑнÑй, он доÑÑÑпен как
link.importÑнаÑÑжи, а из внÑÑÑеннего ÑкÑипÑа â ÑеÑезdocument.currentScript.ownerDocument. Ðожно без пÑоблем пеÑеноÑиÑÑ ÑлеменÑÑ Ð¸Ð· главного докÑменÑа в импоÑÑ Ð¸ наобоÑоÑ. - ÐмпоÑÑÑ Ð¼Ð¾Ð³ÑÑ ÑодеÑжаÑÑ Ð´ÑÑгие импоÑÑÑ.
- ÐÑли какой-Ñо URL импоÑÑиÑÑеÑÑÑ Ð¿Ð¾Ð²ÑоÑно â подклÑÑаеÑÑÑ Ñже гоÑовÑй докÑменÑ, без повÑоÑного вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑкÑипÑов в нÑм. ÐÑо позволÑÐµÑ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ Ð´ÑблиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñи иÑполÑзовании одной библиоÑеки во множеÑÑве меÑÑ.

ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)