বস্তুটি কোনও jQuery অবজেক্ট কিনা তা পরীক্ষা করুন


601

কোনও বস্তুটি jQuery অবজেক্ট বা নেটিভ জাভাস্ক্রিপ্ট অবজেক্ট কিনা তা পরীক্ষা করার দ্রুত উপায় আছে?

উদাহরণ:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

স্পষ্টতই, উপরের কোডটি কাজ করে তবে এটি নিরাপদ নয়। আপনি সম্ভাব্যভাবে oবস্তুটিতে একটি নির্বাচক কী যুক্ত করতে পারেন এবং একই ফলাফল পেতে পারেন। বস্তুটি আসলে jQuery অবজেক্ট কিনা তা নিশ্চিত করার আরও ভাল উপায় আছে?

সাথে সামঞ্জস্যপূর্ণ কিছু (typeof obj == 'jquery')


3
JQuery 3.0 হিসাবে, কোনও জিনিস jQuery অবজেক্ট হওয়ার বিষয়টি যাচাই করার জন্য এটি অবশ্যই সঠিক উপায় নয় কারণ selectorসম্পত্তিটি অনেক আগেই অবচয় করা হয়েছিল এবং 3.0 সালে সরানো হয়েছিল। এমনকি পূর্ববর্তী সংস্করণগুলিতে, একটি jQuery অবজেক্টের একটি খালি নির্বাচক স্ট্রিং থাকতে পারে, উদাহরণস্বরূপ $(window)কোনও নির্বাচক নেই। instanceofপরিবর্তে ব্যবহার করুন।
ডেভ মেথভিন

উত্তর:


878

আপনি instanceofঅপারেটরটি ব্যবহার করতে পারেন :

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

ব্যাখ্যা : jQueryফাংশন (ওরফে $) কনস্ট্রাক্টর ফাংশন হিসাবে প্রয়োগ করা হয় । কনস্ট্রাক্টর ফাংশনগুলি newউপসর্গের সাথে ডাকা হবে ।

আপনি যখন কল করবেন তখন $(foo)অভ্যন্তরীণভাবে jQuery এটিকে new jQuery(foo)1 এ অনুবাদ করে । জাভাস্ক্রিপ্ট thisএকটি নতুন উদাহরণের দিকে নির্দেশ করতে কনস্ট্রাক্টর ফাংশনটির অভ্যন্তরীণ সূচনা করতে এগিয়ে চলেছে jQuery, এটির বৈশিষ্ট্যগুলি jQuery.prototype(ওরফে jQuery.fn) খুঁজে পাওয়া লোকদের জন্য সেট করে । সুতরাং, আপনি একটি পেতে newবস্তুর যেখানে instanceof jQueryহয় true


1 এটি আসলে new jQuery.prototype.init(foo): কনস্ট্রাক্টর লজিকটিকে অন্য নির্মাণকারী ফাংশনে বলা হয়ে থাকে init, তবে ধারণাটি একই।


8
সুতরাং আপনি মানে if (obj instanceof jQuery){...}?
নাইজেল অ্যাঞ্জেল

2
@ নিগেলএঞ্জেল: হ্যাঁ, তার অর্থ
এইটাই

12
এটি কোনও পৃষ্ঠায় একাধিক jQuery উদাহরণগুলির ক্ষেত্রে কাজ করে না।
জর্জি Ivankin

5
@ ক্রিসেন্টফ্রেশ বলতে আমি বোঝাতে চাইছি আমার যদি আমার বর্তমান নেমস্পেসে jQuery2- র দিকে ইঙ্গিত করে এবং আমার কাছে বাইরের নেমস্পেস (যেখানে j jQuery1) থেকে একটি অবজেক্ট রয়েছে তবে এই বস্তুটি jQuery অবজেক্ট কিনা তা যাচাই করার জন্য আমার কাছে উদাহরণ ব্যবহার করার উপায় নেই।
জর্জি Ivankin

6
যদি আপনি নিশ্চিত না হন যে বিবৃতি দেওয়ার সময় jQuery লোড করা হয়েছে কিনা, আপনি চেকটি প্রসারিত করতে পারেন typeof jQuery === 'function' && obj instanceof jQueryযেহেতু jQueryকোনও typeofত্রুটি না ছড়িয়ে অপারেটরের কাজ করার জন্য এটি ঘোষণার দরকার নেই ।
প্যাট্রিক রবার্টস

