ডেটালিস্ট লেবেল দেখান তবে আসল মান জমা দিন


98

বর্তমানে এইচটিএমএল 5 <datalist>এলিমেন্ট বেশিরভাগ প্রধান ব্রাউজারগুলিতে সমর্থিত (সাফারি বাদে) এবং একটি ইনপুটটিতে পরামর্শ যুক্ত করার একটি আকর্ষণীয় উপায় বলে মনে হয়।

তবে, valueএট্রিবিউটটি প্রয়োগ করার জন্য এবং এর অভ্যন্তরীণ পাঠ্যের মধ্যে কিছু তফাত আছে বলে মনে হচ্ছে <option>। উদাহরণ স্বরূপ:

<input list="answers" name="answer">
<datalist id="answers">
  <option value="42">The answer</option>
</datalist>

এটি বিভিন্ন ব্রাউজার দ্বারা আলাদাভাবে পরিচালনা করা হয়:

ক্রোম এবং অপেরা:
ক্রোম / অপেরাতে ডেটালিস্ট

ফায়ারফক্স এবং আইই 11:
ফায়ারফক্সে ডেটালিস্ট

একটি নির্বাচন করার পরে, ইনপুটটি ভরের সাথে ভরাট হয় না অভ্যন্তরীণ পাঠ্যকে। আমি কেবল চাই যে ব্যবহারকারীটি ড্রপডাউন এবং ইনপুটটিতে পাঠ্যটি ("উত্তর") দেখতে পাবে, তবে একটি মানচিত্রের 42মতো জমা দেওয়ার মানটি পাস করুন select

আমি কীভাবে সমস্ত ব্রাউজারগুলিতে ড্রপডাউন তালিকাটি গুলিগুলির লেবেলগুলি (অভ্যন্তরীণ পাঠ্য) প্রদর্শন করতে পারি <option>, তবে valueফর্মটি জমা দেওয়ার পরে বৈশিষ্ট্যটি প্রেরণ করতে পারি?


4
আমি মনে করি ফায়ারফক্স এবং আইই 11 এখানে ভুল; ওয়ানটু চশমা অনুসারে , মনে হয় যে value=""ট্যাগগুলির মধ্যে একটি স্ট্রিংয়ের চেয়ে বেশি অগ্রাধিকার নেওয়া উচিত, যখনই কোনও value=""ঘোষনা করা হয়। সুতরাং পরামর্শটি হ'ল আপনার উত্তরটির বৈশিষ্ট্যটি "উত্তর" করুন।
টাইলার এইচআর

4
@ টাইলার নং - ফায়ারফক্স এবং আইই ১১ এখানে সঠিক: লেবেল বৈশিষ্ট্য উপাদানটির জন্য একটি লেবেল সরবরাহ করে। একটি বিকল্প উপাদানটির লেবেল হ'ল লেবেল সামগ্রীর বৈশিষ্ট্যের মান, যদি একটি থাকে, বা যদি না থাকে তবে উপাদানটির পাঠ্য আইডিএল বৈশিষ্ট্যের মান। w3.org/TR/html5/forms.html#attr-option-label
সহজ

4
@ ইশওয়ে কেবল এইটি বলেছে যে কোনও লেবেল থাকলে লেবেলটি কী লেবেলে থাকা উচিত, এবং মান থাকলে মানটি কী হওয়া উচিত। কোনটি প্রাধান্য পায় তা নির্দিষ্ট করে না।
টাইলারহহ

উত্তর:


113

নোট যে datalistএকটি হিসাবে একই নয় select। এটি ব্যবহারকারীদের এমন একটি কাস্টম মান প্রবেশের অনুমতি দেয় যা তালিকায় নেই এবং এটি প্রথমে সংজ্ঞা না দিয়ে এই জাতীয় ইনপুটটির জন্য বিকল্প মান পাওয়া অসম্ভব।

