Java脚本,难以获取页面中所有嵌套帧的列表

Mor*_*aos 24 html javascript jquery greasemonkey frames

您好我需要获取我的GreaseMonkey脚本的所有帧的列表,但实际上我猜这是一般的Javascript问题.如果我能够到达嵌套在页面中的每一个帧,那将是很棒的.到目前为止,我在获取嵌套在主文档框架中的帧数时遇到了问题.

我处理的页面包含多级框架集,框架包含其他框架.我已经设法获得有关主文档框架集的顶级框架的信息(在代码级别1中),但在此级别,我得到的信息是这些框架的帧计数等于0,这是不正确的.

我想出了以下代码

$(document).ready(function(){
var frames = window.frames;
var i,j;
var reportText = "level 0 > " + frames.length +"\r\n";

for (i = 0; i < frames.length; i++) {
    var frames2 = frames[i].frames;
    reportText += "level 1 - " + i + " > " + frames[i].name + " - " + frames2.length +"\r\n";

    for (j = 0; j < frames2.length; j++) {
      var frames3 = frames2[j].frames; 
      reportText += "level 2 - " + i + " - " + j + " > "  + frames2[j].name + " - " + frames3.length +"\r\n";
    }
}

alert(reportText);});
Run Code Online (Sandbox Code Playgroud)

所以级别0实际上是主文档框架计数和级别1名称或主文档框架 - 这些是正确报告的,但不是每个级别1帧的帧数量.我想知道是不是因为我的代码出错了,或者因为子帧没有完全加载.

我试图从键盘快捷方式调用我的代码,毕竟它看起来像它完全加载,但在这里另一个问题,似乎下面的代码似乎不适用于仅包含框架集的页面

 (function(){
 document.addEventListener('keydown', function(e) {
 if (e.keyCode == 72 && !e.shiftKey && !e.ctrlKey && e.altKey && !e.metaKey) {

 //...my previous code inside document.ready...

   }
 }, false);})();
Run Code Online (Sandbox Code Playgroud)

如果代码自动梳理所有帧和子帧但其当前形状(每个级别得到它自己的循环)也是好的.

无法使用快捷键的问题是次要的.主要的是在主文档的框架内及以后获得适当的帧数.

编辑:示例输出和我的测试页面与嵌套框架集

产量

等级0> 3

级别1 - 0> main1 - 0

等级1 - 1> main2 - 0

等级1 - 2> main3 - 0

具有嵌套框架集的测试页面

frame0.htm

<!DOCTYPE html>
<html>
<frameset cols="25%,*,25%">
  <frame id="frmain1" name="main1" src="frame0_1.htm">
  <frame id="frmain2" name="main2" src="frame0_2.htm">
  <frame id="frmain3" name="main3" src="frame0_3.htm">
</frameset>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_1.htm

<!DOCTYPE html>
<html>
<frameset rows="25%,*">
  <frame id="frsub11" name="sub11" src="frame0_1_1.htm">
  <frame id="frsub12" name="sub12" src="frame0_1_2.htm">
</frameset>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_1_1.htm

<!DOCTYPE html>
<html>
<body style="background: darkorange;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_1_2.htm

<!DOCTYPE html>
<html>
<body style="background: lightyellow;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_2.htm

<!DOCTYPE html>
<html>
<frameset rows="25%,*,25%">
  <frame id="frsub21" name="sub21" src="frame0_2_1.htm">
  <frame id="frsub22" name="sub22" src="frame0_2_2.htm">
  <frame id="frsub23" name="sub23" src="frame0_2_3.htm">
</frameset>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_2_1.htm

<!DOCTYPE html>
<html>
<body style="background: skyblue;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_2_2.htm

<!DOCTYPE html>
<html>
<body style="background: cornflowerblue;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_2_3.htm

<!DOCTYPE html>
<html>
<body style="background: slateblue;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_3.htm

<!DOCTYPE html>
<html>
<frameset rows="25%,*">
  <frame id="frsub31" name="sub31" src="frame0_3_1.htm">
  <frame id="frsub32" name="sub32" src="frame0_3_2.htm">
</frameset>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_3_1.htm

<!DOCTYPE html>
<html>
<body style="background: darkgreen;">
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

frame0_3_2.htm

<!DOCTYPE html>
<html>
<body style="background: lightgreen;">
    <a id="test" href="http://www.google.com">testlink</a>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Jul*_*ire 9

问题是你称之为的事件.$(document).ready()在加载当前DOM时触发.所以当加载3个主要帧时会触发它.但是在这一点上,这些帧还没有加载它们iframes.通过将事件更改为window.onload,您应该具有预期的结果.像这样:

$(window).load(function(){
    ...
Run Code Online (Sandbox Code Playgroud)

要么

window.onload = function(){
    ...
Run Code Online (Sandbox Code Playgroud)

请参阅window.onload:https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers/onload

load文件在文档加载过程结束时触发.此时,文档中的所有对象都在DOM中,并且所有图像,脚本,链接和子帧都已完成加载.

请参阅https://api.jquery.com/ready/