105

আপনি বর্ণিত সম্পত্তি হিসাবে এখানে বর্ণিত হিসাবে ব্যবহার করতে পারেন: http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}

12
ডেভিড প্রশ্নের মধ্যে যেমনটি ইঙ্গিত করেছেন, কোনও ভেরিয়েবলের সম্পত্তি যাচাই করা মূল্য বাতিল হতে পারে (যেমন "যদি" a "বা" বি "নাল হয়) নিরাপদ নয় (এটি টাইপরর ফেলে দেবে)। "বি ইনফেন্স অফ জ্যাকুয়ারি" ব্যবহার করা আরও ভাল।
স্টারহাউস

23
JQuery লোড না করা হলে এই পদ্ধতিটি কাজ করে, অন্যদিকে b instanceof jQueryjQuery পৃষ্ঠায় উপলব্ধ না থাকলে একটি রেফারেন্স এরির ফেলে দেয়। উভয় পদ্ধতিরই বিভিন্ন ক্ষেত্রে কার্যকর।
নাট

আরও দক্ষ হতে পারে, তবে এখনও নিরাপদ নয়। এটি try ... catchবিশেষত পুরানোতে প্রয়োজন হতে পারে ।
ক্লারকিবয়

JQuery লোড না করা সম্ভব হয় এমন ক্ষেত্রে, আপনি ব্যবহার করতে পারেনif ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
হ্যারি পেখোনেন

এটি এতটা ভাল উদাহরণ নয় .. সম্ভবত aএকটি ডিওএম নোড হতে পারে, document.bodyতারপরে এবং তাত্ত্বিকভাবে এমন সম্ভাবনা রয়েছে যা jqueryকোনওভাবেই সেই নোডের শৃঙ্খলের শীর্ষে উঠবে to
vsync


26

কোনও অবজেক্টের উদাহরণটি যাচাই করার সর্বোত্তম উপায় হ'ল উদাহরণস্বরূপ অপারেটর বা পদ্ধতিটির মাধ্যমে প্রোটোটাইপঅফ () যা কোনও বস্তুর প্রোটোটাইপ অন্য কোনও অবজেক্টের প্রোটোটাইপ শৃঙ্খলে থাকে কিনা তা পরীক্ষা করে।

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

তবে কখনও কখনও এটি কোনও দস্তাবেজে একাধিক jQuery উদাহরণগুলির ক্ষেত্রে ব্যর্থ হতে পারে। যেমন @ জর্জি আইভানকিন উল্লেখ করেছেন:

যদি আমি আছে $আমার বর্তমান নামস্থান ইশারা মধ্যে jQuery2এবং আমি বাইরের নামস্থান (যেখানে থেকে একটি বস্তু আছে $হয় jQuery1) তারপর আমি কোন উপায় ব্যবহার করতে হবে instanceofযদি যে বস্তুর একটি হল চেক করার জন্য jQueryবস্তু

এই সমস্যাটি কাটিয়ে ওঠার একটি উপায় হ'ল বন্ধ বা আইআইএফইতে জিকুয়েরি অবজেক্টটিকে এলিয়াস করে

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

সমস্যাটি কাটিয়ে ওঠার অন্যান্য উপায় হ'ল jqueryসম্পত্তি অনুসন্ধান করেobj

'jquery' in obj

তবে, আপনি যদি আদিম মানগুলির সাথে পরীক্ষা করে দেখার চেষ্টা করেন তবে এটি একটি ত্রুটি ছুঁড়ে দেবে, তাই আপনি নিশ্চিত objহয়ে পূর্ববর্তী পরীক্ষাটি পরিবর্তন করতে পারবেনObject

'jquery' in Object(obj)

যদিও পূর্বের উপায়টি নিরাপদ নয় (আপনি 'jquery'কোনও বস্তুর মধ্যে সম্পত্তি তৈরি করতে পারেন ), আমরা উভয় পদ্ধতির সাথে কাজ করে বৈধতাটি উন্নত করতে পারি:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

এখানে সমস্যাটি হ'ল যে কোনও বস্তু একটি সম্পত্তি jqueryনিজের হিসাবে সংজ্ঞায়িত করতে পারে , তাই প্রোটোটাইপটি জিজ্ঞাসা করা এবং অবজেক্টটি নেই nullবা না তা নিশ্চিত করার চেয়ে আরও ভাল উপায় হবে orundefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }

দরুন বলপ্রয়োগ , ifবিবৃতি মূল্যায়নের দ্বারা শর্ট সার্কিট করতে হবে &&অপারেটর যখন objকোন হল falsy মান ( null, undefined, false, 0, ""), এবং তারপর অন্যান্য যাচাই সঞ্চালন আয়।

শেষ পর্যন্ত আমরা একটি ইউটিলিটি ফাংশন লিখতে পারি:

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

আসুন একবার দেখে নেওয়া যাক: লজিকাল অপারেটর এবং সত্য / মিথ্যা


কীভাবে এটি সুরক্ষার উন্নতি করে? Jquery সম্পত্তি সহ নন jQuery অবজেক্টগুলি এখনও ভুল ব্যাখ্যা করা হবে। উভয় পন্থা ব্যবহার করে অন্য কোনটি "উন্নত" হতে পারে তা আমি দেখতে পাচ্ছি না।
গুই প্রি

কোনও বস্তুটি jQuery অবজেক্ট কিনা তা যাচাই করার এটি সহজ উপায়, যদি কোনও কারণে যদি আপনি সন্দেহ করেন যে কেউ jquery এর মতো বৈশিষ্ট্যযুক্ত বস্তু তৈরি করছে , তবে আপনি আরও কার্যকর করতে পারেন, যেমন প্রোটোটাইপের বৈশিষ্ট্যগুলি পরীক্ষা করে : মাইওবিজে .constructor.prototype.jquery বা আরও ভাল, আপনি
অবজেক্ট.প্রোটোটাইপ.আইসপ্রোটোটাইপ অফ

1
আপনার যদি এটির ||সাথে কোনও একটি থাকে 'jquery' in Object(obj)তবে তা নিকাশ হয়ে যায়, কারণ এটি সেই সম্পত্তি সহ নন-জিকুয়েরি সামগ্রীগুলিকে যাচাইকরণ থেকে আটকাবে না। যদিও আমি বিশ্বাস করি যে প্রোটোটাইপে সেই সম্পত্তিটি পরীক্ষা করা পরিস্থিতি উন্নত করে, যদিও। আপনার উত্তরটি যুক্ত করা উচিত! আমি মনে করি না যে এখানে অন্য কোনও উত্তরে সেই সম্ভাবনার উল্লেখ রয়েছে :)
গুয় প্রাই

