javascript - 手动传递 'This' jquery 选择器

标签 javascript jquery html validation

<input type='file' class="img-input" id="add-img-1" onchange="show_img(this);" />

我们如何将手动输入的文件的“this”选择器传递给函数?
像这样:

$('input.img-input').fileValidator({
        onValid :     function(){ show_img( $(this) ); },
        type:        'image',
        maxSize:      '1m'
});

这不起作用,我也尝试传递输入的 id.. 但没有运气。 谁能帮我吗?

这里是 jsFiddle :http://jsfiddle.net/z8y2s/16/

最佳答案

您需要将其传递到 call 函数中,以便您的 valid 回调可以使用它。

(function($){

  validFile = true;

  $.fileValidator = function(options){
    var validations = [];
    var onInvalid = options.onInvalid;
    var onValid = options.onValid;


    for (var key in $.fileValidator.validations){
      if (!options[key]){ continue; }
      validations.push( $.fileValidator.validations[key](options[key], onInvalid, onValid));
    }


    return function(file){
      for(var i=0, len = validations.length; i < len; i++){
        validations[i].call(this, file);
      }
      if(validFile){onValid.call(this);}
    };
  };

  $.fileValidator.validations = {
    maxSize: function(maxSize, invalid, valid){
      if( typeof maxSize == 'string' ){ 
        maxSize = $.fileValidator.sizeToBytes(maxSize);
      }

      return function(file){
        if (file.size > maxSize){ invalid.call(this,'maxSize',file); validFile = false; }
      };
    },

    type: function(contentType, invalid, valid){
      var isValid;
      if( typeof contentType == 'function' ){ 
        isValid = contentType; 
      } else if (contentType.constructor === RegExp ) { 
        isValid = function(type){ return type.match(contentType); }; 
      } else { 
        isValid = function(type){ return ~type.indexOf(contentType); }; 
      }

      return function(file){
        if (!isValid(file.type)) { invalid.call(this,'type', file); validFile = false; }
      };
    }
  };

  $.fn.fileValidator = function(userOptions) {
        var options = $.extend({
          // Validations
          maxSize: null,
          type: null,

          // Callbacks
          onValidation: $.fileValidator.doNothing,
          onInvalid: $.fileValidator.doNothing,
      onValid: $.fileValidator.doNothing
        }, userOptions);

        return this.each(function() {
            var el = $(this);
            var validator = $.fileValidator( $.extend({}, options, el.data()) );

          el.bind('change', function(event){
            var files = this.files || [];
            options.onValidation.call(this, files);
            for(var i=0, len=files.length; i < len; i++){
              validator.call(this, files[i]);
            }
          });
        });     
    };

  $.fileValidator.doNothing   = function doNothing(){};
  $.fileValidator.sizeToBytes = function sizeToBytes(size){
    var scale = 1;

    if (~ size.indexOf('k')){ 
      scale = 1024; 
    } else if (~ size.indexOf('m')){ 
      scale = 1024 * 1024; 
    } else if (~ size.indexOf('g')){ 
      scale = 1024 * 1024 * 1024; 
    }
    return parseInt(size,10) * scale;
  };
})( jQuery );

看,我在调用 onValid 时传递了 this(第 21 行)

Demo

关于javascript - 手动传递 'This' jquery 选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24322393/

相关文章:

javascript - 如何在单页中添加多个不可见的验证码?

javascript - 状态变异是副作用?

javascript - ScrollTo 效果(href 到 div)

jquery - 如何在 jQuery 中切换

javascript - 如果任何表单输入发生更改,则更改(立即)提交按钮文本 [JS]

html - 我怎样才能使一个元素的 sibling 定位绝对,正常定位?

javascript - iOS WebView Javascript

javascript - jquery 中的 Firefox 鼠标滚轮类型事件被识别为调整大小

javascript - 我想从 node.js javascript 调用一个用 "C"DLL 编写的函数?

javascript - 最快的 jQuery 自动省略号插件?