Я пытаюсь получить:
document.createElement('div') //=> true
{tagName: 'foobar something'} //=> false
В моих собственных сценариях я просто использовал это, поскольку мне никогда не требовалось tagName
как свойство:
if (!object.tagName) throw ...;
Что касается второго объекта, я предложил следующее в качестве быстрого решения, которое в основном работает. ;)
Проблема в том, что браузеры используют свойства только для чтения, что не все делают.
function isDOM(obj) {
var tag = obj.tagName;
try {
obj.tagName = ''; // Read-only for DOM, should throw exception
obj.tagName = tag; // Restore for normal objects
return false;
} catch (e) {
return true;
}
}
Есть хорошая замена?
javascript
dom
object
Джонатан Лоновски
источник
источник
Ответы:
Это может быть интересно:
Это часть DOM, Level2 .
Обновление 2 : так я реализовал это в своей собственной библиотеке: (предыдущий код не работал в Chrome, потому что Node и HTMLElement являются функциями вместо ожидаемого объекта. Этот код протестирован в FF3, IE7, Chrome 1 и Opera 9).
источник
function Fake() {}; Fake.prototype=document.createElement("div"); alert(new Fake() instanceof HTMLElement);
true
к[] instanceof HTMLElement
.HTMLElement
всегда afunction
, поэтомуtypeof
выкинет вас из колеи и выполнит вторую часть оператора. Вы могли бы попробовать , если вы хотитеinstanceof Object
, потому что функция будет экземпляромObject
или просто явно проверитьtypeof === "function"
, потому чтоNode
иHTMLElement
оба являются носителями функции объекта.isElement(0)
, он возвращает 0, а не ложь ... Почему это так, и как я могу предотвратить это?Следующий супер-простой код, совместимый с IE8, работает отлично.
Общепринятый ответ не обнаруживает все типы элементов HTML. Например, элементы SVG не поддерживаются. В отличие от этого, этот ответ работает для HTML хорошо, как SVG.
Смотрите это в действии здесь: https://jsfiddle.net/eLuhbu6r/
источник
document
элемента (во всех браузерах). если вам это нужно, вы должны попробовать:x instanceof Element || x instanceof HTMLDocument
Все решения выше и ниже (включая мое решение) страдают от возможности быть некорректными, особенно в IE - вполне возможно (пере) определить некоторые объекты / методы / свойства для имитации узла DOM, делающего тест недействительным.
Поэтому обычно я использую тестирование в стиле утиной типографии: я тестирую специально для вещей, которые я использую. Например, если я хочу клонировать узел, я проверяю его следующим образом:
По сути, это небольшая проверка работоспособности + прямой тест для метода (или свойства), который я планирую использовать.
Кстати, приведенный выше тест является хорошим тестом для узлов DOM во всех браузерах. Но если вы хотите быть в безопасности, всегда проверяйте наличие методов и свойств и проверяйте их типы.
РЕДАКТИРОВАТЬ: IE использует объекты ActiveX для представления узлов, поэтому их свойства не ведут себя как истинный объект JavaScript, например:
в то время как он должен вернуть «функцию» и
true
соответственно. Единственный способ проверить методы - это определить, определены ли они.источник
Вы можете попробовать добавить его к реальному DOM-узлу ...
источник
obj.cloneNode(false)
. И не имеет побочных эффектов.Нет необходимости в хаки, вы не можете просто спросить , если элемент является экземпляром DOM элемента :
источник
Как насчет Ло-Дэш
_.isElement
?И в коде:
источник
Это из прекрасной библиотеки JavaScript MooTools :
источник
Используя обнаружение корня, найденное здесь , мы можем определить, является ли, например, alert членом корня объекта, который, вероятно, будет окном:
Определить, является ли объект текущим окном, еще проще:
Кажется, это дешевле, чем решение try / catch в начальном потоке.
Дон П
источник
document.createElement()
DOM, но не вставленных в них. Удивительно (: Спасибостарый поток, но вот обновленная возможность для пользователей ie8 и ff3.5 :
источник
Я предлагаю простой способ проверки, является ли переменная элементом DOM
или, как предложил HTMLGuy :
источник
return typeof entity === 'object' && typeof entity.nodeType !== undefined;
object
и / или поперти, это может быть очень удобно! Tx, @Roman// На самом деле я, скорее всего, использую эти строки, но иногда полезно иметь эти ярлыки для кода установки
источник
Это может быть полезно: isDOM
В приведенном выше коде мы используем оператор двойного отрицания, чтобы получить логическое значение объекта, переданного в качестве аргумента. Таким образом, мы гарантируем, что каждое выражение, вычисленное в условном выражении, будет логическим, используя преимущества оценки короткого замыкания , таким образом, функцию возвращается
true
илиfalse
источник
undefined && window.spam("should bork")
например, никогда не оценивает фальшивуюspam
функцию. Так что не!!
нужно, я не верю. Что, вы можете предоставить [неакадемический] крайний случай, когда его использование имеет значение?!!
аргумент « никогда не нужен» ( а если нет, мне любопытно, почему бы и нет ), вы можете отредактировать эту строкуreturn !!(obj && typeof obj === "object" && obj.nodeType === 1 && obj.nodeName);
и заставить ее работать так же.Вы можете увидеть, возвращает ли рассматриваемый объект или узел строковый тип.
источник
typeof ({innerHTML: ""}).innerHTML === "string"
notANode.innerHTML = "<b>Whoops</b>";
, а затем, когда этот код передает свой зараженный объект этому коду. Защитный код === лучший код, все остальные вещи равны, и это в конечном итоге не является защитным.Для тех, кто использует Angular:
https://docs.angularjs.org/api/ng/function/angular.isElement
источник
function isElement(node) { return !!(node && (node.nodeName || (node.prop && node.attr && node.find))); }
выглядит немного как @ finpingvin . Обратите внимание, что он определяет, «является ли ссылка элементом DOM (или обернутым элементом jQuery). »Я думаю, что прототипирование не очень хорошее решение, но, возможно, оно самое быстрое: определите этот блок кода;
чем проверить свойство isDomElement ваших объектов:
Надеюсь, это поможет.
источник
По словам МДН
Мы можем реализовать
isElement
по прототипу. Вот мой совет:источник
Я думаю, что вам нужно сделать тщательную проверку некоторых свойств, которые всегда будут в элементе dom, но их комбинация, скорее всего, не будет в другом объекте, например:
источник
В Firefox вы можете использовать
instanceof Node
. ЭтоNode
определено в DOM1 .Но это не так просто в IE.
Вы можете только убедиться, что это элемент DOM, используя функцию DOM и перехватывать, если есть какие-либо исключения. Тем не менее, это может иметь побочный эффект (например, изменить внутреннее состояние объекта / производительность / утечка памяти)
источник
Возможно, это альтернатива? Протестировано в Opera 11, FireFox 6, Internet Explorer 8, Safari 5 и Google Chrome 16.
Функция не будет одурачена, например, этим
источник
Вот что я понял:
Чтобы повысить производительность, я создал функцию автоматического вызова, которая тестирует возможности браузера только один раз и назначает соответствующую функцию соответствующим образом.
Первый тест должен работать в большинстве современных браузеров и уже обсуждался здесь. Он просто проверяет, является ли элемент экземпляром
HTMLElement
. Очень просто.Второй самый интересный. Это его основная функциональность:
Он проверяет, является ли el экземпляром конструкции, которой он притворяется. Для этого нам нужен доступ к конструктору элемента. Вот почему мы проверяем это в if-Statement. IE7, например , не может это, потому что
(document.createElement("a")).constructor
этоundefined
в IE7.Проблема этого подхода заключается в том, что
document.createElement
на самом деле это не самая быстрая функция, и она может легко замедлить работу вашего приложения, если вы тестируете с его помощью множество элементов. Чтобы решить эту проблему, я решил кешировать конструкторы. ОбъектElementConstructors
имеет nodeNames в качестве ключей и соответствующие конструкторы в качестве значений. Если конструктор уже кэширован, он использует его из кэша, в противном случае он создает элемент, кэширует его конструктор для будущего доступа, а затем проверяет его.Третий тест - неприятный запасной вариант. Он проверяет, есть ли el
object
, имеет лиnodeType
свойство свойство1
и строку какnodeName
. Конечно, это не очень надежно, но подавляющее большинство пользователей не должно даже отступать.Это самый надежный подход, который я предложил, при этом сохраняя максимально высокую производительность.
источник
Проверьте,
obj
наследуется ли от узла .Узел - это базовый интерфейс, от которого наследуются HTMLElement и Text.
источник
отличить необработанный объект js от HTMLElement
использовать:
// ИЛИ
использовать:
o={}; o.is("HTML") // false o=document.body; o.is("HTML") // true
источник
вот трюк с использованием JQuery
поэтому поместим это в функцию:
источник
elem.nodeType === 1
так, почему бы не сохранить накладные расходы на вызов и зависимость jQuery и сделать так, чтобы ваша функция isElement сделала это сама?Не для того, чтобы разобраться с этим или чем-то другим, кроме браузеров, совместимых с ES5, почему бы просто:
Не будет работать с TextNodes и не уверен в Shadow DOM, DocumentFragments и т. Д., Но будет работать почти со всеми элементами HTML-тегов.
источник
Это будет работать практически для любого браузера. (Здесь нет различия между элементами и узлами)
источник
Абсолютно правильный метод, check target - это настоящий первичный код HTML-элемента:
источник
Каждый DOMElement.constructor возвращает функцию HTML ... Element () или [Object HTML ... Element], так что ...
источник
У меня есть особый способ сделать это, который еще не был упомянут в ответах.
Мое решение основано на четырех тестах. Если объект проходит все четыре, то это элемент:
Объект не является нулевым.
У объекта есть метод с именем "appendChild".
Метод "appendChild" был унаследован от класса Node и является не просто методом-самозванцем (пользовательское свойство с идентичным именем).
Объект имеет тип узла 1 (элемент). Объекты, которые наследуют методы от класса Node , всегда являются узлами, но не обязательно элементами.
В: Как я могу проверить, является ли данное свойство наследуемым, а не просто самозванцем?
A: Простой тест, чтобы увидеть, действительно ли метод унаследован от Node, состоит в том, чтобы сначала убедиться, что свойство имеет тип «объект» или «функция». Затем преобразуйте свойство в строку и проверьте, содержит ли результат текст «[Native Code]». Если результат выглядит примерно так:
Затем метод был унаследован от объекта Node. Смотрите https://davidwalsh.name/detect-native-function
И, наконец, объединяя все тесты, решение:
источник
Это будет проверять, даже если это элемент DOM JQuery или JavaScript
источник
Единственный способ гарантировать, что вы проверяете фактический элемент HTMLEement, а не просто объект с теми же свойствами, что и элемент HTML, - это определить, наследуется ли он от Node, поскольку невозможно создать новый Node () в JavaScript. (если только нативная функция Node не будет перезаписана, но тогда вам не повезет). Так:
источник