|
|
|
@ -2,80 +2,95 @@
|
|
|
|
|
* 用于 jquery 在 worker 环境或者 V8 引擎的 polyfill |
|
|
|
|
*/ |
|
|
|
|
import { _global } from "@/core/0.foundation"; |
|
|
|
|
if (!_global.window) { |
|
|
|
|
_global.window = _global; |
|
|
|
|
const document = (_global.document = {}); |
|
|
|
|
const fakeElement = Object.create(document); |
|
|
|
|
|
|
|
|
|
Object.assign(document, { |
|
|
|
|
parentNode: null, |
|
|
|
|
nodeType: 9, |
|
|
|
|
head: fakeElement, |
|
|
|
|
body: fakeElement, |
|
|
|
|
ownerDocument: document, |
|
|
|
|
documentElement: document, |
|
|
|
|
toString() { |
|
|
|
|
return "FakeDocument"; |
|
|
|
|
}, |
|
|
|
|
appendChild(child) { |
|
|
|
|
return child; |
|
|
|
|
}, |
|
|
|
|
implementation: { |
|
|
|
|
createHTMLDocument() { |
|
|
|
|
return { |
|
|
|
|
body: { |
|
|
|
|
childNodes: [], |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
}, |
|
|
|
|
createDocumentFragment() { |
|
|
|
|
return this; |
|
|
|
|
}, |
|
|
|
|
}, |
|
|
|
|
getElementById() { |
|
|
|
|
return fakeElement; |
|
|
|
|
}, |
|
|
|
|
createElement() { |
|
|
|
|
return fakeElement; |
|
|
|
|
// const _global = globalThis;
|
|
|
|
|
|
|
|
|
|
const document = {}; |
|
|
|
|
const fakeElement = Object.create(document); |
|
|
|
|
|
|
|
|
|
Object.assign(document, { |
|
|
|
|
parentNode: null, |
|
|
|
|
nodeType: 9, |
|
|
|
|
head: fakeElement, |
|
|
|
|
body: fakeElement, |
|
|
|
|
ownerDocument: document, |
|
|
|
|
documentElement: document, |
|
|
|
|
toString() { |
|
|
|
|
return "FakeDocument"; |
|
|
|
|
}, |
|
|
|
|
appendChild(child) { |
|
|
|
|
return child; |
|
|
|
|
}, |
|
|
|
|
implementation: { |
|
|
|
|
createHTMLDocument() { |
|
|
|
|
return { |
|
|
|
|
body: { |
|
|
|
|
childNodes: [], |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
}, |
|
|
|
|
createDocumentFragment() { |
|
|
|
|
return this; |
|
|
|
|
}, |
|
|
|
|
cloneNode() { |
|
|
|
|
return this; |
|
|
|
|
}, |
|
|
|
|
getElementsByTagName() { |
|
|
|
|
return [fakeElement]; |
|
|
|
|
}, |
|
|
|
|
getElementsByClassName() { |
|
|
|
|
return [fakeElement]; |
|
|
|
|
}, |
|
|
|
|
setAttribute() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
getAttribute() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
removeChild() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
addEventListener() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
removeEventListener() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
}, |
|
|
|
|
getElementById() { |
|
|
|
|
return fakeElement; |
|
|
|
|
}, |
|
|
|
|
createElement() { |
|
|
|
|
return fakeElement; |
|
|
|
|
}, |
|
|
|
|
createDocumentFragment() { |
|
|
|
|
return this; |
|
|
|
|
}, |
|
|
|
|
cloneNode() { |
|
|
|
|
return this; |
|
|
|
|
}, |
|
|
|
|
getElementsByTagName() { |
|
|
|
|
return [fakeElement]; |
|
|
|
|
}, |
|
|
|
|
getElementsByClassName() { |
|
|
|
|
return [fakeElement]; |
|
|
|
|
}, |
|
|
|
|
setAttribute() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
getAttribute() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
removeChild() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
addEventListener() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
removeEventListener() { |
|
|
|
|
return null; |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
Object.assign(fakeElement, { |
|
|
|
|
nodeType: 1, |
|
|
|
|
style: {}, |
|
|
|
|
ownerDocument: document, |
|
|
|
|
parentNod: fakeElement, |
|
|
|
|
firstChild: fakeElement, |
|
|
|
|
lastChild: fakeElement, |
|
|
|
|
toString() { |
|
|
|
|
return "FakeElement"; |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
Object.assign(fakeElement, { |
|
|
|
|
nodeType: 1, |
|
|
|
|
style: {}, |
|
|
|
|
ownerDocument: document, |
|
|
|
|
parentNod: fakeElement, |
|
|
|
|
firstChild: fakeElement, |
|
|
|
|
lastChild: fakeElement, |
|
|
|
|
toString() { |
|
|
|
|
return "FakeElement"; |
|
|
|
|
}, |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
function polyfillProps(key, obj) { |
|
|
|
|
_global[key] = _global[key] || obj; |
|
|
|
|
if (typeof obj === "object") { |
|
|
|
|
try { |
|
|
|
|
Object.assign(_global[key], obj); |
|
|
|
|
} catch(err) { |
|
|
|
|
// _global[key] 可能只有 get 方法
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_global.window = _global; |
|
|
|
|
polyfillProps("XMLHttpRequest", function () {}); |
|
|
|
|
polyfillProps("document", document); |
|
|
|
|