【问题标题】:Load HTML frames in a specific order without back button problems?以特定顺序加载 HTML 框架而没有后退按钮问题?
【发布时间】:2010-09-22 08:05:19
【问题描述】:

我有一个使用框架集的网页。

由于脚本和对象依赖性,我需要按特定顺序加载帧。

我使用这个例子作为模板: The JavaScript Source: Navigation: Frames Load Order

这会加载一个空页面来代替我最后需要加载的页面,然后在第一页加载后将其替换为正确的页面。

但是:我还需要使用浏览器的后退按钮。如果您在上面的链接中运行示例,让两个框架都加载,然后单击返回按钮,顶部框架恢复到临时空白页面。然后需要再次单击返回按钮以导航到框架集之前的页面。

有没有一种方法可以强制框架以特定顺序加载而没有此“后退”按钮行为 - 或者有一种方法可以强制“后退”按钮跳过空白页面?

这需要适用于 Internet Explorer 6 和 7,最好也适用于 Firefox 3。

【问题讨论】:

    标签: html load frames back-button


    【解决方案1】:

    你在这篇文章中提到了很多......

    这是一个遗留系统。框架集是必需的。

    如果您使用的是旧系统,那么我认为您应该接受框架集在浏览器的后退按钮方面的行为方式。如果它确实是一个遗留系统,则无需修复此行为。如果它实际上不是遗留系统并且您需要解决此问题,则需要避免使用框架集。框架集已从 HTML 标准中弃用,不应使用。

    【讨论】:

    • 要是这么简单就好了。
    【解决方案2】:

    为什么不按所需顺序使用三个 iframe,然后将它们调整大小/移动到适当的位置?

    <iframe id="a1" src="page-to-load-first.htm"></iframe>
    <iframe id="a2" src="page-to-load-second.htm"></iframe>
    <iframe id="a3" src="page-to-load-third.htm"></iframe>
    <script>
    function pos(elem,x,y,w,h) {
       if (!elem.style) elem=document.getElementById(elem);
       elem.style.position='absolute';
       elem.style.top = y+'px';
       elem.style.left= x+'px';
       elem.style.width=w+'px';
       elem.style.height=h+'px';
    }
    window.onload = function() {
        window.onresize=function() {
            var w = window.innerWidth || document.documentElement.clientWidth;
            var h = window.innerHeight || document.documentElement.clientHeight;
            var w3 = w/3;
            var h2 = h/2;
            pos('a1',0,0,w3,h); /* left 1/3rd */
            pos('a2',w3,0,w3+w3,h2);
            pos('a3',w3,h2,w3+w3,h2);
        };
        window.onresize();
    };
    </script>
    

    【讨论】:

    • 这是一个遗留系统。框架集是必需的。即使我可以使用 iframe,您的示例也不会产生任何影响:它们出现在页面上的顺序并不能保证它们会按该顺序加载。假设第一个 iframe 在 2 秒内加载,第二个框架在 1 秒内加载?
    • IFrame 是常规的 dom 元素(与框架不同),这意味着可以使用 document.createElement() 来创建它们。使用 window.onresize 可用于模拟框架集环境。你为什么一直说“这是一个遗留系统”。你的意思是不能更改初始内容?
    • 传统 = 系统的其余部分期望页面驻留在框架中。更改模型意味着更改其他地方的代码。 IFrame 可能更容易控制流程。必须尝试一下,但仍然希望解决框架问题,因为 IFrame 对我来说可能不是一个可行的选择。
    • IFrame 的工作方式与其他框架很相似;它们存在于 window.frames 中,如果它们有名称(与 id 匹配),那么 target="" 就像你期望的那样工作。
    【解决方案3】:

    使用 JavaScript 自己构建框架:

    <html>
    <head>
    <script>
    function makeFrame(frameName) {
        var newFrame = document.createElement('frame');
        newFrame.id=frameName;
        if(frameName=="B") {
            newFrame.onload=function() {makeFrame("C")};
            newFrame.src = 'http://www.google.com';
        }
        else {
            newFrame.src = 'http://www.yahoo.com';
        }
        document.getElementById('A').appendChild(newFrame);
    
    }
    </script>
    </head>
    <frameset name='A' id='A' rows="80, *" onload="makeFrame('B')"></frameset>
    </html>
    

    【讨论】:

    • 很好的建议,但您的示例有几个缺陷:两个框架都有相同的 id,但更重要的是,我无法让它在 IE7 中工作(?)
    • 我现在已经尝试了你的建议的大量排列。在 IE7/IE8 中运行良好(没有尝试过 IE6),但是 Firefox 3 中的一个奇怪的缓存问题给我带来了问题。想清理一下文章,但是这个时候卡住了。
    • 为了防止缓存,给你的 SRC 添加一些随机参数: now = new Date() newFrame.src = 'yahoo.com?now='+now;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 2011-01-15
    相关资源
    最近更新 更多