ホームページ  >  記事  >  ウェブフロントエンド  >  Web ページのサブページ トラバーサル コールバックを実装する JavaScript メソッド (window.frames、再帰関数、関数コンテキストを含む)_JavaScript スキル

Web ページのサブページ トラバーサル コールバックを実装する JavaScript メソッド (window.frames、再帰関数、関数コンテキストを含む)_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 15:48:411840ブラウズ

この記事の例では、JavaScript が Web ページのサブページ トラバーサル コールバック (window.frames、再帰関数、関数コンテキストを含む) を実装する方法について説明します。皆さんの参考に共有してください。詳細は以下の通りです。

私が書いた純粋な JavaScript ツール プログラムから抽出されたもので、現在の Web ページのすべてのサブページを走査し、反復コールバックを実行するために使用されます。コールバック関数の戻り値は結果の戻りに使用でき、クロージャー変数を減らします~

その特徴は、再帰走査中にサブページの Window オブジェクトのみを取得し、コールバック関数はすぐには実行されず、取得完了後に通常のループ構造でコールバックされることです。これにより、再帰呼び出し中のメモリ消費が最小限に抑えられ、プログラム構造が簡素化され、メンテナンスが容易になります

グローバル関数 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);

使用例:

// 无参数 —— 返回一个数组,包含函数调用所在的 Window 对象及其子页面的 Window,其顺序同递归遍历
var Pages = Frame_Each();
console.log( Pages.length );
// 定义回调 —— 回调返回值功能与普通循环语句的对应:
//  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 プログラミング設計に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。