Как определить что объект принадлежит к разделу нативного DOM объекта
Вот и у меня назрел подобный вопрос... как определить что объект принадлежит к разделу нативного DOM объекта. Простыми словами не элемент а именно объект... например:
CSSStyleDeclaration - у него нет всяких nodeType и прочего но он является DOM-объектом и не имеет наследника Element или Node или пуще EventTarget. Ну и соответственно другие объекты подобного типа помимо Node-элементов. Есть идеи? Я конечно найду решение, но может кто что знает уже или сталкивался с подобным вопросом? В ИЕ до восьмой версии включительно, все просто, любой native-DOM-объект проверяя: alert(CSSStyleDeclaration.prototype instanceof Object); // false в ИЕ8 и true везде кроме ИЕ8 и нижеА вот с другими браузерами и ИЕ9+ уже такой вариант не канает... |
Я нативность проверяю как
obj.constructor.toString() У нативных объектов будет сообщение типа function ...() { [native code] } |
Цитата:
|
1. У меня почему-то дежавю.
2. А что ты подразумеваешь под DOM? XMLHttpRequest например - это ведь не DOM, но и не часть языка. Также как URL и прочие браузерные объекты. Если язык от браузерых надстроек ещё отличить можно, то дальше без списков в хардкоде врядли получится пойти. |
Цитата:
Цитата:
Цитата:
Я конечно не совсем правильно выразился про то что мне нужны все native-DOM объекты... скорее правильно выразится так: Мне нужны все объекты являющиеся частью браузерных объектов а не частью объектов языка JavaScript... примерно так. |
Експеримент в консольке FF:
function isNativeDOMObject(obj){ if(obj.prototype) obj = obj.prototype; if(obj.constructor) obj = obj.constructor; try{ Function.prototype.toString.call(obj) }catch(e){ return true } return false } alert([ 'document.body', isNativeDOMObject(document.body), 'document', isNativeDOMObject(document), 'CSSStyleDeclaration', isNativeDOMObject(CSSStyleDeclaration), 'document.body.style', isNativeDOMObject(document.body.style), 'NaN', isNativeDOMObject(NaN), 'new String("abc")', isNativeDOMObject(new String("abc")), 'new XMLHttpRequest()', isNativeDOMObject(new XMLHttpRequest()), 'XMLHttpRequest', isNativeDOMObject(XMLHttpRequest), 'URL', isNativeDOMObject(URL) ].join('\n')) На верность результата не претендую, просто рандомно пойманная закономерность.) |
Цитата:
Цитата:
|
devote, ну мы же таки имеем дело с браузерными надстройками, очевидно для каждого браузера придётся подбирать свой способ. Конечно можно порыться в стандарте, может там указаны какие-нибудь чёткие критерии, но то уже не ко мне.)
|
Aetae,
ну понятно что за счет костылей для каждого браузера может оно у нас и получится. Но я думаю что обойдусь... Но все равно спасибо за то что потратили время на мою проблему. |
Думаю, правильное название темы должно выглядеть так: "Как отличить host объекты от built-in объектов?"
похожая тема |
DOM или BOM? Каков пример, таков ответ:
alert('CSSStyleDeclaration' in window); Вариант: 1. создать девственный iframe 2. пройтись по всем глобальным конструкторам этого айфрейма (тут, кстати, можно ограничить список): object instanceof constructor --- UPD, я понял тему так: как отличить пользовательские объекты от браузерных. Додумывать надо: function isBrowserObject(obj) { var clazz = Object.prototype.toString.call(obj).slice(8, -1); var isConstructor = /^[A-Z]/.test(clazz); return isConstructor && (clazz in window); } alert(isBrowserObject(new XMLHttpRequest())); |
все, все успокойтесь уже... я понял что был не прав))) бредовая это идея. Обойдусь без нее)))
А вообще конечно спасибо что вливаетесь в то что по сути считается бредом))) |
Часовой пояс GMT +3, время: 20:42. |