我们逐步实现Web 1.0 Web应用程序的现代化。
旧应用程序是一个框架应用程序(3帧 - 顶部,菜单和主要)
这些框架在frameset
中静态定义
在整个应用程序中,top /是由window.frames中的索引0,索引1的菜单和索引2的main引用的
一切都很好。
现在我们做了第一次改变
我们重新设计了应用程序的开头,并从框架更改为iframe
现在我们在JavaScript中动态创建这3个iframe(使用$("...");
)。
我们在2周前部署了此更改。
大部分工作都可以。大部分时间在JavaScript中,第一个创建的iframe为window.frames[0]
,第二个创建的iframe
为window.frames[1]
。
但有时候,首先创建的iframe最终会在window.frames[1]
和。{
在第一个结束后在命令中创建的iframe
window.frames[0]
。
这混合了洞穴应用程序,因为 - 正如我之前提到的那样 - window.frames[0]
必须是顶级iframe
。
我们无法将引用从索引更改为id,这将非常耗时。
我们必须 - 以某种方式 - 保证," top" iframe
始终为window.frames[0]
。
由于
编辑:
谢谢 - 安德里 - 发表你的帖子。
Web应用程序非常庞大。它始于2001年。令人疲惫的工作是找到所有window.frames[x]
个位置,改变它并希望没有其他休息。
我想尽可能少地改变(不要改变正在运行的系统)。
我很乐意不将所有这些引用从index更改为id。
最好和最简单的方法是保证帧中帧的顺序 第一名。
答案 0 :(得分:1)
我不明白你的问题是最终的渲染结果(你的框架是否处于错误的位置),或者是识别问题(你希望顶部iframe
处于0位置而你引用了错了一个)。所以我在这里有两种可能的解决方案。
如果你的问题是确保那些iframe
被正确定位,那么,在创建时,在生成这些元素时确保顺序应该没问题:
var frame1 = document.createElement('iframe');
// <...> Logic to add/remove attributes or style to frame1
var frame2 = document.createElement('iframe');
// <...> Logic to add/remove attributes or style to frame2
var frame3 = document.createElement('iframe');
// <...> Logic to add/remove attributes or style to frame3
// Assuming you want to add them in the body
document.body.appendChild(frame1);
document.body.appendChild(frame2);
document.body.appendChild(frame3);
没有你使用一些奇怪的CSS样式作用于这些元素的顺序(如flex),没关系!
创建它们时只需对这些元素使用id:
var frame1 = document.createElement('iframe');
frame1.id = 'f0';
var frame2 = document.createElement('iframe');
frame2.id = 'f1';
var frame3 = document.createElement('iframe');
frame3.id = 'f2';
// Assuming you want to add them in the body
document.body.appendChild(frame1);
document.body.appendChild(frame2);
document.body.appendChild(frame3);
// Helper function to retrieve your iframes
var getFrame = function(index) {
document.getElementById('f' + index);
};
所以你现在可以使用:
var top = getFrame(0); // Since the top iframe has index 0
var middle = getFrame(1); // Since the top iframe has index 1
var bottom = getFrame(2); // Since the top iframe has index 2
我希望应该没事!
答案 1 :(得分:0)
我找到了解决方案。
之前我在一个地方创建和分配属性:
myiframe1 = $('<iframe />');
myiframe1.attr("...", "...");
myiframe1.attr("...", "...");
myiframe2 = $('<iframe />');
myiframe2.attr("...", "...");
现在我将改变这一点。首先,我只会创建iframe代码。
iframe = $('<iframe />');
iframe.appendTo("body");
iframe = $('<iframe />');
iframe.appendTo("body");
iframe = $('<iframe />');
iframe.appendTo("body");
在此之后,当iframe位于window.frames数组中时,我会根据需要为其分配其他属性。
myiframe1 = window.frames[0].frameElement;
myiframe2 = window.frames[1].frameElement;
myiframe3 = window.frames[2].frameElement;
所以在窗口框架“array”中修改了iframe的顺序之后,我可以分配id。
myiframe1.attr("id", "top");
myiframe1.attr("src", ".../cgi-bin/top");
myiframe2.attr("id", "menu");
myiframe2.attr("src", ".../cgi-bin/menu");