Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在父帧中加载Mootools,然后在iFrame中重新使用?_Iframe_Mootools - Fatal编程技术网

是否可以在父帧中加载Mootools,然后在iFrame中重新使用?

是否可以在父帧中加载Mootools,然后在iFrame中重新使用?,iframe,mootools,Iframe,Mootools,范例 --开始:index.html-- 索引 废话 --end:index.html-- --开始:iframe.html-- iFrame $('inputField')。设置('value','updated text') --end:iframe.html-- 当前,$('inputField')。设置('value','Update text');不起作用:-\不,iframe.html是一个独立的页面。它不会“继承”上一页的任何内容。是的,假设

范例

--开始:index.html--



索引




废话



--end:index.html--

--开始:iframe.html--



iFrame







$('inputField')。设置('value','updated text')



--end:iframe.html--


当前,$('inputField')。设置('value','Update text');不起作用:-\

不,iframe.html是一个独立的页面。它不会“继承”上一页的任何内容。

是的,假设iframe及其父窗口位于同一个域中,则可以在父窗口中加载Mootools脚本一次,然后以编程方式扩展iframe的窗口和文档,而不是在iframe中重新加载脚本。正如你所注意到的,这不是默认的行为,而且可能是出于一个很好的理由——我猜大多数人会告诉你,这是一个不值得的麻烦

事实上,以前是这样做的,但最终被认为是太多的黑客行为,不值得长期维护作为框架的一部分,所以他们放弃了它-这就是为什么IFrame的文档有点奇怪的原因(“IFrame方法:构造函数,创建一个IFrame HTML元素,并使用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>
 <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>

父母亲
var mooFrame=新的IFrame(“innerFrame”,{
src:“iframe.html”,
活动:{
加载:函数(){
var mooEl=新元素('脚本'{
键入:“text/javascript”,
src:“mootools.js”,
活动:{
加载:函数(){
//通过iframe传递给mooFrame
这是pageReady();
}.绑定(此)
}
});             
this.contentDocument.head.appendChild(moel);
}           
}       
});   
iframe.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>
 <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>

Iframe
parent.mooFrame.pageReady=函数(){
/*将您的iframe javascript放在这里*/
$('iframe_element').set(“text”,“Fancy!”);
};
更新(7月29日):我又一次玩弄了这个想法,意识到有一种相当明显但相当笨拙的方法可以将parent index.html窗口中定义的Mootools功能转移到内部iframe:只需将整个Mootools源包含到父窗口中即可(从现有脚本元素中删除src属性并添加id),并将该新元素的文本复制到新的脚本节点中,该节点被注入到iframe的头部。以这种方式在script元素中内联Mootools代码,可以访问元素的内容,而当通过src属性从外部文件加载javascript时,无法访问元素的内容

当然,只有当父窗口和iframe在同一个域上时(与上面提供的代码相同),这个概念才相关

一个明显的缺点是Mootools源没有缓存。我不确定是否存在这样的用例,即这种方法比仅在父级和iframe中包含Mootools更为优化。在任何情况下,请将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>

父母亲
**将mootools-core.js的内容复制粘贴到此处**
var mooFrame=新的IFrame(“innerFrame”,{
src:“iframe.html”,
活动:{
加载:函数(){
var mooEl=新元素('脚本'{
id:“mootools\u iframe\u core”,
键入:“text/javascript”,
html:$('mootools_js').innerHTML
});
this.contentDocument.head.appendChild(moel);
这是pageReady();
}           
}       
});

我之前的回答提供了两种执行相关任务的可选方法(“在父框架中加载Mootools,然后在iframes中重新使用它”)。第一种方法不是“重复使用”"Mootools功能加载到父框架中,但这是在内部iframe中加载脚本的另一种方法。第二种方法只是通过将整个Mootools核心源内联到脚本元素中,然后将该元素的内容复制到iframe hea中的脚本元素中,从而在脚本上进行复制d(几乎不是最优的)

下面的方法以编程方式扩展内部iframe的窗口和文档对象。同样,假设父页面和iframe都在同一个域中

在我的(简短而简单的)测试中,在父级和iframe中加载源导致在大约130ms时传输72.1kb(以完成加载父级和iframe页面),而加载源然后扩展iframe的页面为36.8kb,加载父级和iframe大约需要85ms。(这是服务器上的gzip…未压缩/未统一核心源的文件大小约为134 kb)

对于这种方法,对mootools核心源代码进行了一些简单的添加/编辑
<script type="text/javascript" src="mootools-core-init.js"></script>
<script type="text/javascript">parent.initMootoolsCore.call(window);</script>