Files
App-Installer-For-Windows-8…/shared/html/js/polyfill-ie.js
2026-04-02 11:33:57 +08:00

532 lines
19 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function(global) {
if (typeof msWriteProfilerMark === "undefined") {
function msWriteProfilerMark(swMark) {
if (typeof performance !== "undefined" && typeof performance.mark === "function") {
return performance.mark(swMark);
} else if (typeof console !== "undefined" && typeof console.log === "function") {
return console.log(swMark);
}
}
module.exports = {
msWriteProfilerMark: msWriteProfilerMark
};
}
})(this);
(function(global) {
if (typeof global.Debug === "undefined") {
var fakeDebug = {};
// 基本属性
fakeDebug.debuggerEnabled = true;
fakeDebug.setNonUserCodeExceptions = false;
// 常量
fakeDebug.MS_ASYNC_CALLBACK_STATUS_ASSIGN_DELEGATE = 0;
fakeDebug.MS_ASYNC_CALLBACK_STATUS_JOIN = 1;
fakeDebug.MS_ASYNC_CALLBACK_STATUS_CHOOSEANY = 2;
fakeDebug.MS_ASYNC_CALLBACK_STATUS_CANCEL = 3;
fakeDebug.MS_ASYNC_CALLBACK_STATUS_ERROR = 4;
fakeDebug.MS_ASYNC_OP_STATUS_SUCCESS = 1;
fakeDebug.MS_ASYNC_OP_STATUS_CANCELED = 2;
fakeDebug.MS_ASYNC_OP_STATUS_ERROR = 3;
// 方法:输出
fakeDebug.write = function(msg) {
if (console && console.log) console.log("[Debug.write] " + msg);
};
fakeDebug.writeln = function(msg) {
if (console && console.log) console.log("[Debug.writeln] " + msg);
};
// 方法:断言 / 中断
fakeDebug.assert = function(cond, msg) {
if (!cond) {
if (console && console.error) {
console.error("[Debug.assert] Assertion failed: " + (msg || ""));
}
// 可选触发断点
// debugger;
}
};
fakeDebug.break = function() {
debugger;
};
// 方法:异步跟踪(空实现)
fakeDebug.msTraceAsyncCallbackCompleted = function() {};
fakeDebug.msTraceAsyncCallbackStarting = function() {};
fakeDebug.msTraceAsyncOperationCompleted = function() {};
fakeDebug.msTraceAsyncOperationStarting = function() {};
fakeDebug.msUpdateAsyncCallbackRelation = function() {};
global.Debug = fakeDebug;
}
})(this);
(function(global) {
if (typeof global.setImmediate === "undefined") {
var nextHandle = 1; // 唯一任务 id
var tasksByHandle = {};
var currentlyRunning = false;
function addTask(fn, args) {
tasksByHandle[nextHandle] = function() {
fn.apply(undefined, args);
};
return nextHandle++;
}
function run(handle) {
if (currentlyRunning) {
// 如果已经在运行,延迟一下
setTimeout(run, 0, handle);
} else {
var task = tasksByHandle[handle];
if (task) {
currentlyRunning = true;
try {
task();
} finally {
delete tasksByHandle[handle];
currentlyRunning = false;
}
}
}
}
function installSetImmediate() {
if (typeof MessageChannel !== "undefined") {
var channel = new MessageChannel();
channel.port1.onmessage = function(event) {
run(event.data);
};
return function() {
var handle = addTask(arguments[0], Array.prototype.slice.call(arguments, 1));
channel.port2.postMessage(handle);
return handle;
};
} else {
// fallback: setTimeout
return function() {
var handle = addTask(arguments[0], Array.prototype.slice.call(arguments, 1));
setTimeout(run, 0, handle);
return handle;
};
}
}
global.setImmediate = installSetImmediate();
// 对应 clearImmediate
if (typeof global.clearImmediate === "undefined") {
global.clearImmediate = function(handle) {
delete tasksByHandle[handle];
};
}
}
})(this);
// attachEvent / detachEvent polyfill for IE11+
(function() {
if (!Element.prototype.attachEvent) {
Element.prototype.attachEvent = function(eventName, handler) {
// IE attachEvent 的事件名需要 "on" 前缀
eventName = eventName.toLowerCase();
// 包装函数,模仿旧 IE 的 event 对象
var wrapper = function(e) {
e = e || window.event;
// 兼容 IE 风格 event 属性
e.srcElement = e.target || this;
e.returnValue = true;
e.cancelBubble = false;
// 模拟 IE 的防止默认行为
Object.defineProperty(e, "cancelBubble", {
set: function(val) {
if (val) e.stopPropagation();
}
});
Object.defineProperty(e, "returnValue", {
set: function(val) {
if (val === false) e.preventDefault();
}
});
// 调用原事件处理函数
return handler.call(this, e);
};
// 存储 handler 映射,供 detachEvent 用
if (!this._attachEventWrappers) this._attachEventWrappers = {};
if (!this._attachEventWrappers[eventName]) this._attachEventWrappers[eventName] = [];
this._attachEventWrappers[eventName].push({
original: handler,
wrapped: wrapper
});
this.addEventListener(eventName.replace(/^on/, ""), wrapper, false);
};
Element.prototype.detachEvent = function(eventName, handler) {
eventName = eventName.toLowerCase();
if (!this._attachEventWrappers || !this._attachEventWrappers[eventName]) return;
var list = this._attachEventWrappers[eventName];
for (var i = 0; i < list.length; i++) {
if (list[i].original === handler) {
this.removeEventListener(eventName.replace(/^on/, ""), list[i].wrapped, false);
list.splice(i, 1);
break;
}
}
};
}
})();
(function(global) {
"use strict";
if (typeof Array.prototype.forEach === "undefined") {
Array.prototype.forEach = function(callback, thisArg) {
var T, k;
if (this == null) {
throw new TypeError(" this is null or not defined");
}
var O = Object(this);
var len = O.length >>> 0;
if (typeof callback !== "function") {
throw new TypeError(callback + " is not a function");
}
if (arguments.length > 1) {
T = thisArg;
}
k = 0;
while (k < len) {
var kValue;
if (k in O) {
kValue = O[k];
callback.call(T, kValue, k, O);
}
k++;
}
};
}
})(this);
(function(global) {
if (typeof global.Map === "undefined") {
function Map() {
this.elements = new Array();
// 获取Map元素个数
this.size = function() {
return this.elements.length;
},
// 判断Map是否为空
this.isEmpty = function() {
return (this.elements.length < 1);
},
// 删除Map所有元素
this.clear = function() {
this.elements = new Array();
},
// 向Map中增加元素key, value)
this.put = function(_key, _value) {
if (this.containsKey(_key) == true) {
if (this.containsValue(_value)) {
if (this.remove(_key) == true) {
this.elements.push({
key: _key,
value: _value
});
}
} else {
this.elements.push({
key: _key,
value: _value
});
}
} else {
this.elements.push({
key: _key,
value: _value
});
}
},
// 向Map中增加元素key, value)
this.set = function(_key, _value) {
if (this.containsKey(_key) == true) {
if (this.containsValue(_value)) {
if (this.remove(_key) == true) {
this.elements.push({
key: _key,
value: _value
});
}
} else {
this.elements.push({
key: _key,
value: _value
});
}
} else {
this.elements.push({
key: _key,
value: _value
});
}
},
// 删除指定key的元素成功返回true失败返回false
this.remove = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
this.elements.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 删除指定key的元素成功返回true失败返回false
this.delete = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
this.elements.splice(i, 1);
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 获取指定key的元素值value失败返回null
this.get = function(_key) {
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
return this.elements[i].value;
}
}
} catch (e) {
return null;
}
},
// set指定key的元素值value
this.setValue = function(_key, _value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
this.elements[i].value = _value;
return true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 获取指定索引的元素使用element.keyelement.value获取key和value失败返回null
this.element = function(_index) {
if (_index < 0 || _index >= this.elements.length) {
return null;
}
return this.elements[_index];
},
// 判断Map中是否含有指定key的元素
this.containsKey = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 判断Map中是否含有指定key的元素
this.has = function(_key) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].key == _key) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 判断Map中是否含有指定value的元素
this.containsValue = function(_value) {
var bln = false;
try {
for (i = 0; i < this.elements.length; i++) {
if (this.elements[i].value == _value) {
bln = true;
}
}
} catch (e) {
bln = false;
}
return bln;
},
// 获取Map中所有key的数组array
this.keys = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].key);
}
return arr;
},
// 获取Map中所有value的数组array
this.values = function() {
var arr = new Array();
for (i = 0; i < this.elements.length; i++) {
arr.push(this.elements[i].value);
}
return arr;
};
/**
* map遍历数组
* @param callback [function] 回调函数;
* @param context [object] 上下文;
*/
this.forEach = function forEach(callback, context) {
context = context || window;
//IE6-8下自己编写回调函数执行的逻辑
var newAry = new Array();
for (var i = 0; i < this.elements.length; i++) {
if (typeof callback === 'function') {
var val = callback.call(context, this.elements[i].value, this.elements[i].key, this.elements);
newAry.push(this.elements[i].value);
}
}
return newAry;
}
}
global.Map = Map;
}
})(this);
(function(global) {
if (typeof global.Set === "undefined") {
function Set() {
var items = {};
this.size = 0;
// 实现has方法
// has(val)方法
this.has = function(val) {
// 对象都有hasOwnProperty方法判断是否拥有特定属性
return items.hasOwnProperty(val);
};
// 实现add
this.add = function(val) {
if (!this.has(val)) {
items[val] = val;
this.size++; // 累加集合成员数量
return true;
}
return false;
};
// delete(val)方法
this.delete = function(val) {
if (this.has(val)) {
delete items[val]; // 将items对象上的属性删掉
this.size--;
return true;
}
return false;
};
// clear方法
this.clear = function() {
items = {}; // 直接将集合赋一个空对象即可
this.size = 0;
};
// keys()方法
this.keys = function() {
return Object.keys(items); // 返回遍历集合的所有键名的数组
};
// values()方法
this.values = function() {
return Object.values(items); // 返回遍历集合的所有键值的数组
};
// forEach(fn, context)方法
this.forEach = function(fn, context) {
for (var i = 0; i < this.size; i++) {
var item = Object.keys(items)[i];
fn.call(context, item, item, items);
}
};
// 并集
this.union = function(other) {
var union = new Set();
var values = this.values();
for (var i = 0; i < values.length; i++) {
union.add(values[i]);
}
values = other.values(); // 将values重新赋值为新的集合
for (var i = 0; i < values.length; i++) {
union.add(values[i]);
}
return union;
};
// 交集
this.intersect = function(other) {
var intersect = new Set();
var values = this.values();
for (var i = 0; i < values.length; i++) {
if (other.has(values[i])) { // 查看是否也存在于other中
intersect.add(values[i]); // 存在的话就像intersect中添加元素
}
}
return intersect;
};
// 差集
this.difference = function(other) {
var difference = new Set();
var values = this.values();
for (var i = 0; i < values.length; i++) {
if (!other.has(values[i])) { // 将不存在于other集合中的添加到新的集合中
difference.add(values[i]);
}
}
return difference;
};
}
global.Set = Set;
}
})(this);