যদি কোনও নির্বাচক নাল ফিরে দেয় তবে আমি কীভাবে সনাক্ত করতে পারি?


271

কোনও jQuery- নির্বাচক কোনও খালি বস্তু ফেরত দেয় তা সনাক্ত করার সর্বোত্তম উপায় কী। যদি তুমি করো:

alert($('#notAnElement'));

আপনি [অবজেক্ট অবজেক্ট] পেয়েছেন, সুতরাং এখন আমি যেভাবে এটি করি তা হ'ল:

alert($('#notAnElement').get(0));

যা "অপরিজ্ঞাত" লিখবে এবং তাই আপনি এটির জন্য একটি চেক করতে পারেন। তবে খুব খারাপ লাগছে। আর কি উপায় আছে?

উত্তর:


494

আমার প্রিয়টি এই ক্ষুদ্র সুবিধার সাথে jQuery প্রসারিত:

$.fn.exists = function () {
    return this.length !== 0;
}

ব্যবহৃত:

$("#notAnElement").exists();

দৈর্ঘ্য ব্যবহারের চেয়ে আরও স্পষ্ট।


2
আপনি কেন এই w () এর ভিতরে 'এটি' মুড়ে ফেলেছেন? এই প্রসঙ্গে 'এই' আসলে jQuery অবজেক্টের দিকে নির্দেশ করবে না?
আধাম আতা

1
আমি দেখতে পেয়েছি যে ফিরে আসার thisচেয়ে অনেক বেশি সহায়ক true। আমার উত্তর পোর্টিং রেলের presenceপদ্ধতি দেখুন।
মার্ক-আন্দ্রে লাফোর্টুন

5
আপনি যদি চেইন করার দক্ষতা বজায় রাখতে চান, তাহলে ফাংশনটি সত্য হওয়া উচিত, বা আপনি যদি এই পদ্ধতিটি thisকোনও ভেরিয়েবলকে বরাদ্দ করতে ব্যবহার করতে চান , তবে আমি রিটার্নের বিবৃতিটি সিএসআরএপ-এ পরিবর্তন করার পরামর্শ দেব ।
হান্না

1
ম্যাগনার, আপনি কী দয়া করে ব্যাখ্যা করতে পারেন যে এই "এক্সটেনশন" ফাংশনটি আসলে কীভাবে কাজ করে? আমি ধরে নিচ্ছি এটি একটি জাভাস্ক্রিপ্ট ধারণা এবং কঠোরভাবে JQuery ধারণা নয়। আমি প্রোটোটাইপিংয়ের দিকে নজর রেখেছিলাম তবে আমি নিশ্চিত নই যে এটি এখানে প্রযোজ্য কিনা এবং কেন সিনট্যাক্সটি "$ .fn" হবে।
কাইলএম

3
@ অ্যাডাম হ্যাঁ তবে সেক্ষেত্রে জিক্যুরি কীভাবে কাজ করে তা দেওয়া মাত্র আপনার অস্তিত্বের চেকটি ফেলে দেওয়া উচিত। নির্বাচকের সাথে মেলে এমন কোনও উপাদান না থাকলে এটি কিছু করবে না।
মাগনার


67

নির্বাচক jQuery অবজেক্টগুলির একটি অ্যারে প্রদান করে। যদি কোনও মিলের উপাদান খুঁজে পাওয়া যায় না, তবে এটি একটি খালি অ্যারে প্রদান করে। আপনি .lengthনির্বাচক দ্বারা ফিরিয়ে নেওয়া সংগ্রহটি পরীক্ষা করতে পারেন বা প্রথম অ্যারের উপাদানটি 'অপরিজ্ঞাত' আছে কিনা তা পরীক্ষা করতে পারেন।

আপনি ব্যবহার করতে পারেন কোন একটি If Statement ভিতরে নিম্নলিখিত উদাহরণ এবং তারা সব একই ফলাফল উত্পাদন। সত্য, যদি নির্বাচক কোনও মিলে যাওয়া উপাদান খুঁজে পায়, অন্যথায় মিথ্যা।

$('#notAnElement').length > 0
$('#notAnElement').get(0) !== undefined
$('#notAnElement')[0] !== undefined

1
.lengthকোডটি গরম না করা পর্যন্ত আমি ব্যবহার করি । এটি অবশ্যই উদ্দেশ্য সহ সবচেয়ে স্পষ্ট clear এছাড়াও, .size()অবহেলিত এবং বছরের পর বছর ধরে রয়েছে (1.8 সাল থেকে)। আমি আপনার উত্তরটি সম্পাদনা করতে এবং এটি সরাতে যাচ্ছি, এটি একটি নোট দিয়ে ফিরে যোগ করতে নির্দ্বিধায় কিন্তু এটি এত পুরানো, আমি মনে করি এটি আরও ভাল হয়ে গেছে।
ইভান ক্যারল

1
প্রযুক্তিগতভাবে এটি একটি jQuery অবজেক্ট ফেরত দেয় যাতে কোনও ডিওএম নোড থাকে না। এটি খালি অ্যারে ফেরত দেওয়া ঠিক নয়।
চলমান

39

আমি এরকম কিছু করতে চাই:

