Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.03.2014, 20:29
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Является ли объект DOM объектом
Пишу я функцию.
Функция принимает в параметре DOM элемент.
В процессе работы функция может имитировать клик по переданному элементу.
function foo(elem){
    elem.click();
    // or
    elem.submit()
}

Это будет модуль ajax проверки авторизации перед действием, но суть не в этом.
Нужно в функции сразу проверить, является переданный параметр DOM элементом. Ну и в разумных пределах отфильтровать, так как head и body тоже имеют метод click.
var doc = document;
var head = document.head;
var body = document.body;
var div = document.getElementById("dv");

console.log("document");
console.log("nodeType: "+ doc.nodeType);
console.log("typeObject: "+ new Object().toString.call(doc));
console.log("click: "+ doc.click);
console.log("---");

console.log("head");
console.log("nodeType: "+ head.nodeType);
console.log("typeObject: "+ new Object().toString.call(head));
console.log("click: "+ head.click);
console.log("---");

console.log("body");
console.log("nodeType: "+ doc.nodeType);
console.log("typeObject: "+ new Object().toString.call(body));
console.log("click: "+ body.click);
console.log("---");

console.log("div");
console.log("nodeType: "+ doc.nodeType);
console.log("typeObject: "+ new Object().toString.call(div));
console.log("click: "+ div.click);

Код:
document
nodeType: 9
typeObject: [object HTMLDocument]
click: undefined
---
head
nodeType: 1
typeObject: [object HTMLHeadElement]
click: function click() {
    [native code]
}
---
body
nodeType: 9
typeObject: [object HTMLBodyElement]
click: function click() {
    [native code]
}
---
div
nodeType: 9
typeObject: [object HTMLDivElement]
click: function click() {
    [native code]
}
Ответить с цитированием
  #2 (permalink)  
Старый 24.03.2014, 21:35
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

if(typeof element.nodeType === "undefined" || element.nodeType !== 1 || /^(HTML|HEAD|BODY)$/i.test(element.nodeName)){}

Больше ниче в голову не приходит
Ответить с цитированием
  #3 (permalink)  
Старый 24.03.2014, 23:02
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Я делал так, но тесты оставляют желать лучшего.

Кроме того, если ты проверяешь на DOM элемент, вероятно, тебе следует пересмотреть функцию/архитектуру.
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 24.03.2014, 23:24
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Сообщение от nerv_
Кроме того, если ты проверяешь на DOM элемент, вероятно, тебе следует пересмотреть функцию/архитектуру
Почему?
Функция принимает DOM элемент, по которому кликнул пользователь. Сразу же отменяет действие возвращая false. Проверяет на сервере авторизацию пользователя и если все нормально, то эмулирует отмененное действие. Но перед тем как начать работать, функция должна удостовериться, что ей передали действительно DOM элемент, к которому применим click или submit. Ну и html, head и body отбрасываются
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2014, 23:40
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Сообщение от nerv_
Я делал так
Я таким макаром написал isArray и isObject
$G.isObject = function(test){
	if(test === null || test === undefined){return false;}
	return ({}.toString.call(test) == "[object Object]");
};

$G.isArray = function(test){
	if(test === null || test === undefined){return false;}
	return ({}.toString.call(test) == "[object Array]");
};
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2014, 00:22
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Проверять через Object.prototype.toString в IE не вариант. Например, в 9-м выдаёт "[object Object]", ибо никаких HTMLElement или HTMLDivElement там нет.
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2014, 01:59
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от Sweet
Например, в 9-м выдаёт "[object Object]"
в восьмом. Только что проверил. В девятом норм, кроме document

Тем не менее, соглашусь, что это не очень надежная проверка

Вероятно, можно проверить, например, так (IE9+):
function isElement(v) {
    if (typeof v !== 'object') return false;
    if (v === null) return false;
    var c = window.HTMLDocument || window.Document;
    return v instanceof c || v instanceof window.HTMLElement;
}

alert(isElement(document));
alert(isElement(document.documentElement));
alert(isElement(document.head));
alert(isElement(document.body));
alert(isElement(null));
alert(isElement({}));


upd: А вообще, как ты гуглил?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 25.03.2014 в 02:09.
Ответить с цитированием
  #8 (permalink)  
Старый 25.03.2014, 02:24
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от nerv_
В девятом норм, кроме document
Действительно, норм. Я без DOCTYPE проверял, в режиме совместимости.
Ответить с цитированием
  #9 (permalink)  
Старый 25.03.2014, 02:50
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Может проверять есть ли у элемента родитель (parentElement, parentNode) и от этого стартовать. Это так мысли вслух
Ответить с цитированием
  #10 (permalink)  
Старый 25.03.2014, 06:23
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от Hapson
функция должна удостовериться, что ей передали действительно DOM элемент, к которому применим click или submit
проверяй инстанс EventTarget
function isEventTarget(obj) {
	return Object(obj) === obj && obj instanceof EventTarget;
}
на этом бы и остановились, если бы не IE, даже в 11 нет EventTarget, поэтому перечислим конструкторы объектов, имеющих события
//IE8+
function isEventTarget(obj) {
	return Object(obj) === obj && [
		obj instanceof (window.EventTarget || function () {}),
		obj instanceof (window.HTMLElement || window.Element),
		obj instanceof HTMLDocument,
		obj instanceof Window,
		obj instanceof XMLHttpRequest
	].indexOf(true) != -1;
}
ну и по желанию можно дописать всякие Comment, Text и др., чтобы сравнять результаты во всех браузерах

Последний раз редактировалось Octane, 25.03.2014 в 06:34.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
jQuery: 'accepts': есть null или не является объектом sitesv Элементы интерфейса 0 08.04.2013 13:44
$('li').get(0) не является объектом? ololosh jQuery 7 25.07.2012 22:47
JQuery как из присланой ajax-ом data сделать DOM объект vuler Общие вопросы Javascript 1 16.04.2012 23:43
Перевод на новую строку JS воспринимает как объект DOM Rig Events/DOM/Window 6 26.12.2011 20:08
Почему jQuery является одновременно функцией и объектом? FINoM jQuery 3 14.02.2011 02:44