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)
问题是你称之为的事件.$(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/