ব্যবহারকারীর ইনপুট হ্যান্ডেল করার সম্ভাব্য উপায়গুলি হ'ল প্রবেশমূল্যটি যথাযথভাবে জমা দেওয়া, একটি ফাঁকা মান জমা দেওয়া বা জমা দেওয়া বাধা দেওয়া। এই উত্তরটি কেবল প্রথম দুটি বিকল্প পরিচালনা করে।

আপনি যদি পুরোপুরি ব্যবহারকারীর ইনপুটটিকে অস্বীকার করতে চান selectতবে সম্ভবত এটি আরও ভাল পছন্দ।


optionড্রপডাউনটিতে কেবলমাত্র পাঠ্যের মানটি দেখানোর জন্য আমরা এর জন্য অভ্যন্তরীণ পাঠ্যটি ব্যবহার করি এবং valueবৈশিষ্ট্যটি রেখে দিই । আমরা আসল মানটি যেটি বরাবর প্রেরণ করতে চাই তা একটি কাস্টম data-valueঅ্যাট্রিবিউটে সংরক্ষণ করা হয় :

এটি জমা দেওয়ার data-valueজন্য আমাদের একটি ব্যবহার করতে হবে <input type="hidden">। এক্ষেত্রে আমরা name="answer"নিয়মিত ইনপুটটি ছেড়ে দিয়ে লুকানো অনুলিপিটিতে স্থানান্তরিত করি।

<input list="suggestionList" id="answerInput">
<datalist id="suggestionList">
    <option data-value="42">The answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">

এইভাবে, যখন মূল ইনপুটটিতে পাঠ্য পরিবর্তন হয় তখন আমরা জাভাস্ক্রিপ্ট ব্যবহার করে পাঠ্যটি উপস্থিত রয়েছে কিনা তা যাচাই করতে datalistএবং এরটি আনতে পারি data-value। এই মানটি লুকানো ইনপুটটিতে sertedোকানো এবং জমা দেওয়া হয়।

document.querySelector('input[list]').addEventListener('input', function(e) {
    var input = e.target,
        list = input.getAttribute('list'),
        options = document.querySelectorAll('#' + list + ' option'),
        hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden'),
        inputValue = input.value;

    hiddenInput.value = inputValue;

    for(var i = 0; i < options.length; i++) {
        var option = options[i];

        if(option.innerText === inputValue) {
            hiddenInput.value = option.getAttribute('data-value');
            break;
        }
    }
});

আইডি answerএবং answer-hiddenনিয়মিত এবং লুকানো ইনপুটটিতে স্ক্রিপ্টের জন্য কোন ইনপুটটি কোন লুকানো সংস্করণের অন্তর্ভুক্ত তা জানতে প্রয়োজনীয়। inputএক বা একাধিক datalistএর পরামর্শ সরবরাহের মাধ্যমে একই পৃষ্ঠায় একাধিক গুলি থাকা সম্ভব ।

যে কোনও ব্যবহারকারীর ইনপুট যেমন জমা দেওয়া হয়। ব্যবহারকারী ইনপুট যখন ডেটালিস্টে উপস্থিত না থাকে একটি খালি মান জমা দিতে, এতে পরিবর্তন hiddenInput.value = inputValueকরুনhiddenInput.value = ""


ওয়ার্কিং জেএসফিডেল উদাহরণ: সরল জাভাস্ক্রিপ্ট এবং jQuery


4
একই ইন্টার্নটেক্সট তবে বিভিন্ন ডেটা-ভ্যালু সহ আপনি কীভাবে বিকল্পগুলি ব্যবহার করবেন? যেমন jsfiddle.net/7k3sovht/78
bigbearzhu

4
আমি যতদূর বলতে পারি, দুটি বিকল্পের মধ্যে পার্থক্য করার উপায় নেই। যেহেতু কোনও ব্যবহারকারী ইভেন্ট শোনার পক্ষে নেই যে তারা দুজনকে প্রকৃতপক্ষে কীভাবে নির্বাচন করেছেন তা জানা অসম্ভব; আমরা সবাই জানি ইনপুট ক্ষেত্রে কী মান শেষ হয়েছিল।
স্টিফান মুলার

