Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как определить что объект принадлежит к разделу нативного DOM объекта (https://javascript.ru/forum/offtopic/48116-kak-opredelit-chto-obekt-prinadlezhit-k-razdelu-nativnogo-dom-obekta.html)

devote 20.06.2014 10:52

Как определить что объект принадлежит к разделу нативного DOM объекта
 
Вот и у меня назрел подобный вопрос... как определить что объект принадлежит к разделу нативного DOM объекта. Простыми словами не элемент а именно объект... например:
CSSStyleDeclaration - у него нет всяких nodeType и прочего но он является DOM-объектом и не имеет наследника Element или Node или пуще EventTarget. Ну и соответственно другие объекты подобного типа помимо Node-элементов.

Есть идеи? Я конечно найду решение, но может кто что знает уже или сталкивался с подобным вопросом?

В ИЕ до восьмой версии включительно, все просто, любой native-DOM-объект проверяя:
alert(CSSStyleDeclaration.prototype instanceof Object); // false в ИЕ8 и true везде кроме ИЕ8 и ниже
А вот с другими браузерами и ИЕ9+ уже такой вариант не канает...

kobezzza 20.06.2014 11:41

Я нативность проверяю как

obj.constructor.toString()


У нативных объектов будет сообщение типа

function ...() {
    [native code]
}

devote 20.06.2014 12:15

Цитата:

Сообщение от kobezzza
У нативных объектов будет сообщение типа

ну это я в курсе... тока мне надо проверять нативность DOM объектов а не всех... например нужно сделать метод типа isNativeDOMObject() которому в аргумент передав простой объект получим false а вот если передадим элемент или то что относится к DOM что бы вернул true...

Aetae 20.06.2014 14:43

1. У меня почему-то дежавю.
2. А что ты подразумеваешь под DOM?
XMLHttpRequest например - это ведь не DOM, но и не часть языка. Также как URL и прочие браузерные объекты. Если язык от браузерых надстроек ещё отличить можно, то дальше без списков в хардкоде врядли получится пойти.

devote 20.06.2014 14:50

Цитата:

Сообщение от Aetae
У меня почему-то дежавю.

верно, есть тут кем-то созданное подобное, но там не то... там просто узнать элемент это или нет... А мне нужно немного другое.
Цитата:

Сообщение от Aetae
А что ты подразумеваешь под DOM?

Сложно сказать, все встроенные в браузер объекты кроме встроенных в движок JavaScript. Если объект является частью языка JavaScript значит оно мне не нужно.. Если объект является частью браузера... Значит оно мне нужно... примерно как-то так.

Цитата:

Сообщение от Aetae
XMLHttpRequest например - это ведь не DOM, но и не часть языка. Также как URL и прочие браузерные объекты. Если язык от браузерых надстроек ещё отличить можно, то дальше без списков в хардкоде врядли получится пойти.

Верно не DOM но зато не часть языка JS.. А значит он должен так же определяться встроенным в браузер..


Я конечно не совсем правильно выразился про то что мне нужны все native-DOM объекты... скорее правильно выразится так: Мне нужны все объекты являющиеся частью браузерных объектов а не частью объектов языка JavaScript... примерно так.

Aetae 20.06.2014 15:05

Експеримент в консольке 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 20.06.2014 15:23

Цитата:

Сообщение от Aetae
Експеримент в консольке FF:

Цитата:

Сообщение от Aetae
На верность результата не претендую, просто рандомно пойманная закономерность.)

вот именно что это работает тока для ФФ в хроме все выдает false

Aetae 20.06.2014 15:32

devote, ну мы же таки имеем дело с браузерными надстройками, очевидно для каждого браузера придётся подбирать свой способ. Конечно можно порыться в стандарте, может там указаны какие-нибудь чёткие критерии, но то уже не ко мне.)

devote 20.06.2014 17:08

Aetae,
ну понятно что за счет костылей для каждого браузера может оно у нас и получится. Но я думаю что обойдусь... Но все равно спасибо за то что потратили время на мою проблему.

Octane 20.06.2014 18:44

Думаю, правильное название темы должно выглядеть так: "Как отличить host объекты от built-in объектов?"

похожая тема


Часовой пояс GMT +3, время: 12:19.