यदि जावास्क्रिप्ट ऑब्जेक्ट एक डोम ऑब्जेक्ट है, तो आप कैसे जांच करेंगे?


247

मैं पाने के लिए कोशिश कर रहा हूँ:

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;
  }
}

क्या कोई अच्छा विकल्प है?


3
क्या मैं सोच रहा था कि क्या एक "DOM ऑब्जेक्ट" न केवल तत्वों बल्कि सभी नोड्स (पाठ नोड्स, गुण आदि) को कवर नहीं करना चाहिए? सभी सवालों के जवाब और जिस तरह से आपने सवाल उठाया है, इस सवाल का सुझाव विशेष रूप से तत्वों के बारे में है ...
माइक कृंतक

जवाबों:


300

यह ब्याज की हो सकती है:

function isElement(obj) {
  try {
    //Using W3 DOM2 (works for FF, Opera and Chrome)
    return obj instanceof HTMLElement;
  }
  catch(e){
    //Browsers not supporting W3 DOM2 don't have HTMLElement and
    //an exception is thrown and we end up here. Testing some
    //properties that all elements have (works on IE7)
    return (typeof obj==="object") &&
      (obj.nodeType===1) && (typeof obj.style === "object") &&
      (typeof obj.ownerDocument ==="object");
  }
}

यह DOM, Level2 का हिस्सा है ।

अद्यतन 2 : इस तरह से मैंने इसे अपनी लाइब्रेरी में लागू किया: (पिछला कोड Chrome में काम नहीं किया, क्योंकि Node और HTMLElement अपेक्षित ऑब्जेक्ट के बजाय फ़ंक्शन हैं। इस कोड को FF3, IE7, Chrome 1 और ओपेरा में परीक्षण किया गया है 9)।

//Returns true if it is a DOM node
function isNode(o){
  return (
    typeof Node === "object" ? o instanceof Node : 
    o && typeof o === "object" && typeof o.nodeType === "number" && typeof o.nodeName==="string"
  );
}

//Returns true if it is a DOM element    
function isElement(o){
  return (
    typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2
    o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName==="string"
);
}

11
यह ध्यान देने योग्य है कि यह उन तत्वों पर काम नहीं करेगा जो अन्य विंडोज़ / फ़्रेम से संबंधित हैं। बतख टाइपिंग की सिफारिश की दृष्टिकोण है
एंडी ई

2
आप इसे मूर्ख बना सकते हैं:function Fake() {}; Fake.prototype=document.createElement("div"); alert(new Fake() instanceof HTMLElement);
कर्नेल जेम्स

11
WTF तथ्य: फ़ायरफ़ॉक्स 5 और पहले वापसी trueके लिए [] instanceof HTMLElement
रोब डब्ल्यू

6
Btw, HTMLElementहमेशा एक है function, इसलिए typeofआपको ट्रैक से फेंक देगा और बयान के दूसरे भाग को निष्पादित करेगा। यदि आप चाहें तो कोशिश कर सकते हैं instanceof Object, क्योंकि फ़ंक्शन एक उदाहरण होगा Object, या केवल स्पष्ट रूप से जांच करेगा typeof === "function", क्योंकि Nodeऔर HTMLElementदोनों मूल वस्तु फ़ंक्शन हैं।
रोलैंड

2
जब आप कॉल करते हैं isElement(0), तो यह 0 लौटता है, न कि गलत ... क्यों वह है, और मैं इसे कैसे रोक सकता हूं?
जेसिका

68

निम्न IE8 संगत, सुपर-सरल कोड पूरी तरह से काम करता है।

स्वीकार किए जाते हैं जवाब HTML तत्वों के सभी प्रकार का पता लगाने के नहीं है। उदाहरण के लिए, एसवीजी तत्वों का समर्थन नहीं किया जाता है। इसके विपरीत, यह उत्तर HTML के लिए एसवीजी के रूप में अच्छी तरह से काम करता है।

इसे यहां देखें: https://jsfiddle.net/eLuhbu6r/

function isElement(element) {
    return element instanceof Element || element instanceof HTMLDocument;  
}

3
IE7 पर 'तत्व' अपरिभाषित है
दान

49
मेरी राय है कि IE7 का उपयोग करने वाले किसी भी व्यक्ति को समय के साथ पाने के लिए अपने इनकार के आसपास काम करने वाले दिनों या हफ्तों के निवेश के लिए इसे डालने के बजाय एक बेहतर ब्राउज़र डाउनलोड करने के लिए पांच सेकंड का समय बिताना चाहिए।
mopsyd