1
নয় obj.__proto__.jqueryপরিবর্তে obj.constructor.prototype.jqueryকি যথেষ্ট? কিছুটা সংক্ষিপ্ত :)
এক্সেল

1
@ অ্যাক্সেল হ্যাঁ, এটি খুব কার্যকর হয় :)। আমি constructor.prototypeকারণ objএটি নির্মাণকারীর একটি উদাহরণ হতে পারে বলে মনে হয় jQuery। অন্যদিকে যে __proto__কোনও ধরণের অবজেক্টের জন্য উপলব্ধ।
ঝেরেক্স

3
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

একটি ডিওএম উপাদান অনুসন্ধান করার জন্য, আরও ভাল nodeTypeসম্পত্তি ব্যবহার করুন এবং booleanমানটি ফিরে আসার বিষয়টি নিশ্চিত করতে আপনি দ্বিগুণ !!(el && el.nodeType)
প্রত্যাখ্যান


2

যাঁরা জানতে চান যে কোনও জিনিস jQuery ইনস্টল না করে কোনও jQuery অবজেক্ট কিনা, নিম্নলিখিত স্নিপেটটি কাজটি করা উচিত:

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}

1

jqueryসম্পত্তিটি নিয়ে জেকুয়ারি দ্বারা বস্তুটি উত্পাদিত হয়েছে কিনা তা আপনি পরীক্ষা করতে পারেন :

myObject.jquery // 3.3.1

=> JQuery সংস্করণটির নম্বরটি ফেরত দিন যদি জিকুয়েরির দ্বারা উত্পাদিত বস্তুটি থাকে। => অন্যথায়, এটি ফিরে আসেundefined


-9
var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

11
ব্যাখ্যা ছাড়াই কোড ডাম্প খুব কমই কার্যকর। আপনার উত্তরে কিছু প্রসঙ্গ যুক্ত করার বিষয়টি দয়া করে বিবেচনা করুন।
ক্রিস 21
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.