2014-06-22 44 views
0

我是Jquery插件的新手,我仍然试图弄清楚如何让我的插件在多个元素下工作,在搜索网络上的教程和问题之后,我意识到插件编​​码依赖于很多你的插件是关于什么的,因此可能很难找到特定解决方案的模板。多个元素的jquery插件

这是我简单的插件

jQuery.fn.numpad = function(options,callback) { 

    var settings = $.extend({ 
      // These are the defaults. 
      field: "#numpadInput", 
      keys: "full", 
      type: "numeric", 
      width: "210" 
     }, options); 

    if(settings.keys == 'lock'){ 
     var numpad = '<div id="numpadWrap" style="width:'+settings.width+'px" class="demo-button"> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">1</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">2</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">3</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">4</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">5</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">6</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">7</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">8</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">9</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">0</a></div> <div class="col-sm-8"><a class="btn btn-block delete btn-white btnNumpad"><i class="fa fa-long-arrow-left"></i></a></div> </div>'; 
    }else{ 
     var numpad = '<div id="numpadWrap" style="width:'+settings.width+'px" class="demo-button"> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">1</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">2</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">3</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">%</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">4</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">5</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">6</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">.</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">7</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">8</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">9</a></div> <div class="col-sm-3"><a class="btn btn-block delete btn-white btnNumpad"><i class="fa fa-long-arrow-left"></i></a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">0</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">00</a></div> <div class="col-sm-6"><a class="btn btn-block clear btn-white btnNumpad">Clear</a></div>'; 
    } 

    this.html(numpad); 

    input = $(settings.field); 
    input.attr('readonly',true); 
    input.attr('type',settings.type); 

    $('#numpadWrap a').on('click',function(e){ 
     e.preventDefault(); 
     var key   = $(this), 
      character = key.text(); 



     // Delete 
     if (key.hasClass('delete')) { 
      var value = input.val(); 

      input.val(value.substr(0, value.length - 1)); 
      return false; 
     }else if (key.hasClass('clear')) {  
      input.val(''); 
      return false; 
     } 

     // Add the character 
     input.val(input.val() + character); 
     callback(); 
    }); 
} 

用法:

var options = { 
       field: '#password', 
       type: 'password', 
       keys: 'lock', 
       width: '200' 
       }; 

    $('#numpad1').numpad(options); 

在这种情况下它是什么,附加一个数字键盘的DIV#numpad1,那么你可以在选项中指定的目标输入,其中按下的数字将被显示。

它工作正常,只有一个元素,但后来,当我创建第二个实例第一个停止正常工作。 Live example

希望你们能帮助我,谢谢!

+0

通常的方式具有多个元件的工作是把所有的这样的代码在一个循环内:'this.each(函数(指数,元素){您的方法这里代码})'所以它迭代集合中的每个项目。 – jfriend00

+0

不确定我是否理解,我应该在哪里使用'each',以及如何处理'index'和'element'? –

+0

我正准备在'this.each()'循环中发布一个代码体,但是你的代码不能用于多个元素,因为你插入了'

',你只能这样做一次,因为你不能有多个具有给定ID的元素。因此,您的代码不会被设计为多次使用,而无需重新设计。 – jfriend00

回答

1

http://jsfiddle.net/THEtheChad/cAc7y/4/