1
मैं @mopsyd से सहमत हूं, लेकिन उत्तर के लेखक का कहना है कि यह IE7 में काम करता है, जिसे शुद्धता के लिए अद्यतन करने की आवश्यकता हो सकती है।
लाजोस मेस्सरोस

1
IE9 कहने के लिए अद्यतन किया गया। मैं अनिश्चित हूँ अगर IE8 इसे समर्थन करता है।
मोनार्क वाडिया

1
@MonarchWadia हाँ यह IE8 में समर्थित है। लेकिन ध्यान दें कि यह documentतत्व (सभी ब्राउज़रों में) के लिए सही नहीं है । यदि आपको इसकी आवश्यकता है, तो आपको प्रयास करना चाहिए:x instanceof Element || x instanceof HTMLDocument
S.Serpooshan

11

ऊपर और नीचे (मेरे समाधान सहित) के सभी समाधान गलत होने की संभावना से ग्रस्त हैं, विशेष रूप से IE पर - यह संभव है (पुनः) कुछ ऑब्जेक्ट्स / विधियों / गुणों को परिभाषित करता है जो एक डोम नोड को परीक्षण को अवैध करार देते हैं।

इसलिए आमतौर पर मैं बतख-टाइपिंग-शैली परीक्षण का उपयोग करता हूं: मैं विशेष रूप से उन चीजों के लिए परीक्षण करता हूं जो मैं उपयोग करता हूं। उदाहरण के लिए, यदि मैं एक नोड को क्लोन करना चाहता हूं तो मैं इसे इस तरह से परीक्षण करता हूं:

if(typeof node == "object" && "nodeType" in node &&
   node.nodeType === 1 && node.cloneNode){
  // most probably this is a DOM node, we can clone it safely
  clonedNode = node.cloneNode(false);
}

मूल रूप से यह एक छोटा सा चेक है + एक विधि (या एक संपत्ति) के लिए प्रत्यक्ष परीक्षण मैं उपयोग करने की योजना बना रहा हूं।

संयोग से ऊपर परीक्षण सभी ब्राउज़रों पर डोम नोड्स के लिए एक अच्छी परीक्षा है। लेकिन अगर आप सुरक्षित पक्ष पर रहना चाहते हैं, तो हमेशा तरीकों और गुणों की उपस्थिति की जांच करें और उनके प्रकारों को सत्यापित करें।

EDIT: IE नोड्स का प्रतिनिधित्व करने के लिए ActiveX ऑब्जेक्ट का उपयोग करता है, इसलिए उनके गुण उदाहरण के लिए, सच्चे जावास्क्रिप्ट ऑब्जेक्ट के रूप में व्यवहार नहीं करते हैं:

console.log(typeof node.cloneNode);              // object
console.log(node.cloneNode instanceof Function); // false

जबकि इसे trueक्रमशः "फंक्शन" और वापस आना चाहिए । तरीकों का परीक्षण करने का एकमात्र तरीका यह है कि क्या परिभाषित किया गया है।


"typeof document.body.cloneNode" मेरे IE में "ऑब्जेक्ट" रिटर्न करता है
डेनिस सी

यह एक सभ्य जवाब की तरह लग रहा है। हालांकि नीचे मेरा जवाब देखें, stackoverflow.com/a/36894871/1204556
मोनार्क वाडिया

8

आप इसे एक वास्तविक DOM नोड में जोड़कर देख सकते हैं ...

function isDom(obj)
{
    var elm = document.createElement('div');
    try
    {
        elm.appendChild(obj);
    }
    catch (e)
    {
        return false;
    }

    return true;
}

11
क्या यह काम करता है? यह अभी भी एक समाधान है। उस पर एक रचनात्मक।
जस्टिन मेयर

3
रचनात्मकता के लिए +1 और यह प्रदान करता है। हालाँकि, अगर नोड डोम के पहले से ही हिस्सा है, तो आपने इसे हटा दिया है! इसलिए ... यदि आवश्यक हो तो तत्व को पुनः DOM में जोड़ने के लिए कार्य किए बिना यह उत्तर अधूरा है।
svidgen

4
मैं इसे लगभग 5 वर्षों के बाद पढ़ रहा हूं, और मुझे लगता है कि यह सबसे अच्छे में से एक है। इसे सिर्फ निखारने की जरूरत है। आप उदाहरण के लिए, अलग किए गए तत्व के लिए नोड के क्लोन को जोड़ने का प्रयास कर सकते हैं । अगर वह DOM ऑब्जेक्ट नहीं है। कुछ गड़बड़ जरूर होगी। हालांकि अभी भी काफी महंगा समाधान है।
मैक्सआर्ट

