क्या मैं jQuery का उपयोग करके एक लटकती सूची खोल सकता हूं


85

HTML में इस लटकती सूची के लिए:

<select id="countries">
<option value="1">Country</option>
</select>

मैं सूची को खोलना चाहता हूं (उस पर बाएं क्लिक के समान)। क्या जावास्क्रिप्ट (या अधिक विशेष रूप से jQuery) का उपयोग करना संभव है?



4
क्या कोई समझा सकता है कि यह इतना असंभव क्यों है?
स्पेसबियर्स


जवाबों:


18

आप आसानी से किसी तत्व पर एक क्लिक का अनुकरण कर सकते हैं , लेकिन एक क्लिक पर <select>ड्रॉपडाउन नहीं खुलेगा।

कई चयनों का उपयोग समस्याग्रस्त हो सकता है। शायद आपको एक कंटेनर तत्व के अंदर रेडियो बटन पर विचार करना चाहिए जिसे आप आवश्यकतानुसार विस्तारित और अनुबंधित कर सकते हैं।


70

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

$('#countries').attr('size',6);

और फिर जब आप समाप्त कर लेंगे

$('#countries').attr('size',1);

12
sizeड्रॉपडाउन में विशेषता जोड़ना वास्तव में ड्रॉपडाउन को लिस्टबॉक्स में परिवर्तित करता है..तो इसका विस्तार होता है ..
मयंक पाठक

महान समाधान। आपको बस इस तथ्य से निपटना होगा कि सूची बॉक्स पृष्ठ पर अधिक जगह लेता है (एक ड्रॉपडाउन की तरह सामग्री पर विस्तार करने के बजाय) और इस प्रकार, सामग्री को नीचे धकेलता है।
zkent

उन लोगों के लिए जो केवल कल्पना कर सकते हैं कि यह कैसा दिखता है, इस दृष्टिकोण का उपयोग करने के बाद उपस्थिति एक बहु-चयन बॉक्स है (लेकिन बहु-चयन योग्य नहीं है) जो मुझे व्यक्तिगत रूप से लगता है कि ड्रॉपडाउन खोलने की तुलना में अधिक स्थिर है।
सियावी

यह तकनीकी रूप से काम करता है, लेकिन 1) अब आपके पास नीचे की तरफ एक बदसूरत स्क्रॉल पट्टी है, और 2) जेड-इंडेक्स मूल चयन के लिए तय है, इसलिए यह पॉपअप पुल-डाउन की तरह काफी कार्य नहीं करता है।
BoB3K

इसके लिए धन्यवाद ... मैंने उपयोगकर्ताओं को सतर्क करने के लिए 2 घंटे बिताए हैं, ताकि वे कुछ चुन सकें। कुछ भी अच्छा काम नहीं कर रहा था ... यह एक सूक्ष्म लेकिन दृढ़ अनुस्मारक है। और यह काम करता है (परतदार अन्य समाधानों के विपरीत)।
११ अट्ठारह

15

मैं उसी समस्या को लेकर आया हूं और मेरे पास एक समाधान है। एक फ़ंक्शन जिसे ExpandSelect () कहा जाता है, जो "चुनिंदा" तत्व पर माउस क्लिक करने का अनुकरण करता है, यह ऐसा एक अन्य <select>तत्व बनाकर करता है जो बिल्कुल सकारात्मक है और sizeविशेषता सेट करके एक साथ कई विकल्प दिखाई देते हैं। सभी प्रमुख ब्राउज़रों में परीक्षण किया गया: क्रोम, ओपेरा, फ़ायरफ़ॉक्स, इंटरनेट एक्सप्लोरर। यह कैसे काम करता है, इसका स्पष्टीकरण यहां दिए गए कोड के साथ दिया गया है:

संपादित करें (लिंक टूट गया था)

मैंने Google कोड पर एक परियोजना बनाई है, वहां कोड के लिए जाएं:

http://code.google.com/p/expandselect/

स्क्रीनशॉट

क्लिक का अनुकरण करते समय GUI में थोड़ा अंतर होता है, लेकिन यह वास्तव में मायने नहीं रखता है, इसे अपने लिए देखें:

