2017-06-15 9 views
0

文字列に基づいてクリックイベント関数を割り当てるプラグインがあります。しかし、私はWindow['variable name']変数が私のプラグインスコープ内にあるので、ウィンドウスコープではないと思う。プラグイン内の変数をクリックしてイベントをクリックするとJavaScript内に関数が割り当てられます

EventLeft/EventRight/EventClose変数の匿名関数をquerySelectorAllループのclickイベントに割り当てる方法を教えてください。

(function() { 

    // Constructor 
    this.MarvLightbox = function() { 

    // Initialise plugin 
    this.open(); 
    }; 

    MarvLightbox.prototype.open = function() { 

    setupLightbox.call(this); 
    }; 

    function setupLightbox() { 

    var createExpand = function(img) { 

      // Generate lightbox HTML and append 
      var instance = this, 
       html = buildHTML(instance.options.html), 
       EventClose = function() { 
       // Do stuff 
       }, 
       EventLeft = function() { 
       // Do stuff 
       }, 
       EventRight = function() { 
       // Do stuff 
       }; 

      // Lightbox is active 
      instance.active = true; 

      // Assign click events 
      html.getElementsByClassName('image')[0].src = img; 

      html.querySelectorAll('[data-click]').forEach(function(e) { 
      e.addEventListener('click', function() { instance[this.dataset.click]; }); 
      }); 

    }.bind(this); 

    } 

}); 
+0

質問を閉じるために投票するのではなく、誰にも恩恵を与えない理由を説明してください。 –

+0

あなたはそうではありませんが、あなたが作ったコードは実際には匿名機能を実現するために、最後に行方不明()で実行されません。これらのカッコ内では、引数を渡すことができます。また、設定が必要なパラメータを使用することもできます。 これは通常、これを行う最良の方法ではありません。ちょっと深く説明して、なぜwindows ['variable name'] 'を使って始める必要があるのか​​、それから私はあなたを助けることができるかもしれません。 – Dellirium

+0

コードはスコープを示すための例でした。私は現在の記事を更新しました。 文字列を使用してclickイベントを参照することで、無名関数をclickイベントに割り当てたいとします。 –

答えて

1

あなた自身の答えは実際には読めるものではなく、したがって維持するのが容易ではないが動作します。

オブジェクトに関数を格納し、keyを使用してアクセスします。

var events = { 
    EventClose: function() { 
    instance.active = false; 
    item.current = null; 
    }, 
    EventLeft: function() { 
    if (item.current !== 0) { 
     item.current = item.current - 1; 
    } else { 
     item.current = instance.images_count; 
    } 
    }, 
    EventRight: function() { 
    if (item.current !== instance.images_count) { 
     item.current = item.current + 1; 
    } else { 
     item.current = 0; 
    } 
    } 
} 

html.querySelectorAll('[data-click]').forEach(function(e) { 
    e.addEventListener('click', events[e.dataset.click]); 
}) 
+0

ずっと良くなって、なぜ私はそれをやっていると思いませんでしたか? –

0

なぜこの質問がとても混乱しているのかは分かりません。解決策を見つけるために管理:

events = function(fnstring) { 
    switch(fnstring) { 
     case 'EventClose': (function() { 
     instance.active = false; 
     item.current = null; 
     }()); break; 
     case 'EventLeft': (function() { 
     if (item.current !== 0) { 
      item.current = item.current - 1; 
     } else { 
      item.current = instance.images_count; 
     } 
     }()); break; 
     case 'EventRight': (function() { 
     if (item.current !== instance.images_count) { 
      item.current = item.current + 1; 
     } else { 
      item.current = 0; 
     } 
     }()); break; 
    } 
}; 

html.querySelectorAll('[data-click]').forEach(function(e) { 
    e.addEventListener('click', function() { events(e.dataset.click); }); 
}); 
関連する問題