या तत्व के क्लोन को जोड़ने की कोशिश करने के बजाय , बस यह क्लोन करने की कोशिश करना पर्याप्त होना चाहिए obj.cloneNode(false):। और इसका कोई साइड इफेक्ट नहीं है।
मौरोक 8

1
यह वास्तव में महंगा और अनावश्यक रूप से जटिल है। नीचे मेरा जवाब देखें, stackoverflow.com/a/36894871/1204556
मोनार्क वाडिया


6

लो-डैश के_.isElement बारे में कैसे ?

$ npm install lodash.iselement

और कोड में:

var isElement = require("lodash.iselement");
isElement(document.body);

1
मुझे यह समाधान पसंद है। यह सरल है, और यह एज और IE में काम करता है, यहां तक ​​कि अलग-अलग iframes में तत्वों के लिए, यहां अधिकांश उच्चतम मतदान समाधानों के विपरीत।
एलियास ज़मरिया

यह उत्तर उपयोगी है, हालांकि किसी को ब्राउज़र में एनपीएम मॉड्यूल को चलाने के लिए वेबपैक की आवश्यकता होगी।
एडविन प्रैट

5

यह प्यारा जावास्क्रिप्ट पुस्तकालय MooTools से है :

if (obj.nodeName){
    switch (obj.nodeType){
    case 1: return 'element';
    case 3: return (/\S/).test(obj.nodeValue) ? 'textnode' : 'whitespace';
    }
}

12
यह कोड दावा नहीं करता है कि ऑब्जेक्ट एक DOM तत्व है; केवल यह कि यह एक सा दिखता है। किसी भी वस्तु को एक नोडनेम और नोड टाइप प्रॉपर्टी दी जा सकती है और इस कोड को संतुष्ट किया जा सकता है।
थोमसट्रेटर

यह उत्तर सभी प्रकार के HTML तत्वों का पता नहीं लगाता है। उदाहरण के लिए, एसवीजी तत्वों का समर्थन नहीं किया जाता है। नीचे मेरा जवाब देखें।
मोनार्क वाडिया

वास्तव में सभी तत्वों पर काम नहीं करता है, उदाहरण के लिए एसवीजी। मेरा जवाब नीचे देखें, stackoverflow.com/a/36894871/1204556
मोनार्क वाडिया

4

यहां पाए गए रूट डिटेक्शन का उपयोग करके , हम यह निर्धारित कर सकते हैं कि क्या उदाहरण अलर्ट ऑब्जेक्ट के रूट का सदस्य है, जो तब विंडो होने की संभावना है:

function isInAnyDOM(o) { 
  return (o !== null) && !!(o.ownerDocument && (o.ownerDocument.defaultView || o.ownerDocument.parentWindow).alert); // true|false
}

यह निर्धारित करने के लिए कि वस्तु वर्तमान खिड़की है और भी सरल है:

function isInCurrentDOM(o) { 
  return (o !== null) && !!o.ownerDocument && (window === (o.ownerDocument.defaultView || o.ownerDocument.parentWindow)); // true|false
}

यह शुरुआती धागे में कोशिश / पकड़ समाधान से कम महंगा लगता है।

डॉन पी