जब माउस क्लिक:

MouseClicking
(स्रोत: googlecode.com )

जब अनुकरण पर क्लिक करें:

EmulatingClicking
(स्रोत: googlecode.com )

परियोजना की वेबसाइट पर अधिक स्क्रीनशॉट, ऊपर दिए गए लिंक।


2
क्या आप इसके लिए jsfiddle पोस्ट कर सकते हैं?
जय सुलिवन

9

यह ऊपर दिए गए जवाबों से उछला हुआ है और वास्तव में कितने विकल्प हैं, इसके अनुरूप लंबाई / विकल्पों की संख्या का उपयोग करता है।

आशा है कि यह किसी को उनकी ज़रूरत के परिणाम प्राप्त करने में मदद करता है!

    function openDropdown(elementId) {
        function down() {
            var pos = $(this).offset(); // remember position
            var len = $(this).find("option").length;
                if(len > 20) {
                    len = 20;
                }

            $(this).css("position", "absolute");
            $(this).css("zIndex", 9999);
            $(this).offset(pos);   // reset position
            $(this).attr("size", len); // open dropdown
            $(this).unbind("focus", down);
            $(this).focus();
        }
        function up() {
            $(this).css("position", "static");
            $(this).attr("size", "1");  // close dropdown
            $(this).unbind("change", up);
            $(this).focus();
        }
        $("#" + elementId).focus(down).blur(up).focus();
    }

9

यह इसे कवर करना चाहिए:

 var event;
 event = document.createEvent('MouseEvents');
 event.initMouseEvent('mousedown', true, true, window);
 countries.dispatchEvent(event); //we use countries as it's referred to by ID - but this could be any JS element var

यह एक कीप ईवेंट के लिए उदाहरण के लिए बाध्य हो सकता है, इसलिए जब तत्व पर ध्यान केंद्रित किया जाता है तो उपयोगकर्ता टाइप कर सकता है और यह अपने आप विस्तारित हो जाएगा ...

--Context--

  modal.find("select").not("[readonly]").on("keypress", function(e) {

     if (e.keyCode == 13) {
         e.preventDefault();
         return false;
     }
     var event;
     event = document.createEvent('MouseEvents');
     event.initMouseEvent('mousedown', true, true, window);
     this.dispatchEvent(event);
 });

मेरे लिए काम किया! हर दूसरे उत्तर ने सुझाव दिया कि आपके पास अभी तक चयनित एक को ट्रिगर करने का कोई तरीका नहीं है , क्या इस दृष्टिकोण में कोई कमियां हैं?
किट्टिमिंकी

युप - यह वर्जित घटनाओं (मुझे लगता है!) के साथ हस्तक्षेप करता है, यह आपकी आवश्यकताओं पर निर्भर करता है - लेकिन यह अपेक्षा के अनुरूप काम करता है - लेकिन हमारी अन्य आवश्यकताओं के अनुरूप नहीं है।
स्टुअर्ट। स्क्लिनर

मेरे लिए काम किया। अगर किसी अलग ईवेंट हैंडलर से कॉल किया जाए तो डोम तत्व को बाहर निकालना याद रखें -$('#select_element').get(0).dispatchEvent(event);
BoB3K

यह मेरे लिए काम नहीं करता है। OSX पर क्रोम 56.0.2924 पर चल रहा है
ekkis

1
यह मेरे लिए काम नहीं करता है। हालांकि होनहार दिखे।
user3335999

5

सरल एक आसान तरीका है।

function down(what) {
  pos = $(what).offset();  // remember position
  $(what).css("position","absolute");
  $(what).offset(pos);   // reset position
  $(what).attr("size","10"); // open dropdown
}

function up(what) {
$(what).css("position","static");
$(what).attr("size","1");  // close dropdown
}

अब आप अपने DropDown को इस तरह से कॉल कर सकते हैं

<select onfocus="down(this)" onblur="up(this)">

मेरे लिए एकदम सही काम करता है।

हो सकता है कि बेहतर हो, क्योंकि आपको पेज पर अन्य हाथियों की स्थिति के साथ कोई समस्या नहीं है।

