我们的开发和公司网站的框架层次略有不同。
偶尔我需要在不同的框架中引用一个元素。
不幸的是,我不知道该框架在层次结构中的位置。但我确实知道这是真的。
当我不知道确切的结构时,如何找到框架或特定元素?
澄清 在开发中,它基本上只是一个包含框架的页面。我在框架的上下文中,只是使用window.top.document来获取我想要的文档。
在prod中,嵌套是不同的,window.top.document不起作用,因为它在另外两个框架内。
我无法改变这种结构,它只是我们的应用程序门户的工作方式。
答案 0 :(得分:6)
如果iframe来自同一个域,则可以通过jQuery轻松访问这些元素
$("#frameID").contents().find("#elementID").hide();
关于外国域名有一些例外Here:
答案 1 :(得分:3)
也许您可以尝试遍历所有帧。您将需要使用广度优先或深度优先搜索,具体取决于帧嵌套的深度。最初将它传递给根。
frameSearch(yourElementId,$("frame"));
function frameSearch(elementId,frames){
if (!(frames)) {return "element not found";}
$.each(frames,function(){
var $elementFound = this.find("#"+elementId);
if ($elementFound){
return $elementFound;
}
var newFrames = this.find("frame");
if (newFrames) {frameSearch(elementId,newFrames);}
});
}
我不是100%肯定这种递归算法的正确性,但我认为这是正确的想法。
编辑:
如果您需要找到最顶层的父级,请尝试:
var $currentDocument = $("document");
while ($currentDocument.parent()){
if ($currentDocument.find("#"+yourElementId)){
$yourElement = $currentDocument.find("#"+yourElementId);
break;
}
$currentDocument = $currentDocument.parent();
}
if (!($yourELement)){
$yourElement = frameSearch(yourElementId,$("frame"));
}
这将首先向上检查,如果不起作用则向下检查
答案 2 :(得分:0)
如果你知道框架的id,你可以使用id选择器和contents()
方法来查找iframe中的元素。试试这个
$("#iframeId").contents().find("elementToFind")
答案 3 :(得分:0)
这对我有用......
USERNAME='input#username';
frame_count=window.parent.frames.length;
for(f=0;f<frame_count-1;f++){
test_frame=window.parent.frames[f].document.body;
if ( $(USERNAME, test_frame).length==1 ) {
INPUT_FRAME=f;
break;
};
};
detail_frame=window.parent.frames[INPUT_FRAME].document.body;
$(USERNAME, detail_frame).val(username);