javascript實現(xiàn)網(wǎng)頁子頁面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)
本文實例講述了javascript實現(xiàn)網(wǎng)頁子頁面遍歷回調(diào)的方法(涉及 window.frames、遞歸函數(shù)、函數(shù)上下文)。分享給大家供大家參考。具體如下:
提煉于本人手寫的純 JavaScript 工具程序,用于遍歷當(dāng)前網(wǎng)頁的所有子頁面 并執(zhí)行迭代回調(diào),且回調(diào)函數(shù)返回值可用于結(jié)果回傳,有助于減少閉包變量~
其特點在于 —— 遞歸遍歷時只檢索子頁面的 Window 對象,不立即執(zhí)行回調(diào)函數(shù),而是在檢索結(jié)束后在普通循環(huán)結(jié)構(gòu)中回調(diào)。這樣可以盡量減少 遞歸調(diào)用時的內(nèi)存消耗,也簡化了程序結(jié)構(gòu),易于維護
全局函數(shù) Frame_Each( CallBack ):
(function (BOM) { function All_Frames(iWindow) { var _Frames_ = [].slice.call(iWindow.frames, 0); for (var i = 0; i < _Frames_.length; i++) _Frames_ = _Frames_.concat( arguments.callee(_Frames_[i]) ); return _Frames_; } BOM.Frame_Each = function (CallBack) { var Frames = [this].concat( All_Frames(this) ); if (! CallBack) return Frames; for (var i = 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; else if (CBR === undefined) continue; return CBR; } }; })(self);
使用示例:
// 無參數(shù) —— 返回一個數(shù)組,包含函數(shù)調(diào)用所在的 Window 對象及其子頁面的 Window,其順序同遞歸遍歷 var Pages = Frame_Each(); console.log( Pages.length ); // 定義回調(diào) —— 回調(diào)返回值功能與普通循環(huán)語句的對應(yīng): // 1. undefined:continue // 2. false:break // 3. 其它任何值:break && return Value var Search_Result = Frame_Each(function () { var iFocus = this.document.activeElement; switch ( iFocus.tagName.toLowerCase() ) { case 'body': return false; case 'iframe': return; } return iFocus; }); Search_Result.innerHTML = 'Hello, Focus!';
希望本文所述對大家的javascript程序設(shè)計有所幫助。
相關(guān)文章
javascript Array數(shù)組對象的擴展函數(shù)代碼
我們經(jīng)常給 String,Function,Array 的原型加上自定義的擴展函數(shù),比如去除字符串空格,數(shù)組排序等2010-05-05基于JavaScript 性能優(yōu)化技巧心得(分享)
下面小編就為大家分享一篇基于JavaScript 性能優(yōu)化技巧心得,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12