मैंने इसे नवीनतम क्रोम और एफएफ में और आईई 11 में भी परीक्षण किया है, और यह हर जगह काम करता है, पाठ नोड्स और ऑब्जेक्ट के माध्यम से भी बनाया जाता है, document.createElement()लेकिन डोम में भी नहीं डाला जाता है। अद्भुत (धन्यवाद:
Geradlus_RU

यह एक सभ्य जवाब की तरह दिखता है, हालांकि मेरा एक ही सामान बहुत कुछ करता है और कम जटिल है। stackoverflow.com/a/36894871/1204556
मोनार्क वाडिया

4

पुराना धागा, लेकिन यहाँ ie8 और ff3.5 उपयोगकर्ताओं के लिए एक अद्यतन संभावना है :

function isHTMLElement(o) {
    return (o.constructor.toString().search(/\object HTML.+Element/) > -1);
}

4

मैं परीक्षण करने का एक सरल तरीका सुझाता हूं यदि एक चर एक DOM तत्व है

function isDomEntity(entity) {
  if(typeof entity  === 'object' && entity.nodeType !== undefined){
     return true;
  }
  else{
     return false;
  }
}

या जैसा कि HTMLGuy ने सुझाव दिया है:

const isDomEntity = entity => {
  return typeof entity   === 'object' && entity.nodeType !== undefined
}

1
रास्ता बहुत क्रियात्मक। तुलना पहले से ही एक बूलियन लौटा देगी:return typeof entity === 'object' && typeof entity.nodeType !== undefined;
एचटीएमएलयूजी

1
बहुत ही रोचक! कभी-कभी, आपके द्वारा अपने objectऔर / या आबादी के प्रकारों के आधार पर , यह बहुत आसान हो सकता है! Tx, @ रोमन
पेड्रो फरेरा

3
var IsPlainObject = function ( obj ) { return obj instanceof Object && ! ( obj instanceof Function || obj.toString( ) !== '[object Object]' || obj.constructor.name !== 'Object' ); },
    IsDOMObject = function ( obj ) { return obj instanceof EventTarget; },
    IsDOMElement = function ( obj ) { return obj instanceof Node; },
    IsListObject = function ( obj ) { return obj instanceof Array || obj instanceof NodeList; },

// वास्तव में मैं इन इनलाइन का अधिक उपयोग नहीं कर पा रहा हूं, लेकिन कभी-कभी सेटअप कोड के लिए इन शॉर्टकट्स को रखना अच्छा होता है


IE में फ़ंक्शन नाम नहीं है, क्योंकि obj.constructor.name IE में काम नहीं करता है। Obj.constructor द्वारा प्रतिस्थापित करें! = ऑब्जेक्ट।
मैथेडिनक्लाउड्स

3

यह मददगार हो सकता है: isDOM

//-----------------------------------
// Determines if the @obj parameter is a DOM element
function isDOM (obj) {
    // DOM, Level2
    if ("HTMLElement" in window) {
        return (obj && obj instanceof HTMLElement);
    }
    // Older browsers
    return !!(obj && typeof obj === "object" && obj.nodeType === 1 && obj.nodeName);
}

ऊपर दिए गए कोड में, हम तर्क के रूप में पारित वस्तु के बूलियन मान को प्राप्त करने के लिए दोहरे निषेध ऑपरेटर का उपयोग करते हैं , इस तरह हम यह सुनिश्चित करते हैं कि सशर्त विवरण में मूल्यांकन की गई प्रत्येक अभिव्यक्ति बूलियन हो, शॉर्ट-सर्किट मूल्यांकन का लाभ उठाते हुए , इस प्रकार फ़ंक्शन रिटर्न trueयाfalse


कुछ भी गलत है, आपके बूलियन को शॉर्ट-सर्किट करना चाहिए। उदाहरण के लिए, undefined && window.spam("should bork")कभी भी नकली spamफ़ंक्शन का मूल्यांकन नहीं करता है । तो कोई !!जरूरत नहीं , मुझे विश्वास नहीं है। क्या, आप एक [गैर-शैक्षणिक] एज केस प्रदान कर सकते हैं जहां इसका उपयोग मायने रखता है?
रफिन

आपकी प्रशंसा के लिए धन्यवाद। मैंने सभी अभिव्यक्ति को बूलियन मान में बदलने के लिए * !!
jherax

सही है, लेकिन ऐसा करने का कोई व्यावहारिक कारण नहीं है, मुझे नहीं लगता - यहाँ देखें । और यह निश्चित रूप से यहाँ शॉर्ट-कट eval का लाभ उठाने के लिए आवश्यक नहीं है। यहां तक ​​कि अगर आपने "खरीदी की !!कभी जरूरत नहीं है" तर्क दिया ( और यदि आप नहीं करते हैं, तो मैं उत्सुक हूं कि क्यों नहीं ), आप उस पंक्ति को संपादित कर सकते हैं return !!(obj && typeof obj === "object" && obj.nodeType === 1 && obj.nodeName);और इसे संचालित कर सकते हैं।
रफिन

मैंने यही किया;) अधिक साफ और समान प्रभाव। धन्यवाद।
झेरैक्स

2

आप देख सकते हैं कि वस्तु या नोड प्रश्न में स्ट्रिंग प्रकार देता है या नहीं।

typeof (array).innerHTML === "string" => false
typeof (object).innerHTML === "string" => false
typeof (number).innerHTML === "string" => false
typeof (text).innerHTML === "string" => false

//any DOM element will test as true
typeof (HTML object).innerHTML === "string" => true
typeof (document.createElement('anything')).innerHTML === "string" => true

3
typeof ({innerHTML: ""}).innerHTML === "string"
21

गरम! यह प्रतिक्रिया खेल विजेता होनी चाहिए। if (typeof obj.innerHTML! == 'string') // डोम तत्व नहीं है।
user3751385

