0

我在网页上有多个 Etherpad 实例作为 iFrame。Etherpad 的 ep_tables 插件使用 YUI 库(近 12 个不同的 JS 文件)。这会导致站点加载大量时间,因为这些 YUI 文件会为每个 etherpad 实例加载。

所以情况就是这样——我只想为第一个 etherpad 实例加载这些 YUI 文件一次,而其余实例不应该加载 YUI 文件并以某种方式使用已经加载的 YU​​I 文件。我该如何实现呢?

PS:每个 etherpad 实例都是一个 iFrame,YUI 库是该 iFrame 内 html 的一部分。

4

2 回答 2

0

我的意思是,这个脚本应该缓存浏览器端而不是问题。如果您检查您最喜欢的检查器控制台的网络窗格,只要它从同一个地方加载相同的资源。这里的大多数人都问如何不从缓存中加载。

但是本着发明一些毫无意义的东西的精神,我会这样做:

function addToAllFrames(var scriptName){

    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("GET","scriptName",true);
    xmlhttp.send();
    xmlhttp.onreadystatechange=function(){
       if (xmlhttp.readyState==4 && xmlhttp.status==200){
           script.type = "text/javascript";
           script.src = xmlhttp.responseText;
           var frames= document.getElementsByTagName("iframe");
           for (var x = 0; x < frames.length; x++) {
               frames[x].append(script);
           }
       }
    } 
}

并为我想固定到 iFrame 的每个脚本调用它。

于 2015-04-10T19:26:33.150 回答
0

如果我真的很疯狂并且无法控制地创建新框架。我会选择类似的东西:

var globalScriptObject={};    
function addToAllFrames(var scriptName){
    if (!globalScriptObject[scriptName].length){
        xmlhttp=new XMLHttpRequest();
        xmlhttp.open("GET","scriptName",true);
        xmlhttp.send();
        xmlhttp.onreadystatechange=function(){
           if (xmlhttp.readyState==4 && xmlhttp.status==200){
                 globalScriptObject[scriptName] = xmlhttp.responseText;
           }
        }
    }
     var frames= document.getElementsByTagName("iframe");
     for (var x = 0; x < frames.length; x++) {
        if (!frames[x].getElementsByName(scriptName).length){
            script.setAttribute('type', 'text/javascript');
            script.setAttribute('src', globalScriptObject[scriptName]);
            script.setAttribute('name', scriptName);
            frames[x].append(script);
         }
     }
}

并在 iFrame 创建回调上调用它。

你包装一个:

if (frames[x].hasAttribute("data-YUI"){
}

<iframe data-YUI="true" src="">

当您创建 iFrame 时,需要专门寻找一些东西。如果页面上有其他 iframe。

尽管如此,在很多方面完全没有意义。依赖缓存。

于 2015-04-10T20:00:12.483 回答