【问题标题】:Dynamically Auto-Linking instance variables to object functions in javascript / jquery?将实例变量动态自动链接到javascript / jquery中的对象函数?
【发布时间】:2010-12-23 12:06:12
【问题描述】:

我正在尝试用 javascript (& jQuery) 创建一个强大的音频播放器。我知道还有其他玩家,但我想尝试创建自己的(所以请不要让我参考 jquery 插件)。这基本上是我想做的:

Main.js:

var player = new Player(AudioObj); // Audio object links to Audio class (not shown)
player.buttons.play = $('play');
player.buttons.pause = $('pause'); // Play and pause ID's link to HTML Document Element

Player.js:

Player = function(Audio) {
   this.Audio = Audio;
   this.buttons = {};
   for(var button in this.buttons) {
      button.live('click', this.button); // This is the line I Have NO idea about..
   }
} 

Player.prototype = {
   play : function() {
      // Do Something
   },
   pause : function() {
      // Do something
   }
}

所以本质上,我希望在初始化播放器时将属性预链接到对象函数,并在我将其链接到 HTML 元素时让它工作。

谢谢! 马特·穆勒

【问题讨论】:

    标签: javascript jquery function oop


    【解决方案1】:

    这不是完美的解决方案,但我觉得它非常优雅:

    Player.js

    Player.prototype = {
    
     init: function() {
      var Player = this;
    
      // Attach buttons to respected functions
      for(var button in this.buttons) {
       if(typeof Player[button] === "function")
        $(this.buttons[button]).bind('click', {Player : this}, Player[button]);
      }
     },
    
     play: function(e){
      var Player = e.data.Player;
      var Audio = Player.Audio;
    
      Audio.play();
     },
    
     pause: function(e){
      var Player = e.data.Player;
      var Audio = Player.Audio;
    
      Audio.pause();  
     }
    }
    

    Main.js

     var audio = new AudioCore("UpToYou.mp3");
     var player = new Player(audio);
      player.buttons.play = $('#play');
      player.buttons.pause = $('#pause');
     player.init();
    

    这提供了一种将按钮链接到函数的好方法,而无需传入庞大的数组或提供一堆选项。我很高兴有一个不需要您调用 init() 的解决方案。

    【讨论】:

      【解决方案2】:

      我认为这将是一种更面向对象的方式。在 Player 中再设置两个函数。一个函数会将 UI 元素注册到 Player 操作,而另一个函数用于取消注册操作。因此,与其保持一个明确的按钮集合,你可以依靠 jQuery.live 和 jQuery.die。例如:

      function registerAction(selector, action) {
          // you could have some logic to map the passed in action
          // to the actual function name
          $(selector).live('click', action/functionName);
      }
      function unRegisterAction(selector, [action]) {
          // you could have some logic to map the passed in action
          // to the actual function name
          $(selector).die('click', [action/functionName]);
      }
      

      然后,您上面的 main.js 示例将变为:

      var player = new Player(AudioObj); // Audio object links to Audio class (not shown)
      player.registerAction('#play', play);
      player.registerAction('#pause', pause); // Play and pause ID's link to HTML Document Element
      

      您的 Player 构造函数将变为:

      Player = function(Audio) {
          this.Audio = Audio;        
      }
      

      或者类似的东西。

      【讨论】:

      • 感谢您的回复!这正是我想要做的。我只想通过将它们设置为方法中的各种功能来注册动作。我认为这比注册所有内容要干净。函数和变量名称之间存在耦合(因此buttons.play 会与方法的播放耦合),但我认为这很容易管理。
      猜你喜欢
      • 2022-01-16
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多