|
Является ли объект 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 |
if(typeof element.nodeType === "undefined" || element.nodeType !== 1 || /^(HTML|HEAD|BODY)$/i.test(element.nodeName)){}
Больше ниче в голову не приходит |
|
Цитата:
Функция принимает DOM элемент, по которому кликнул пользователь. Сразу же отменяет действие возвращая false. Проверяет на сервере авторизацию пользователя и если все нормально, то эмулирует отмененное действие. Но перед тем как начать работать, функция должна удостовериться, что ей передали действительно DOM элемент, к которому применим click или submit. Ну и html, head и body отбрасываются |
Цитата:
$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]");
};
|
Проверять через Object.prototype.toString в IE не вариант. Например, в 9-м выдаёт "[object Object]", ибо никаких HTMLElement или HTMLDivElement там нет.
|
Цитата:
Тем не менее, соглашусь, что это не очень надежная проверка :) Вероятно, можно проверить, например, так (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: А вообще, как ты гуглил? |
Цитата:
|
Может проверять есть ли у элемента родитель (parentElement, parentNode) и от этого стартовать. Это так мысли вслух :)
|
Цитата:
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 и др., чтобы сравнять результаты во всех браузерах |
| Часовой пояс GMT +3, время: 00:40. |
|