Почему один и тот же объект может возвращать разные экземпляры в разных браузерах?
Я использую плагин AOS, и он передает объект на пользовательское событие. Объект выглядит так:
[object Object]: {detail: Object}
detail: Object
accessKey: ""
align: ""
attributes: Object
baseURI: "http://localhost:3000/docs/countup.html"
childElementCount: 0
childNodes: Object
children: Object
classList: Object
className: "aos-init aos-animate"
clientHeight: 0
clientLeft: 0
clientTop: 0
clientWidth: 788
contentEditable: "inherit"
dataset: Object
dir: ""
draggable: false
firstChild: null
firstElementChild: null
hidden: false
hideFocus: false
id: ""
innerHTML: ""
innerText: ""
isContentEditable: false
lang: ""
lastChild: null
lastElementChild: null
localName: "h1"
msContentZoomFactor: 1
msRegionOverflow: "undefined"
namespaceURI: "http://www.w3.org/1999/xhtml"
nextElementSibling: Object
nextSibling: Object
nodeName: "H1"
nodeType: 1
nodeValue: null
offsetHeight: 0
offsetLeft: 32
offsetParent: Object
offsetTop: 48
offsetWidth: 788
onabort: null
onactivate: null
onbeforeactivate: null
onbeforecopy: null
onbeforecut: null
onbeforedeactivate: null
onbeforepaste: null
onblur: null
oncanplay: null
oncanplaythrough: null
onchange: null
onclick: null
oncontextmenu: null
oncopy: null
oncuechange: null
oncut: null
ondblclick: null
ondeactivate: null
ondrag: null
ondragend: null
ondragenter: null
ondragleave: null
ondragover: null
ondragstart: null
ondrop: null
ondurationchange: null
onemptied: null
onended: null
onerror: null
onfocus: null
ongotpointercapture: null
oninput: null
oninvalid: null
onkeydown: null
onkeypress: null
onkeyup: null
onload: null
onloadeddata: null
onloadedmetadata: null
onloadstart: null
onlostpointercapture: null
onmousedown: null
onmouseenter: null
onmouseleave: null
onmousemove: null
onmouseout: null
onmouseover: null
onmouseup: null
onmousewheel: null
onmscontentzoom: null
onmsgesturechange: null
onmsgesturedoubletap: null
onmsgestureend: null
onmsgesturehold: null
onmsgesturestart: null
onmsgesturetap: null
onmsinertiastart: null
onmsmanipulationstatechanged: null
onpaste: null
onpause: null
onplay: null
onplaying: null
onpointercancel: null
onpointerdown: null
onpointerenter: null
onpointerleave: null
onpointermove: null
onpointerout: null
onpointerover: null
onpointerup: null
onprogress: null
onratechange: null
onreset: null
onscroll: null
onseeked: null
onseeking: null
onselect: null
onselectstart: null
onstalled: null
onsubmit: null
onsuspend: null
ontimeupdate: null
onvolumechange: null
onwaiting: null
onwebkitfullscreenchange: null
onwebkitfullscreenerror: null
onwheel: null
outerHTML: "<h1 class="aos-init aos-animate" data-aos="" data-toggle="countup" data-to="256" data-from="0" data-aos-id="countup:in"></h1>"
outerText: ""
ownerDocument: Object
parentElement: Object
parentNode: Object
prefix: null
previousElementSibling: Object
previousSibling: Object
scrollHeight: 0
scrollLeft: 0
scrollTop: 0
scrollWidth: 788
spellcheck: true
style: Object
tabIndex: 0
tagName: "H1"
textContent: ""
title: ""
__proto__: Object
__proto__: Object
Объект выше передается как e.detail
, Проблема в том, когда я бегу e.detail instanceof Element
это возвращается true
во всех браузерах, кроме IE и Edge. В IE и Edge это возвращает false
поэтому я не могу работать с ним как с обычным элементом DOM. Есть идеи почему? Есть ли способ разобрать это или что-то?
1 ответ
Вы не можете полагаться на многое, когда дело доходит до предоставляемых хостом объектов, таких как элементы DOM. Как вы обнаружили, разные хосты могут реализовывать разные вещи по-разному.
По отдельности: instanceof
не надежная перекрестная сфера. Поэтому, если вы получаете объект (любого рода, а не только предоставленный хостом объект) из другого окна (которое является другой областью), instanceof
вероятно потерпит неудачу. Это потому что путь instanceof
работает, проверяя цепочку прототипов объекта, на котором вы все это делаете, и выясняя, является ли какой-либо из его прототипов объектом на prototype
свойство функции, с которой вы сравниваете его (Element
в вашем примере). Это часть того, почему мы имеем Array.isArray
, так как a instanceof Array
терпит неудачу, если массив прибывает из другого окна.
Там нет причин для использования instanceof
на элемент DOM. Просто используйте элемент. Если вы хотите убедиться, что это элемент, достаточно надежная проверка a.detail.nodeType === 1
, (Надежно, как в: Это будет работать для любого элемента DOM. Естественно, если кто-то дает вам объект с nodeType
свойство с avlue 1, которое не является элементом DOM, оно пройдет проверку, но...)