jaywcjlove/validator.js

IE8问题

jinboyigu opened this issue · 4 comments

  1. validator.min.js 文件问题
    try catch中复用了e变量;
    在ie8试了一下, try catch中的e变量会在try中就定义的,chrome不会,可以用
    try{console.log(e === undefined)}catch(e){console.log(e)} 检验下
    ie8会返回true, 而chrome不会有输出。

  2. 兼容问题
    if (isEmpty && rules.indexOf("required") === -1) {
    ie8 是不兼容 Array.prototype.indexOf 的, 可以用 field.rules.indexOf

@jinboyigu

兼容 IE8, 在工程上添加 Polyfill 就行了,不知道需不需要在这里添加。 我们是不用兼容低级浏览器,
添加这个代码是不是很冗余?

不支持的浏览器,添加下面代码支持 indexOf

// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {

    var k;

    // 1. Let O be the result of calling ToObject passing
    //    the this value as the argument.
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }

    var O = Object(this);

    // 2. Let lenValue be the result of calling the Get
    //    internal method of O with the argument "length".
    // 3. Let len be ToUint32(lenValue).
    var len = O.length >>> 0;

    // 4. If len is 0, return -1.
    if (len === 0) {
      return -1;
    }

    // 5. If argument fromIndex was passed let n be
    //    ToInteger(fromIndex); else let n be 0.
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }

    // 6. If n >= len, return -1.
    if (n >= len) {
      return -1;
    }

    // 7. If n >= 0, then Let k be n.
    // 8. Else, n<0, Let k be len - abs(n).
    //    If k is less than 0, then let k be 0.
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

    // 9. Repeat, while k < len
    while (k < len) {
      // a. Let Pk be ToString(k).
      //   This is implicit for LHS operands of the in operator
      // b. Let kPresent be the result of calling the
      //    HasProperty internal method of O with argument Pk.
      //   This step can be combined with c
      // c. If kPresent is true, then
      //    i.  Let elementK be the result of calling the Get
      //        internal method of O with the argument ToString(k).
      //   ii.  Let same be the result of applying the
      //        Strict Equality Comparison Algorithm to
      //        searchElement and elementK.
      //  iii.  If same is true, return k.
      if (k in O && O[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

问题1 好像不是polyfill可以解决的;
问题2如果不做更改,可以在工程外部polyfill,这个没问题,
但是indexOf可以用我之前提的 field.rules.indexOfString.prototype.indexOf,这个没有兼容性问题。

压缩文件是怎么生成的,怎么感觉变量有点奇怪😂 @jaywcjlove

@jinboyigu

代码通过 umd uglifyjs,来生成的。

String.prototype.indexOf 对自定义会有bug的,如下面,比如别的地方有个 自定义 rules 值为 regexp,下面的配置有regexp_num,你就没有办法验证,indexOf的问题,应该建议 polyfill 处理

{
  ...
  // 验证条件,包括应用自定义正则`regexp_num`
  rules: 'required|regexp_num'
}

问题1 : 我需要看看测试一下。

@jinboyigu

对了,你的这句代码就有语法错误吧,e 不存在,其次就是,假设你 e 在外面存在 catch 的时候,catch传给你的 e 可否改个名字?

try{
   console.log(e === undefined)
}catch(e){
  console.log(e)
}