1
मैंने शुरू में @Qtax के खिलाफ प्रतिक्रिया दी और पहले जवाब में थोमसट्रैटर की आलोचना की , लेकिन मैं इसे खरीदना शुरू कर रहा हूं। हालाँकि, मैं पहले कभी इस तरह बत्तख की तरह काटने वाले कुत्तों में नहीं दौड़ता, मैं किसी को चेक करता हुआ नहीं देख सकता कि अगर कुछ नोड है, चल रहा है notANode.innerHTML = "<b>Whoops</b>";, तो बाद में उस कोड को अपने दूषित ओबज को इस कोड में पास करना होगा। रक्षात्मक कोड === बेहतर कोड, अन्य सभी चीजें समान, और यह अंततः रक्षात्मक नहीं है।
रफिन

2

कोणीय का उपयोग करने वालों के लिए:

angular.isElement

https://docs.angularjs.org/api/ng/function/angular.isElement


कोणीय कोड को शामिल करने के लिए अधिक उपयोगी : @ finpingvin कीfunction isElement(node) { return !!(node && (node.nodeName || (node.prop && node.attr && node.find))); } तरह थोड़ा सा दिखता है । ध्यान दें कि यह निर्धारित कर रहा है " यदि एक संदर्भ एक DOM तत्व (या लिपटे jQuery तत्व) है। "
रफ़िन

2

मुझे लगता है कि प्रोटोटाइप बहुत अच्छा समाधान नहीं है, लेकिन शायद यह सबसे तेज़ है: इस कोड ब्लॉक को परिभाषित करें;

Element.prototype.isDomElement = true;
HTMLElement.prototype.isDomElement = true;

अपनी वस्तुओं की जाँच करें

if(a.isDomElement){}

आशा है कि ये आपकी मदद करेगा।


1
1) ऐसी वस्तुओं को बदलना जो आपके पास नहीं है, उचित नहीं है। 2) यह उन तत्वों का पता नहीं लगाता है जो एक ही दस्तावेज़ का हिस्सा नहीं हैं।
फ्रीगर्ल

2

इसके अनुसार Mdn के

Element सबसे सामान्य आधार वर्ग है जिसमें से सभी वस्तुएं ए Document विरासत । इसमें केवल तरीके और गुण सभी प्रकार के तत्वों के लिए सामान्य हैं।

हम isElementप्रोटोटाइप द्वारा लागू कर सकते हैं । यहाँ मेरी सलाह है:

/**
 * @description detect if obj is an element
 * @param {*} obj
 * @returns {Boolean}
 * @example
 * see below
 */
function isElement(obj) {
  if (typeof obj !== 'object') {
    return false
  }
  let prototypeStr, prototype
  do {
    prototype = Object.getPrototypeOf(obj)
    // to work in iframe
    prototypeStr = Object.prototype.toString.call(prototype)
    // '[object Document]' is used to detect document
    if (
      prototypeStr === '[object Element]' ||
      prototypeStr === '[object Document]'
    ) {
      return true
    }
    obj = prototype
    // null is the terminal of object
  } while (prototype !== null)
  return false
}
console.log(isElement(document)) // true
console.log(isElement(document.documentElement)) // true
console.log(isElement(document.body)) // true
console.log(isElement(document.getElementsByTagName('svg')[0])) // true or false, decided by whether there is svg element
console.log(isElement(document.getElementsByTagName('svg'))) // false
console.log(isElement(document.createDocumentFragment())) // false


1

मुझे लगता है कि आपको क्या करना है क्या है कुछ गुण है कि हमेशा एक डोम तत्व में होगा की गहन जांच करते हैं, लेकिन उनके संयोजन नहीं होगा लगता है कि सबसे अधिक संभावना है तो जैसे किसी अन्य वस्तु में हो,:

var isDom = function (inp) {
    return inp && inp.tagName && inp.nodeName && inp.ownerDocument && inp.removeAttribute;
};

1

फ़ायरफ़ॉक्स में, आप उपयोग कर सकते हैं instanceof Node। यह DOM1Node में परिभाषित किया गया है

लेकिन IE में यह इतना आसान नहीं है।

  1. "Instof ActiveXObject" केवल यह बता सकता है कि यह एक देशी वस्तु है।
  2. "typeof document.body.appendChild == 'ऑब्जेक्ट'" यह बताता है कि यह DOM ऑब्जेक्ट हो सकता है, लेकिन यह भी हो सकता है कि कुछ और भी समान फ़ंक्शन हो।

