Text EnderとText DecoderはIEの下で互換性がない問題を解決します.


一、問題が発生する
プロジェクトではバージョンの問題でstomp.jsをアップグレードしなければなりません.しかし、stomp.jsパッケージ内部で使用されるTextEnccoderとText Decoderは、IEの下では互換性がない.全体のプロジェクトはIEの下で走れなくなりました.互換性は入り口を見ます.
二、解決の試み
text-encoding.js
npmで互換ライブラリtext-encoding.jsを見つけました.これはgithubです. ここはnpmリンクアドレスです.残念なことに、この二つはもうメンテナンスを停止しました.会社もオープンソースとして導入することができなくて、放棄しました.もちろん、皆さんの要求はそんなに厳しくないです.完全に使えます.
自分でtext-encoding.jsを書きます.
Stop.jsのソースコードを研究しています.TextEncoderはIEの下で互換性がありませんが、stompではText Encocderの最も基本的なコードだけが使われています.すなわち、utf-8:
//--TextEncoder    
 // 2. Set enc's encoding to UTF-8's encoder.
        if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {
            // NONSTANDARD behavior.
            label = label !== undefined ? String(label) : DEFAULT_ENCODING;
            let encoding = getEncoding(label);
            if (encoding === null || encoding.name === 'replacement') {throw RangeError('Unknown encoding: ' + label);}
            if (!encoders[encoding.name]) {
                throw Error('Encoder not present.' +
                    ' Did you forget to include encoding-indexes.js first?');
            }
            enc._encoding = encoding;
        }
DEFAULT_ENCODINGは、utf−8符号化である.utf-8だけのコードに対しては、ブラウザ対応のunescapeencodeURIComponentを使用して、シミュレーションを行うことができます.
var encoder = new TextEncoder();
      encoder.encode("  abc");
 //result : Uint8Array(9) [228, 184, 173, 230, 150, 135, 97, 98, 99]
unescape(encodeURIComponent("  abc")).split("").map(val => val.charCodeAt());
//result : (9) [228, 184, 173, 230, 150, 135, 97, 98, 99]
同様に、復号は以下の通りである.
var decoder = new TextDecoder();
      decoder.decode(Uint8Array.from([228, 184, 173, 230, 150, 135, 97, 98, 99]));
//result :   abc
decodeURIComponent(escape(String.fromCharCode(...[228, 184, 173, 230, 150, 135, 97, 98, 99])));
//result :   abc
したがって、IEに対応するために、ES 5で以下のようにカプセル化する.
/**
 * @description        。        stomp   textEncoder textDecoder IE       
 *                stomp           utf8  ,      ie  unescape   encodeURIComponent     
 * @param {type} 
 * @Date 2020-07-08 11:45:19
 */
(function(window) {

    if(typeof TextEncoder=="function") {return;}

    function _TextEncoder() {
        //--DO NOTHING
    }
    _TextEncoder.prototype.encode = function(s) {
        //return unescape(encodeURIComponent(s)).split('').map(function(val) {return val.charCodeAt();});
    var data=unescape(encodeURIComponent(s)).split('').map(function(val) {return val.charCodeAt();});
    return typeof Uint8Array=="function"?new Uint8Array(data):data;//new TextEncoder().encode  Uint8Array
    };
    function _TextDecoder() {
        //--DO NOTHING
    }   
    _TextDecoder.prototype.decode = function(code_arr) {
        return decodeURIComponent(escape(String.fromCharCode.apply(null, code_arr)));
    };

    window.TextEncoder = _TextEncoder;
    window.TextDecoder = _TextDecoder;

})(this);
直接引用してください.
転載先:https://blog.csdn.net/qq_29722281/articale/detail/107202540