function down(was) {
a = $(was).clone().attr('id','down_man').attr('disabled',true).insertAfter(was);
$(was).css("position","absolute").attr("size","10");
}

function up(was) {
$('#down_man').remove();
$(was).css("position","static");
$(was).attr("size","1");
}

आईडी को एक फिक्स वैल्यू में बदलें, जो स्मार्ट नहीं है, लेकिन मुझे आशा है कि आप आइडी को देखेंगे।


4

जावास्क्रिप्ट के लिए एक तत्व पर "क्लिक" करना संभव नहीं है (यू संलग्न संलग्न कर सकता है onclick घटना कर सकता है, लेकिन आप सचमुच इसे क्लिक नहीं कर सकते हैं)

सूची में सभी वस्तुओं को देखने के लिए, सूची को एक multipleसूची बनाएं और उसका आकार बढ़ाएं, जैसे:

<select id="countries" multiple="multiple" size="10">
<option value="1">Country</option>
</select>

IE6, 7 और 8b2 और ओपेरा 9.62 में 4 आइटम के बाद एक स्क्रॉलबार जोड़ता है। विंडोज और गूगल क्रोम के लिए सफारी में 10 आइटम के बाद एक स्क्रॉलबार जोड़ता है।
ग्रांट वैगनर

2

नहीं, तुम नहीं कर सकते।

आप इसे बड़ा करने के लिए आकार बदल सकते हैं ... ड्रेसे विचार के समान, लेकिन यह वह आकार है जिसे आपको बदलने की आवश्यकता है।

<select id="countries" size="6">
  <option value="1">Country 1</option>
  <option value="2">Country 2</option>
  <option value="3">Country 3</option>
  <option value="4">Country 4</option>
  <option value="5">Country 5</option>
  <option value="6">Country 6</option>
</select>

2

मैंने mrperfect के जवाब का उपयोग करने की कोशिश की और मुझे कुछ ग्लिच थे। एक छोटे से बदलाव के साथ, मैं इसे मेरे लिए काम करने में सक्षम था। मैंने बस इसे बदल दिया ताकि यह केवल एक बार ही करे। एक बार जब आप ड्रॉपडाउन से बाहर निकल जाते हैं, तो यह ड्रॉपडाउन की नियमित विधि पर वापस चला जाएगा।

function down() {
    var pos = $(this).offset(); // remember position
    $(this).css("position", "absolute");
    $(this).offset(pos);   // reset position
    $(this).attr("size", "15"); // open dropdown
    $(this).unbind("focus", down);
}
function up() {
    $(this).css("position", "static");
    $(this).attr("size", "1");  // close dropdown
    $(this).unbind("change", up);
}
function openDropdown(elementId) {
    $('#' + elementId).focus(down).blur(up).focus();
}

2

एक बात जो इसका जवाब नहीं देती है वह यह है कि जब आप अपने आकार = n को करने के बाद चयनित सूची में से किसी एक विकल्प पर क्लिक करते हैं और इसे पूर्ण स्थिति बनाते हैं।

क्योंकि धब्बा घटना इसे आकार = 1 बना देती है और इसे वापस बदल देती है कि यह कैसा दिखता है, आपके पास कुछ ऐसा होना चाहिए

$("option").click(function(){
    $(this).parent().blur();
});

इसके अलावा, अगर आपको अन्य तत्वों के पीछे पूर्ण निरपेक्ष चयन सूची के साथ समस्या हो रही है, तो बस एक डालें

z-index: 100;

या चयन की शैली में ऐसा कुछ।


2

सुपर सरल:

var state = false;
$("a").click(function () {
    state = !state;
    $("select").prop("size", state ? $("option").length : 1);
});

1
इसे खोलने के समान नहीं है। जब एक सूची बॉक्स पृष्ठ के नीचे होता है, अगर मैं इसे खोलता हूं, तो यह ऊपर की तरफ खुलता है। अगर मैं इसका आकार बदलता हूं, तो यह नीचे की ओर "खुलता है", जहां मैं क्लिक कर सकता हूं। अच्छा नहीं
ईकिस