आप केवल यह सुनिश्चित कर सकते हैं कि यह DOM फंक्शन का उपयोग करके DOM एलिमेंट है और यदि कोई अपवाद है तो पकड़ लें। हालाँकि, इसका साइड इफेक्ट हो सकता है (उदाहरण के लिए ऑब्जेक्ट आंतरिक स्थिति / प्रदर्शन / मेमोरी लीक)


1

शायद यह एक विकल्प है? ओपेरा 11, फायरफॉक्स 6, इंटरनेट एक्सप्लोरर 8, सफारी 5 और गूगल क्रोम 16 में परीक्षण किया गया।

function isDOMNode(v) {
  if ( v===null ) return false;
  if ( typeof v!=='object' ) return false;
  if ( !('nodeName' in v) ) return false; 

  var nn = v.nodeName;
  try {
    // DOM node property nodeName is readonly.
    // Most browsers throws an error...
    v.nodeName = 'is readonly?';
  } catch (e) {
    // ... indicating v is a DOM node ...
    return true;
  }
  // ...but others silently ignore the attempt to set the nodeName.
  if ( v.nodeName===nn ) return true;
  // Property nodeName set (and reset) - v is not a DOM node.
  v.nodeName = nn;

  return false;
}

फ़ंक्शन को इस तरह से मूर्ख नहीं बनाया जाएगा

isDOMNode( {'nodeName':'fake'} ); // returns false

2
अच्छी कोशिश, लेकिन अपवाद से निपटना बहुत महंगा है अगर इसे टाला जा सकता है। इसके अलावा, ES5 आपको वस्तुओं के लिए केवल-पढ़ने के गुणों को परिभाषित करने की अनुमति देता है।
एंडी ई

1

यह वही है जो मैंने सोचा था:

var isHTMLElement = (function () {
    if ("HTMLElement" in window) {
        // Voilà. Quick and easy. And reliable.
        return function (el) {return el instanceof HTMLElement;};
    } else if ((document.createElement("a")).constructor) {
        // We can access an element's constructor. So, this is not IE7
        var ElementConstructors = {}, nodeName;
        return function (el) {
            return el && typeof el.nodeName === "string" &&
                 (el instanceof ((nodeName = el.nodeName.toLowerCase()) in ElementConstructors 
                    ? ElementConstructors[nodeName] 
                    : (ElementConstructors[nodeName] = (document.createElement(nodeName)).constructor)))
        }
    } else {
        // Not that reliable, but we don't seem to have another choice. Probably IE7
        return function (el) {
            return typeof el === "object" && el.nodeType === 1 && typeof el.nodeName === "string";
        }
    }
})();

प्रदर्शन में सुधार करने के लिए मैंने एक आत्म-आविष्कारक फ़ंक्शन बनाया जो केवल एक बार ब्राउज़र की क्षमताओं का परीक्षण करता है और तदनुसार उचित फ़ंक्शन असाइन करता है।

पहला परीक्षण अधिकांश आधुनिक ब्राउज़रों में काम करना चाहिए और पहले से ही यहां चर्चा की गई थी। यह सिर्फ परीक्षण करता है कि तत्व किसका उदाहरण हैHTMLElement । बहुत सीधा है।

दूसरा सबसे दिलचस्प एक है। यह इसकी मुख्य कार्यक्षमता है:

return el instanceof (document.createElement(el.nodeName)).constructor

यह परीक्षण करता है कि क्या एल इस बाधा का एक उदाहरण है कि यह होने का दिखावा करता है। ऐसा करने के लिए, हमें किसी तत्व के अवरोधक तक पहुंच की आवश्यकता है। इसलिए हम इफ-स्टेटमेंट में इसका परीक्षण कर रहे हैं। उदाहरण के लिए IE7 इस विफल रहता है, क्योंकि (document.createElement("a")).constructorहै undefinedIE7 में।

इस दृष्टिकोण के साथ समस्या यह है कि document.createElementवास्तव में सबसे तेज़ कार्य नहीं है और यदि आप इसके साथ बहुत सारे तत्वों का परीक्षण कर रहे हैं तो आसानी से आपके आवेदन को धीमा कर सकते हैं। इसे हल करने के लिए, मैंने कंस्ट्रक्टर्स को कैश करने का फैसला किया। ऑब्जेक्ट ElementConstructorsमें मानों के रूप में उसके संबंधित कंस्ट्रक्टरों के साथ नोडनेम होते हैं। यदि कोई कंस्ट्रक्टर पहले से कैश है, तो वह इसे कैशे से उपयोग करता है, अन्यथा यह एलिमेंट बनाता है, भविष्य के एक्सेस के लिए इसके कंस्ट्रक्टर को कैश करता है और फिर इसके खिलाफ टेस्ट करता है।

