Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IE8问题 #17

Open
jinboyigu opened this issue Mar 5, 2018 · 4 comments
Open

IE8问题 #17

jinboyigu opened this issue Mar 5, 2018 · 4 comments

Comments

@jinboyigu
Copy link

jinboyigu commented Mar 5, 2018

  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

@jaywcjlove
Copy link
Owner

jaywcjlove commented Mar 5, 2018

@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;
  };
}

@jinboyigu
Copy link
Author

jinboyigu commented Mar 5, 2018

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

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

@jaywcjlove
Copy link
Owner

@jinboyigu

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

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

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

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

@jaywcjlove
Copy link
Owner

@jinboyigu

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants