最近开发过程中遇到一个问题,就是在h5的电脑端和手机端使用jsencrypt进行加解密数据,没有任何问题,而在编译成小程序的时候就会报错(我是使用的uni-app开发)
这个错误的原因就在于jsencrypt代码中里面含有window、document、navigator等对象,而这些对象在小程序中并没有,所以当代码执行到相应的位置就就报错了。导致微信小程序的项目跑不起来。
我们可以尝试着修改一下源代码,将微信小程序中用不到的对象注释或者修改即可,下面是我修改的部分
/***************************************修改******************************************/
// 修改前:
// 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;
// }
// 修改后:
// 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;
// }
/************************************************************************************/
/*****************************************修改*******************************************/
// 修改前
// 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);
// Use mouse events for entropy, if we do not have enough entropy by the time
// we need it, entropy will be generated by Math.random.
var onMouseMoveListener_1 = function (ev) {
this.count = this.count || 0;
if (this.count >= 256 || rng_pptr >= rng_psize) {
// 注释:
// if (window.removeEventListener) {
// window.removeEventListener("mousemove", onMouseMoveListener_1, false);
// }
// else if (window.detachEvent) {
// window.detachEvent("onmousemove", onMouseMoveListener_1);
// }
return;
}
try {
var mouseCoordinates = ev.x + ev.y;
rng_pool[rng_pptr++] = mouseCoordinates & 255;
this.count += 1;
}
catch (e) {
// Sometimes Firefox will deny permission to access event properties for some reason. Ignore.
}
};
// 注释:
// if (window.addEventListener) {
// window.addEventListener("mousemove", onMouseMoveListener_1, false);
// }
// else if (window.attachEvent) {
// window.attachEvent("onmousemove", onMouseMoveListener_1);
// }
}
/****************************************************************************************/