तीसरा परीक्षण अप्रिय गिरावट है। यह परीक्षण करता है कि क्या el एक है object, के पास एक nodeTypeसंपत्ति है 1और एक स्ट्रिंग हैnodeName । यह निश्चित रूप से बहुत विश्वसनीय नहीं है, फिर भी उपयोगकर्ताओं के विशाल बहुमत को अब तक वापस नहीं आना चाहिए।

यह सबसे विश्वसनीय दृष्टिकोण है जिसे मैं अभी भी संभव के रूप में उच्च प्रदर्शन रखते हुए आया था।



1

HTMLElement से कच्चे जेएस ऑब्जेक्ट को अलग करें

function isDOM (x){
     return /HTML/.test( {}.toString.call(x) );
 }

उपयोग:

isDOM( {a:1} ) // false
isDOM( document.body ) // true

// या

Object.defineProperty(Object.prototype, "is",
    {
        value: function (x) {
            return {}.toString.call(this).indexOf(x) >= 0;
        }
    });

उपयोग:

o={}; o.is("HTML") // false o=document.body; o.is("HTML") // true


0

यहाँ jQuery का उपयोग कर एक चाल है

var obj = {};
var element = document.getElementById('myId'); // or simply $("#myId")

$(obj).html() == undefined // true
$(element).html() == undefined // false

इसलिए इसे एक समारोह में रखना:

function isElement(obj){

   return (typeOf obj === 'object' && !($(obj).html() == undefined));

}

2
jQuery आंतरिक रूप से ऐसा कर रहा है elem.nodeType === 1इसलिए कॉल ओवरहेड और jQuery निर्भरता को क्यों न बचाएं और क्या आपका isElement फ़ंक्शन स्वयं करता है?
जोसेफ लेनॉक्स

यह 2016 है, बस "नहीं" कहें।
थॉमस मैककेबे

0

इस पर या कुछ भी नहीं बल्कि ES5- अनुरूप ब्राउज़रों के लिए ही क्यों नहीं:

function isDOM(e) {
  return (/HTML(?:.*)Element/).test(Object.prototype.toString.call(e).slice(8, -1));
}

TextNodes पर काम नहीं करेगा और शैडो डोम या डॉक्यूमेंटफ्रेगमेंट आदि के बारे में निश्चित नहीं है, लेकिन लगभग सभी HTML टैग तत्वों पर काम करेगा


0

यह लगभग किसी भी ब्राउज़र के लिए काम करेगा। (यहां तत्वों और नोड्स के बीच कोई अंतर नहीं)

function dom_element_check(element){
    if (typeof element.nodeType !== 'undefined'){
        return true;
    }
    return false;
}

सबसे पहले, आपको सही या गलत रिटर्न करने की जरूरत नहीं है, बस अगर स्टेटमेंट वापस करना है। दूसरा, यह {nodeType: 1} के लिए सच होगा
ब्लूजैक

0

एक पूर्ण सही विधि, चेक लक्ष्य एक वास्तविक HTML तत्व प्राथमिक कोड है:

    (function (scope) {
        if (!scope.window) {//May not run in window scope
            return;
        }
        var HTMLElement = window.HTMLElement || window.Element|| function() {};

        var tempDiv = document.createElement("div");
        var isChildOf = function(target, parent) {

            if (!target) {
                return false;
            }
            if (parent == null) {
                parent = document.body;
            }
            if (target === parent) {
                return true;
            }
            var newParent = target.parentNode || target.parentElement;
            if (!newParent) {
                return false;
            }
            return isChildOf(newParent, parent);
        }
        /**
         * The dom helper
         */
        var Dom = {
            /**
             * Detect if target element is child element of parent
             * @param {} target The target html node
             * @param {} parent The the parent to check
             * @returns {} 
             */
            IsChildOf: function (target, parent) {
                return isChildOf(target, parent);
            },
            /**
             * Detect target is html element
             * @param {} target The target to check
             * @returns {} True if target is html node
             */
            IsHtmlElement: function (target) {
                if (!X.Dom.IsHtmlNode(target)) {
                    return false;
                }
                return target.nodeType === 1;
            },
            /**
             * Detect target is html node
             * @param {} target The target to check
             * @returns {} True if target is html node
             */
            IsHtmlNode:function(target) {
                if (target instanceof HTMLElement) {
                    return true;
                }
                if (target != null) {
                    if (isChildOf(target, document.documentElement)) {
                        return true;
                    }
                    try {
                        tempDiv.appendChild(target.cloneNode(false));
                        if (tempDiv.childNodes.length > 0) {
                            tempDiv.innerHTML = "";
                            return true;
                        }
                    } catch (e) {

                    }
                }
                return false;
            }
        };
        X.Dom = Dom;
    })(this);