আমার মতো আরও এইচটিএমএল 5 শিখছেন এমন কাউকে @ স্টেফানমুলার দুর্দান্ত উত্তর, ধন্যবাদ! আপনি কীভাবে জমা দেওয়ার পরে ডেমোটির পাঠ্যবক্সটি সাফ করবেন?
ক্রিস

খাঁটি jquery ডকুমেন্ট.কোয়ারিসিলিটর ('ইনপুট [তালিকা]') add ); var id = $ (এটি) .attr ('id'); $ ('#' + list + 'বিকল্প')। প্রতিটি (ফাংশন () {যদি ($ (এটি) .ভাল () == মান) $ ('#' + আইডি + '- লুকানো')। ভাল ($ (এটি) .attr ('ডেটা-মান'));}});});
পাইওটার কাজুś

@ স্টেফেনমুলার ভাগ করে নেওয়ার জন্য ধন্যবাদ, খুব দরকারী, আপনি কোডিং করার সাথে সাথে আমি চালাচ্ছি, তবে ইনপুটটিতে ব্যাকস্পেস ব্যবহার করার সময় আমি ডেটা-ভ্যালু পেয়েছি, যখন কোনও আলাদা আইটেম জমা দেওয়ার বা এমনকি নির্বাচনের সময় নয়, তবে ভুল কী হতে পারে?
ডিজিটাই

47

সমাধানটি আমি ব্যবহার করি:

<input list="answers" id="answer">
<datalist id="answers">
  <option data-value="42" value="The answer">
</datalist>

তারপরে জাভা স্ক্রিপ্টটি ব্যবহার করে সার্ভারে প্রেরণযোগ্য মানটি অ্যাক্সেস করুন:

var shownVal = document.getElementById("answer").value;
var value2send = document.querySelector("#answers option[value='"+shownVal+"']").dataset.value;


আশা করি এটা সাহায্য করবে.


আমি কোনও কারণেই অপরিজ্ঞাত হয়ে যাচ্ছি?
দেজেল

4
প্রতিটি পদক্ষেপে কনসোল.লগের সাথে ঝামেলা চালাতে। আপনি যে আইডি মানটি কল করছেন সেটিকে আপনি ব্যবহার করছেন তা নিশ্চিত করুন। এবং সেমিকোলনগুলিও পরীক্ষা করে দেখুন।
হিজবুল্লাহ শাহ

4
এই সমাধান যেমন একটি দুর্দান্ত ধারণা! - আমি এই সমাধানটি কয়েক মিনিটের মধ্যে প্রয়োগ করতে পেরেছিলাম। প্রথমে আমি আমার inputউপাদানটি অ্যাট্রিবিউট দিয়ে আপডেট করেছি data-value="1"। তারপরে আমি যে জায়গাগুলিতে মানটি ধরা এবং ব্যবহার করা হচ্ছে if (typeof $(this).attr('data-value') != 'undefined') { var id = $(this).attr('name'); val = $('#'+id).find('option[value="'+val+'"]').attr('data-value'); }
সেগুলিতে

4
তবে যদি আপনার কিছু পৃথক ডেটা-মানগুলির সাথে দুটি সমান ক্যাপশন থাকে
রিচার্ড আগুয়েরে

4
ধন্যবাদ হিজবুল্লাহ শাহ আপনি সত্যিই এত ঘন্টা বাঁচিয়েছেন
ABODE

5

আমি বুঝতে পারি এটি কিছুটা দেরিতে হতে পারে তবে আমি হোঁচট খেয়েছি এবং একাধিক অভিন্ন মূল্যবোধের সাথে পরিস্থিতিগুলি কীভাবে পরিচালনা করব তা ভাবছিলাম, তবে বিভিন্ন কী (বিগবারজু এর মন্তব্য অনুসারে)।

সুতরাং আমি স্টিফান মুলারের উত্তরকে কিছুটা সংশোধন করেছি:

অ-অনন্য মান সহ একটি ডেটালিস্ট:

