|
Является ли объект 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, время: 16:17. |
|