आईई 5 में टेस्ट


0

प्रत्येक Dharmalement.constructor रिटर्न HTML ... तत्व () या [ऑब्जेक्ट HTML ... तत्व] ऐसा करता है ...

function isDOM(getElem){
    if(getElem===null||typeof getElem==="undefined") return false;
    var c = getElem.constructor.toString();
    var html = c.search("HTML")!==-1;
    var element = c.search("Element")!==-1;
    return html&&element;
}

0

मेरे पास ऐसा करने का एक विशेष तरीका है जिसका उत्तर में अभी तक उल्लेख नहीं किया गया है।

मेरा समाधान चार परीक्षणों पर आधारित है। यदि वस्तु चारों तरफ से गुजरती है, तो यह एक तत्व है:

  1. वस्तु अशक्त नहीं है।

  2. ऑब्जेक्ट में "appendChild" नामक एक विधि है।

  3. "AppendChild" विधि को नोड वर्ग से विरासत में मिला था , और यह सिर्फ एक अभेद्य विधि (एक समान नाम वाला उपयोगकर्ता-निर्मित संपत्ति) नहीं है।

  4. वस्तु नोड प्रकार 1 (तत्व) की है। नोड क्लास से विधियां प्राप्त करने वाली वस्तुएं हमेशा नोड्स होती हैं, लेकिन जरूरी तत्व नहीं।

प्रश्न: अगर किसी दी गई संपत्ति विरासत में मिली है और मैं सिर्फ एक आयातक नहीं हूं तो मैं कैसे जांच करूं?

ए: यह देखने के लिए एक सरल परीक्षण कि क्या वास्तव में नोड से एक विधि विरासत में मिली है, पहले यह सत्यापित करें कि संपत्ति में "ऑब्जेक्ट" या "फ़ंक्शन" का एक प्रकार है। इसके बाद, संपत्ति को एक स्ट्रिंग में बदलें और जांचें कि क्या परिणाम में "[मूल कोड]" पाठ शामिल है। यदि परिणाम कुछ इस तरह दिखता है:

function appendChild(){
[Native Code]
}

तब विधि को नोड ऑब्जेक्ट से विरासत में मिला है। Https://davidwalsh.name/detect-native-function देखें

और अंत में, सभी परीक्षणों को एक साथ लाना, समाधान है:

function ObjectIsElement(obj) {
    var IsElem = true;
    if (obj == null) {
        IsElem = false;
    } else if (typeof(obj.appendChild) != "object" && typeof(obj.appendChild) != "function") {
        //IE8 and below returns "object" when getting the type of a function, IE9+ returns "function"
        IsElem = false;
    } else if ((obj.appendChild + '').replace(/[\r\n\t\b\f\v\xC2\xA0\x00-\x1F\x7F-\x9F ]/ig, '').search(/\{\[NativeCode]}$/i) == -1) {
        IsElem = false;
    } else if (obj.nodeType != 1) {
        IsElem = false;
    }
    return IsElem;
}

0
(element instanceof $ && element.get(0) instanceof Element) || element instanceof Element

भले ही यह jQuery या JavaScript DOM एलिमेंट हो, इसके लिए यह जाँच करेगा


0

केवल एक वास्तविक HTMLEement की जाँच करने के लिए, और HTML तत्व के रूप में समान गुणों वाली एक वस्तु के रूप में नहीं, केवल ग्वारेंटी का एकमात्र तरीका यह निर्धारित करना है कि क्या यह नोड से विरासत में मिला है, क्योंकि जावास्क्रिप्ट में नया नोड () बनाना असंभव है। (जब तक कि देशी नोड फ़ंक्शन को अधिलेखित नहीं किया जाता है, लेकिन तब आप भाग्य से बाहर हैं)। इसलिए:

function isHTML(obj) {
    return obj instanceof Node;
}

console.log(
  isHTML(test),
  isHTML(ok),
  isHTML(p),
  isHTML(o),
  isHTML({
    constructor: {
      name: "HTML"
    }
  }),
  isHTML({
    __proto__: {
      __proto__: {
        __proto__: {
          __proto__: {
            constructor: {
              constructor: { 
                name: "Function"
                
              },
              name: "Node"
            }
          }
        }
      }
    }
  }),
)
<div id=test></div>
<blockquote id="ok"></blockquote>
<p id=p></p>
<br id=o>
<!--think of anything else you want--!>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.