$.fn.exists = function(){
    return this.length > 0 ? this : false;
}

সুতরাং আপনি এই জাতীয় কিছু করতে পারেন:

var firstExistingElement = 
    $('#iDontExist').exists() ||      //<-returns false;
    $('#iExist').exists() ||          //<-gets assigned to the variable 
    $('#iExistAsWell').exists();      //<-never runs

firstExistingElement.doSomething();   //<-executes on #iExist

http://jsfiddle.net/vhbSG/


6
@ এহসান আসলে এটি গৃহীত উত্তরের সদৃশ নয় ... নোট করুন যে গৃহীত উত্তরগুলি কেবল সত্য / মিথ্যা প্রত্যাবর্তন করে যখন এই উত্তরটি আসল বস্তুটি ("এটি") বা মিথ্যা প্রদান করে। এই উত্তরটি আপনাকে মিথ্যা না হলে রিটার্ন মান (যেমন অতিরিক্ত ফাংশন শৃঙ্খলা হিসাবে) দিয়ে অতিরিক্ত স্টাফ করার অনুমতি দেয় stuff
আরএসডাব্লু

1
আমার স্ট্যান্ডার্ড টুলকিটটিতে আমার ঠিক একই কোড রয়েছে। এই ফর্মটি রেলগুলিতে অবজেক্টের উপস্থিতির সমতুল্য এবং @ সিএসএআরএপি বর্ণিত পতনসূত্র গঠনে অতি দরকারী।
inopinatus

এটি একটি ভাল উত্তর, তবে যদি পরীক্ষিত উপাদানগুলির মধ্যে কোনও উপস্থিত না থাকে তবে কী ঘটে তা যদি আপনি ব্যাখ্যা করেন তবে এটি সহায়ক হবে। সংক্ষিপ্ত উত্তর: TypeError: firstExistingElement.doSomething is not a function। আপনি যদি পুরো পরিবর্তনশীল অ্যাসাইনমেন্ট / টেস্টটি কোনও (যদি) এ মোড়াতে পারেন এবং কোনও উপাদান পাওয়া যায় তবেই কিছু করতে পারেন ....
স্টিফেন আর

9

আমি ব্যবহার করতে চাই presence, রিল অন রুবি থেকে অনুপ্রাণিত :

$.fn.presence = function () {
    return this.length !== 0 && this;
}

আপনার উদাহরণটি হয়ে যায়:

alert($('#notAnElement').presence() || "No object found");

প্রস্তাবিতের তুলনায় আমি এটির চেয়েও উচ্চতর $.fn.existsবলে মনে করি কারণ আপনি এখনও বুলিয়ান অপারেটরগুলি ব্যবহার করতে পারেন বা if, তবে সত্যবাদী ফলাফলটি বেশি কার্যকর। আরেকটি উদাহরণ:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem)
$ul.append('...')

7

আমার অগ্রাধিকার, এবং কেন আমি ইতিমধ্যে jQuery এ নেই তা জানিনা:

$.fn.orElse = function(elseFunction) {
  if (!this.length) {
    elseFunction();
  }
};

এর মতো ব্যবহৃত:

$('#notAnElement').each(function () {
  alert("Wrong, it is an element")
}).orElse(function() {
  alert("Yup, it's not an element")
});

বা, এটি কফিস্ক্রিপ্টে যেমন দেখায়:

$('#notAnElement').each ->
  alert "Wrong, it is an element"; return
.orElse ->
  alert "Yup, it's not an element"


0

আপনি এটি ডিফল্টরূপে সমস্ত সময় করতে চাইতে পারেন। আমি ত্রুটি ছাড়াই এটি করার জন্য jquery ফাংশন বা jquery.fn.init পদ্ধতি মোড়ানোর জন্য সংগ্রাম করছি, তবে আপনি এটি করার জন্য jquery উত্সে একটি সাধারণ পরিবর্তন করতে পারেন। আশেপাশের কয়েকটি লাইন অন্তর্ভুক্ত রয়েছে যার জন্য আপনি অনুসন্ধান করতে পারেন। আমি jquery উত্স জন্য অনুসন্ধান করার পরামর্শ দিচ্ছিThe jQuery object is actually just the init constructor 'enhanced'

var
  version = "3.3.1",

  // Define a local copy of jQuery
  jQuery = function( selector, context ) {

    // The jQuery object is actually just the init constructor 'enhanced'
    // Need init if jQuery is called (just allow error to be thrown if not included)
    var result = new jQuery.fn.init( selector, context );
    if ( result.length === 0 ) {
      if (window.console && console.warn && context !== 'failsafe') {
        if (selector != null) {
          console.warn(
            new Error('$(\''+selector+'\') selected nothing. Do $(sel, "failsafe") to silence warning. Context:'+context)
          );
        }
      }
    }
    return result;
  },

  // Support: Android <=4.0 only
  // Make sure we trim BOM and NBSP
  rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

jQuery.fn = jQuery.prototype = {

সর্বশেষে তবে সর্বনিম্ন নয়, আপনি এখানে সঙ্কুচিত jquery উত্স কোডটি পেতে পারেন: http://code.jquery.com/

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