ArrayBuffer.прототип.нарезать прокладку для IE?
Internet Explorer не реализует ArrayBuffer.prototype.slice
. Удивительно, но они не планируют реализовать его в ближайшее время. Таким образом, существуют ли какие-либо прокладки для этой функции? Если нет, то это будет канонический ответ в интернете, как только я или кто-то другой реализует его.
2 ответа:
Это, кажется, делает трюк. Открыт для предложений.
if (!ArrayBuffer.prototype.slice) { //Returns a new ArrayBuffer whose contents are a copy of this ArrayBuffer's //bytes from `begin`, inclusive, up to `end`, exclusive ArrayBuffer.prototype.slice = function (begin, end) { //If `begin` is unspecified, Chrome assumes 0, so we do the same if (begin === void 0) { begin = 0; } //If `end` is unspecified, the new ArrayBuffer contains all //bytes from `begin` to the end of this ArrayBuffer. if (end === void 0) { end = this.byteLength; } //Chrome converts the values to integers via flooring begin = Math.floor(begin); end = Math.floor(end); //If either `begin` or `end` is negative, it refers to an //index from the end of the array, as opposed to from the beginning. if (begin < 0) { begin += this.byteLength; } if (end < 0) { end += this.byteLength; } //The range specified by the `begin` and `end` values is clamped to the //valid index range for the current array. begin = Math.min(Math.max(0, begin), this.byteLength); end = Math.min(Math.max(0, end), this.byteLength); //If the computed length of the new ArrayBuffer would be negative, it //is clamped to zero. if (end - begin <= 0) { return new ArrayBuffer(0); } var result = new ArrayBuffer(end - begin); var resultBytes = new Uint8Array(result); var sourceBytes = new Uint8Array(this, begin, end - begin); resultBytes.set(sourceBytes); return result; }; }
Слегка адаптирована в соответствии с комментариями версии Индекса.js из Arraybuffer-slice GitHub repo ттаубера
if (!ArrayBuffer.prototype.slice) { ArrayBuffer.prototype.slice = function (begin, end) { var len = this.byteLength; begin = (begin|0) || 0; end = end === (void 0) ? len : (end|0); // Handle negative values. if (begin < 0) begin = Math.max(begin + len, 0); if (end < 0) end = Math.max(end + len, 0); if (len === 0 || begin >= len || begin >= end) { return new ArrayBuffer(0); } var length = Math.min(len - begin, end - begin); var target = new ArrayBuffer(length); var targetArray = new Uint8Array(target); targetArray.set(new Uint8Array(this, begin, length)); return target; }; }