javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
本文实例讲述了javascript实现网页子页面遍历回调的方法(涉及window.frames、递归函数、函数上下文)。分享给大家供大家参考。具体如下:
提炼于本人手写的纯JavaScript工具程序,用于遍历当前网页的所有子页面并执行迭代回调,且回调函数返回值可用于结果回传,有助于减少闭包变量~
其特点在于——递归遍历时只检索子页面的Window对象,不立即执行回调函数,而是在检索结束后在普通循环结构中回调。这样可以尽量减少递归调用时的内存消耗,也简化了程序结构,易于维护
全局函数Frame_Each(CallBack):
(function(BOM){
functionAll_Frames(iWindow){
var_Frames_=[].slice.call(iWindow.frames,0);
for(vari=0;i<_Frames_.length;i++)
_Frames_=_Frames_.concat(arguments.callee(_Frames_[i]));
return_Frames_;
}
BOM.Frame_Each=function(CallBack){
varFrames=[this].concat(All_Frames(this));
if(!CallBack)returnFrames;
for(vari=0,CBR;i<Frames.length;i++){
try{Frames[i].name;}catch(iError){continue;}
CBR=CallBack.apply(Frames[i],[].slice.call(arguments,1));
if(CBR===false)break;
elseif(CBR===undefined)continue;
returnCBR;
}
};
})(self);
使用示例:
//无参数——返回一个数组,包含函数调用所在的Window对象及其子页面的Window,其顺序同递归遍历
varPages=Frame_Each();
console.log(Pages.length);
//定义回调——回调返回值功能与普通循环语句的对应:
//1.undefined:continue
//2.false:break
//3.其它任何值:break&&returnValue
varSearch_Result=Frame_Each(function(){
variFocus=this.document.activeElement;
switch(iFocus.tagName.toLowerCase()){
case'body':returnfalse;
case'iframe':return;
}
returniFocus;
});
Search_Result.innerHTML='Hello,Focus!';
希望本文所述对大家的javascript程序设计有所帮助。