2

手動モードでエスケープ時に閉じるようにブートストラップポップオーバーを拡張しようとしています。ポップオーバークラスが継承するツールチップクラスを次のように拡張しようとしています。

/* WHY CANT I CALL the HIDE FUNCTION WHEN ESC key press is intercepted????

   Why is the hide class undefined when the keypress is intercetped?
*/

!function ($) {

    "use strict"

    /* TOOLTIP PUBLIC CLASS DEFINITION
    * =============================== */

    var Tooltip = function (element, options) {
        this.init('tooltip', element, options)
    }

    Tooltip.prototype = {

        constructor: Tooltip

  , init: function (type, element, options) {
      //init logic here

      $(document).keypress(function (e) {
          if (e.which == 27) { this.hide };  
      });                    ^^^^^^^^^^^^^
                             this.hide is undefined on debug????
  }

  , hide: function () {
     //hide logic
  }
}
4

1 に答える 1

4

これを使用する必要があります:

$tooltip = this;
$(document).keydown(function(e){
   if (e.keyCode === 27)
      $tooltip.hide();
});

問題は、必要な「これ」が実際にはドキュメントであり、非表示機能がないことです。keypress/keydown イベントがトリガーされると、関数内の「this」は、イベントが発生した要素、つまりドキュメントです。JavaScript には関数スコープがあることを思い出してください。つまり、多くの異なる関数内にいるときは、「this」変数に注意する必要があります。

于 2012-04-04T01:22:57.107 に答える