@ekkis विभिन्न उपकरणों और ब्राउज़रों पर समझाया गया व्यवहार अलग-अलग हो सकता है। मैंने मोबाइल पर डेस्कटॉप और सफारी पर फ़ायरफ़ॉक्स, गूगल क्रोम और ओपेरा के साथ अपने प्रस्तावित समाधान का परीक्षण किया है, जहां यह उम्मीद के मुताबिक काम करता है। स्क्रॉल-जंप को खुले / बंद या शायद उपयोग करके स्क्रॉल-ऑफ़्स को सहेज / बहाल करके आसानी से तय किया जा सकता हैscrollIntoView पर का है <select>
यार्क १art ’

1

जैसा कि कहा गया है, आप <select>जावास्क्रिप्ट का उपयोग करके प्रोग्रामेटिक रूप से नहीं खोल सकते ।

हालाँकि, आप <select>संपूर्ण लुक को स्वयं प्रबंधित कर सकते हैं और स्वयं को महसूस कर सकते हैं। कुछ ऐसा है जो आप Google या याहू पर स्वत: पूर्ण खोज शब्दों के लिए देखते हैं ! या मौसम नेटवर्क में स्थान बॉक्स के लिए खोजें ।

मुझे jQuery के लिए एक मिला यहाँ । मुझे नहीं पता कि यह आपकी आवश्यकताओं को पूरा करेगा या नहीं, लेकिन फिर भी यह आपकी आवश्यकताओं को पूरी तरह से पूरा नहीं करता है, तो इसे संशोधित करना संभव है, इसलिए यह किसी अन्य कार्रवाई या घटना के परिणाम के रूप में खुलेगा। यह वास्तव में अधिक आशाजनक दिखता है।


0

मैंने अभी जोड़ा

select = $('#' + id);
length = $('#' + id + ' > option').length;
if (length > 20)
    length = 20;
select.attr('size', length);
select.css('position', 'absolute');
select.focus();

और चयन में जोड़ें

onchange="$(this).removeAttr('size');"
onblur="$(this).removeAttr('size');"

क्लासिक एक की तरह ही दिखने के लिए (शेष html को ओवरलैप करें)


-1

शायद देर से, लेकिन यह है कि मैं इसे कैसे हल किया है: http://jsfiddle.net/KqsK2/18/

$(document).ready(function() {
  fixSelect(document.getElementsByTagName("select"));
                      });                       

   function fixSelect(selectList)
            {
            for (var i = 0; i != selectList.length; i++)
              {

                 setActions(selectList[i]);
              }
            }


   function setActions(select)
            {
               $(select).click(function() {
                   if (select.getElementsByTagName("option").length == 1)
                        {
                          active(select);
                        }
                      });
                $(select).focus(function() {
                       active(select);
                       });
                $(select).blur(function() {
                       inaktiv(select);
                       });
                $(select).keypress(function(e) {
                      if (e.which == 13) {

                      inaktiv(select);
                          }
                       });
                  var optionList = select.getElementsByTagName("option");

                  for (var i = 0; i != optionList.length; i++)
                           {
                                setActionOnOption(optionList[i], select);
                           }
      }

  function setActionOnOption(option, select)
      {
                    $(option).click(function() {
                                inaktiv(select);
                        });
      }

  function active(select)
      {
          var temp = $('<select/>');
              $('<option />', {value: 1,text:$(select).find(':selected').text()}).appendTo(temp);
               $(temp).insertBefore($(select));

              $(select).attr('size', select.getElementsByTagName('option').length);
              $(select).css('position', 'absolute');
              $(select).css('margin-top', '-6px');
              $(select).css({boxShadow: '2px 3px 4px #888888'});



                        }

        function inaktiv(select)
                   {
                 if($(select).parent().children('select').length!=1)
                     {
                                             select.parentNode.removeChild($(select).parent().children('select').get(0));
                                }
                $(select).attr('size', 1);
                $(select).css('position', 'static');
                $(select).css({boxShadow: ''});
                $(select).css('margin-top', '0px');

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