<input list="answers" name="answer" id="answerInput">
<datalist id="answers">
  <option value="42">The answer</option>
  <option value="43">The answer</option>
  <option value="44">Another Answer</option>
</datalist>
<input type="hidden" name="answer" id="answerInput-hidden">

ব্যবহারকারী একটি বিকল্প, ব্রাউজার প্রতিস্থাপন নির্বাচন কখন input.valueসঙ্গে valueএর datalistপরিবর্তে বিকল্প innerText

নীচের কোডটি তার optionসাথে একটি পরীক্ষা করে value, এটি লুকানো ক্ষেত্রের মধ্যে ঠেলা দেয় এবং এর input.valueসাথে প্রতিস্থাপন করে innerText

document.querySelector('#answerInput').addEventListener('input', function(e) {
    var input = e.target,   
        list = input.getAttribute('list'),
        options = document.querySelectorAll('#' + list + ' option[value="'+input.value+'"]'),
        hiddenInput = document.getElementById(input.getAttribute('id') + '-hidden');

    if (options.length > 0) {
      hiddenInput.value = input.value;
      input.value = options[0].innerText;
      }

});

ফলস্বরূপ ব্যবহারকারী অপশনটির যা বলুক তা দেখতে পায় innerTextতবে option.valueফর্ম জমা দেওয়ার পরে অনন্য আইডি পাওয়া যায়। ডেমো জেএসফিডাল


চমৎকার সংযোজন :)
স্টিফান মুলার

1

অনুসন্ধানের জন্য বোতামে ক্লিক করার সময় আপনি এটি লুপ ছাড়াই খুঁজে পেতে পারেন।
কেবলমাত্র বিকল্পটিতে আপনার প্রয়োজনীয় মানটির সাথে একটি বৈশিষ্ট্য যুক্ত করুন (পছন্দ করুন id) এবং এটি নির্দিষ্ট সন্ধান করুন search

$('#search_wrapper button').on('click', function(){
console.log($('option[value="'+ 
$('#autocomplete_input').val() +'"]').data('value'));
})

-11

পিএইচপি ব্যবহার করে আমি এটি করার জন্য একটি খুব সহজ উপায় খুঁজে পেয়েছি। বলছি, এই জাতীয় কিছু ব্যবহার করুন

<input list="customers" name="customer_id" required class="form-control" placeholder="Customer Name">
            <datalist id="customers">
                <?php 
    $querySnamex = "SELECT * FROM `customer` WHERE fname!='' AND lname!='' order by customer_id ASC";
    $resultSnamex = mysqli_query($con,$querySnamex) or die(mysql_error());

                while ($row_this = mysqli_fetch_array($resultSnamex)) {
                    echo '<option data-value="'.$row_this['customer_id'].'">'.$row_this['fname'].' '.$row_this['lname'].'</option>
                    <input type="hidden" name="customer_id_real" value="'.$row_this['customer_id'].'" id="answerInput-hidden">';
                }

                 ?>
            </datalist>

উপরের কোডটি ফর্মটিকে বিকল্পের আইডি বহন করতে দেয় যা নির্বাচিতও রয়েছে।


এটি একটি জগাখিচুড়ি মনে হয় এবং এসকিউএল ইঞ্জেকশনটির মতো গন্ধযুক্ত। এটা করবেন না।
ফ্যাসেলডিব

@ 23r0, কেন এটিকে ভোট দেওয়া হয়েছে সে সম্পর্কে কিছু প্রতিক্রিয়া; এই প্রশ্নটি বিশেষত সীমান্ত কোড সম্পর্কে। ব্যাকএন্ড কোড সহ (পিএইচপি এর মতো) অপ্রয়োজনীয় এবং বিভ্রান্তিকর হতে পারে। এইচটিএমএল সম্পর্কিত, আমি আশা করি আপনি কেবল customer_id_realসর্বমোট জমা দেওয়ার জন্য শেষ মান পাবেন , নির্বাচিত মানটি পাবেন না।
জন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.