javascript 显示任何网页的所有框架列表

tzxcd3kk  于 2023-01-16  发布在  Java
关注(0)|答案(4)|浏览(152)

我想创建一个递归JavaScript循环,它可以显示所有的框架(使用IFRAMES标签或使用FRAME标签)。结果应该给予FrameName、NestingLevel、FrameURL等。
例如,当我们在Google Chrome中打开“开发者工具”时,我们可以在控制台选项卡中看到所有的框架(甚至是嵌套的框架)。x1c 0d1x
请给予一个递归循环的错误处理(iframe安全问题)。!

样品代码

function getFramesInfo(oWin) {
  arrFrames = oWin.frames;
  //alert(arrFrames.length);
  if (arrFrames.length == 0) {
    alert('document do not have frame(s)');
  } else {
    for (i = 0; i < arrFrames.length; i++) {
      console.log(i + ' ' + arrFrames[i].location.href);
      if (arrFrames[i].document) {
        getFramesInfo(arrFrames[i]);
      }
    }
  }
}
//Calling This Function
getFramesInfo(window);
xlpyo6sf

xlpyo6sf1#

替代/改进代码

function getAllFrames(frame, allFrameArray) {
  allFrameArray.push(frame.frames);
  for (var i = 0; i < frame.frames.length; i++) {
    getAllFrames(frame.frames[i], allFrameArray);
  }
  return allFrameArray;
}
//Usage:

var allFramesArray = getAllFrames(window, new Array());
console.log(allFramesArray.length); // number of frames in array
for (var i = 0; i < allFramesArray.length; i++) {
  console.log('\n\n No.'+ (i+1) + '.');
  try {
    console.log(allFramesArray[i].id);
    console.log(allFramesArray[i].name);
    console.log(allFramesArray[i].location.href); // location of first frame in array}
  } catch (e) {
    console.log('Error in Accessing Frame No.' + (i+1) ); // location of first frame in array}
  }
}
iih3973s

iih3973s2#

经过谷歌搜索和探索,我已经找到了一个简单的解决方案,但我认为这个答案应该加以改进,以避免任何可能的错误(* 即精确的错误处理应该做,以避免跨域帧问题 *):

样品溶液

// first parameter is frame (window) in which to get sub frames
// second is the array to build on
function getAllFrames(frame, allFrameArray) {
  allFrameArray.push(frame.frames);
  for (var i = 0; i < frame.frames.length; i++) {
    getAllFrames(frame.frames[i], allFrameArray);
  }
  return allFrameArray;
}

用途

var allFramesArray = getAllFrames(window, new Array());
console.log(allFramesArray.length); // number of frames in array
for (var i = 0; i < allFramesArray.length; i++) {
  try {
    console.log(allFramesArray[i].location.href); // location of first frame in array}
  } catch (e) {
    console.log('Error in Accessing Frame No.' + i); // location of first frame in array}
  }
}
yqyhoc1h

yqyhoc1h3#

这里是另一个(快捷方式示例)

var i = new Array;

  function wow(a, n) {
    t = '';
    for (i[n] = 0; i[n] < a.length; i[n]++) {
      try {
        t += a[i[n]].name + ' \n';
      } catch (e) {
        t += 'Error \n';
      }
      if (a[i[n]].frames.length) t += wow(a[i[n]].frames, n + 1);

    }
    return t;
  }

  //Usage:
  console.log(wow(top.frames, 0));
jq6vz3qz

jq6vz3qz4#

在浏览代码时,我最近学习了一个新代码,使用以下代码,该代码将javascript窗口对象作为输入,并返回其所有嵌套窗口(包括多层嵌套)。然而,这个函数是一种高效/优雅的方法,可以用来获取对所有窗口的引用(对象)和所有子窗口(对象)。我检查了这个函数,发现它工作得很好,可以理解,使/写这个函数完全递归,因为DOM对象树实际上是一个n元,而不是二进制。

function getAllNestedWindows(window) {
    var windows = [window];
    if (window.length === 0) {
        return windows;
    } else {
        for (var i = 0; i < window.length; i++) {
            windows = windows.concat(getAllNestedWindows(window[i]));
        }
    }
    return windows;
}

相关问题