Да, при условии, что iframe и его родительское окно находятся в одном домене, можно загрузить сценарии Mootools один раз в родительский, а затем программно расширить окно и документ IFrame вместо повторной загрузки сценария вIFrame.Как вы заметили, это не стандартное поведение, и, вероятно, по уважительной причине - я думаю, большинство людей скажут вам, что это больше проблем, чем стоит.
На самом деле, ярлык IFrameконструктор элемента раньше делал именно эту вещь, но в конечном счете это считалось слишком большим взломом и не стоило усилий, чтобы поддерживать его как часть долгосрочной структуры, поэтому они его отбросили - вот почему документация дляIFrame довольно странный (" Метод IFrame: конструктор, создает HTML-элемент IFrame и расширяет его окно и документ с помощью MooTools. ", а затем сразу после примера " Примечания: IFrameокно и документ не будут расширены с помощью методов MooTools.").
Итак, самый простой способ использовать $ (..) в вашем iframe - это просто включить iframe в скрипт Mootools.,Если вам кажется, что вы можете сделать так, чтобы родительское окно вставляло скрипт Mootools в заголовок iframe, например:
index.html
<html>
<head>
<title>Parent</title>
<script type="text/javascript" src="mootools.js"></script>
</head>
<body>
<iframe id="innerFrame"></iframe>
<script type="text/javascript">
var mooFrame = new IFrame("innerFrame", {
src:"iframe.html",
events: {
load: function(){
var mooEl = new Element('script', {
type: 'text/javascript',
src: "mootools.js",
events: {
load: function(){
//passed to mooFrame by the iframe
this.pageReady();
}.bind(this)
}
});
this.contentDocument.head.appendChild(mooEl);
}
}
});
</script>
</body>
</html>
iframe.html
<html>
<head>
<title>Iframe</title>
</head>
<body>
<div id="iframe_element"></div>
<script type="text/javascript">
parent.mooFrame.pageReady = function(){
/* Put your iframe javascript in here */
$('iframe_element').set("text", "Fancy!");
};
</script>
</body>
</html>
Обновление (29 июля): Я снова дурачился с этой идеей и понял, что есть довольно очевидный, хотя и довольно тупой способперенести функциональность Mootools, определенную в родительском окне index.html, во внутренний iframe: просто включите весь источник Mootools в родительское окно (удалите атрибут src из существующего элемента script и добавьте id) и скопируйте текст этого огромного элементав новый узел сценария, который вставляется в заголовок iframe.Таким образом, встраивание кода Mootools в элемент script дает вам доступ к содержимому элемента, которое вы не получаете, когда javascript загружается из внешнего файла через атрибут src.
Конечно,this..concept уместно только в том случае, если родительское окно и iframe находятся в одном домене (то же, что и код, приведенный выше).
Очевидным недостатком является то, что источник Mootools не кэшируется.Я не уверен, есть ли вариант использования, где этот метод был бы более оптимальным, чем просто включение mootools как в parent, так и в iframe.В любом случае измените файл index.html следующим образом:
<html>
<head>
<title>Parent</title>
<script type="text/javascript" id="mootools_js">
**COPY-PASTE THE CONTENTS OF mootools-core.js HERE**
</script>
</head>
<body>
<iframe id="innerFrame"></iframe>
<script type="text/javascript">
var mooFrame = new IFrame("innerFrame", {
src:"iframe.html",
events: {
load: function(){
var mooEl = new Element('script', {
id: 'mootools_iframe_core',
type: 'text/javascript',
html: $('mootools_js').innerHTML
});
this.contentDocument.head.appendChild(mooEl);
this.pageReady();
}
}
});
</script>
</body>
</html>