轉自: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