$.fn.numpad = function(options, callback) { 

    // defaults 
    options = $.extend({ 
     field: "#numpadInput", 
     keys: "full", 
     type: "numeric", 
     width: "210" 
    }, options); 


    if (options.keys == 'lock') { 
     var numpad = '<div style="width:' + options.width + 'px" class="demo-button numpadWrap"> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">1</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">2</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">3</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">4</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">5</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">6</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">7</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">8</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">9</a></div> <div class="col-sm-4 col-xs-4"><a class="btn btn-block btn-default btn-numpad">0</a></div> <div class="col-sm-8 col-xs-8"><a class="btn btn-block delete btn-default btn-numpad">Del</a></div> </div>'; 
    } else { 
     var numpad = '<div style="width:' + options.width + 'px" class="demo-button numpadWrap"> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">1</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">2</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">3</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">%</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">4</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">5</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">6</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">.</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">7</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">8</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">9</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block delete btn-default btn-numpad">Del</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">0</a></div> <div class="col-sm-3 col-xs-3"><a class="btn btn-block btn-default btn-numpad">00</a></div> <div class="col-sm-6 col-xs-6"><a class="btn btn-block clear btn-default btn-numpad">Clear</a></div>'; 
    } 

    this.each(function(){ 
     var $input = $(options.field); 
     $input.attr('readonly', true); 
     $input.attr('type', options.type); 

     var $numpad = $(this); 
     $numpad.html(numpad); 

     // use event delegates for added performance 
     $numpad.on('click', 'a', function(evt){ 
      evt.preventDefault(); 

      var $key = $(this), 
       char = $key.text(); 

      // Delete 
      if ($key.hasClass('delete')) { 
       var val = $input.val(); 
       val = val.substr(0, val.length - 1); 

       $input.val(val); 
       return false; 
      } else if ($key.hasClass('clear')) { 
       $input.val(''); 
       return false; 
      } 

      // Add the character 
      $input.val($input.val() + char); 
      callback && callback(); 
     }); 
    }); 
}; 
+0

谢谢!这完美的作品! –

1

我有同样的问题,前一段时间,克​​服像这样:

步骤1:写全的插件的功能

var numpadFunc = function(options,callback, element) { 

    var settings = $.extend({ 
      // These are the defaults. 
      field: "#numpadInput", 
      keys: "full", 
      type: "numeric", 
      width: "210" 
     }, options); 

    if(settings.keys == 'lock'){ 
     var numpad = '<div id="numpadWrap" style="width:'+settings.width+'px" class="demo-button"> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">1</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">2</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">3</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">4</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">5</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">6</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">7</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">8</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">9</a></div> <div class="col-sm-4"><a class="btn btn-block btn-white btnNumpad">0</a></div> <div class="col-sm-8"><a class="btn btn-block delete btn-white btnNumpad"><i class="fa fa-long-arrow-left"></i></a></div> </div>'; 
    }else{ 
     var numpad = '<div id="numpadWrap" style="width:'+settings.width+'px" class="demo-button"> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">1</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">2</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">3</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">%</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">4</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">5</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">6</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">.</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">7</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">8</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">9</a></div> <div class="col-sm-3"><a class="btn btn-block delete btn-white btnNumpad"><i class="fa fa-long-arrow-left"></i></a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">0</a></div> <div class="col-sm-3"><a class="btn btn-block btn-white btnNumpad">00</a></div> <div class="col-sm-6"><a class="btn btn-block clear btn-white btnNumpad">Clear</a></div>'; 
    } 

    element.html(numpad); 

    input = $(settings.field); 
    input.attr('readonly',true); 
    input.attr('type',settings.type); 

    $('#numpadWrap a').on('click',function(e){ 
     e.preventDefault(); 
     var key   = $(element), 
      character = key.text(); 



     // Delete 
     if (key.hasClass('delete')) { 
      var value = input.val(); 

      input.val(value.substr(0, value.length - 1)); 
      return false; 
     }else if (key.hasClass('clear')) {  
      input.val(''); 
      return false; 
     } 

     // Add the character 
     input.val(input.val() + character); 
     callback(); 
    }); 
} 

第2步:调用函数你的插件内

$.fn.numpad = function(options, callback){ 
    return $(this).each(function(){ 
     typingTextFunc(options, callback, this); 
     }); 
    }; 

注:您可能面临的任何其他问题都是由功能代码引起的,请尝试维护它并查看下面我对自己问题的回答,这可能会启发一些想法!

assign jQuery plugin to multiple elements

+0

除了OP的代码不能运行多次,因为它们插入带有ID的元素,并会产生冲突。在OP可以使用'this.each()'运行其整个集合的代码之前,需要进行其他重新设计更改。 – jfriend00

+0

嗨,谢谢你的回答,我更新了JSFiddle实现你的建议,但仍然没有运气[小提琴](http://jsfiddle.net/qhyP4/5/)当我回显实际元素时,它总是显示最新的 –

+0

现在它按照预期的方式工作,它的类别是http://jsfiddle.net/qhyP4/5/ –