• 小程序使用jsencrypt加密,报Uncaught TypeError: Cannot read property ‘appName‘ of undefined问题


    转自:https://www.jianshu.com/p/2b8f0869aa37
    小程序使用jsencrypt对参数进行aes加密,在手机网页端可以正常使用,在小程序项目安装后使用报错。由于jsncrypt代码里面含有window、document、navigator对象,这些对象可以在pc端、移动端的浏览器使用,但是小程序没有这些对象,所以直接在小程序引入jsencrypt.js会直接报错,下面主要介绍如何在jsencrypt.js里面对这些对象进行兼容。

    问题:Uncaught TypeError: Cannot read property 'appName' of undefined

    修改代码目录

    解决步骤:

    (1)源代码

    if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
        BigInteger.prototype.am = am2;
        dbits = 30;
    } else if (j_lm && (navigator.appName != "Netscape")) {
        BigInteger.prototype.am = am1;
        dbits = 26;
    } else { // Mozilla/Netscape seems to prefer am3
        BigInteger.prototype.am = am3;
        dbits = 28;
    }

     navigator主要是对浏览器的判断,同时小程序中没有appName,直接删除或者保留最后一个else即可。这个解决后还会有其他的问题按照报错做兼容处理即可

    BigInteger.prototype.am = am3;
    dbits = 28;

    (2)兼容window.crypto

    if (window.crypto && window.crypto.getRandomValues) {
      // Extract entropy (2048 bits) from RNG if available
      var z = new Uint32Array(256);
      window.crypto.getRandomValues(z);
      for (t = 0; t < z.length; ++t) {
        rng_pool[rng_pptr++] = z[t] & 255;
      }
    }

    注释上面代码改为下方代码

    var getRandomValues = function (array) {
      for (var i = 0, l = array.length; i < l; i++) {
        array[i] = Math.floor(Math.random() * 256);
      }    return array;
    }
    var z = new Uint32Array(256);
    getRandomValues(z);

    (3)兼容window.removeEventListener、window.detachEvent,直接将所有的监听事件注释即可。

    if (window.removeEventListener) {
      window.removeEventListener("mousemove", onMouseMoveListener_1, false);
    }
    else if (window.detachEvent) {
      window.detachEvent("onmousemove", onMouseMoveListener_1);
    } //这个可以不用注释
    if (window.addEventListener) {
      window.addEventListener("mousemove", onMouseMoveListener_1, false);
    }
    else if (window.attachEvent) {
      window.attachEvent("onmousemove", onMouseMoveListener_1);
    }

    (4)JSEncrypt对象不存在,直接注释即可。

    window.JSEncrypt = JSEncrypt
  • 相关阅读:
    网站添加微信支付功能(小白填坑)
    spring项目中如何添加定时器以及在定时器中自动生成sprng注入对象
    当时间一天天流逝,一个三十岁的屌丝程序员留下了了什么?
    解决使用canvas生成含有微信头像的邀请海报没有微信头像
    jQuery v1.10.2如何判断checkbox(复选框)是否被选中
    调用钉钉接口发送消息
    .net core ajax使用EPPlus上传excle导入总结
    Java企业级权限管理系统的开发总结
    RESTful学习小结
    JS实战(京东秒杀)
  • 原文地址:https://www.cnblogs.com/cailijuan/p/16043308.html
Copyright © 2020-2023  润新知