小程序使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM