Фильтруемый выпадающий список получения идентификатора - PullRequest
0 голосов
/ 17 марта 2019

Мне нужно получить идентификатор выбранной опции.

Этот способ всегда возвращает первый идентификатор, он возвращает «1»:

function myFunction() {
  var skills = document.getElementById('toto');
  var skillId = skills.getAttribute('data-id');
  console.log(skillId);
}
<label>
    Skills :
    <input id="inputTest" name='skill' list='skills'>
        <datalist id='skills'>
            <select> 
                 <option id="toto" data-id="1">HTML</option>
                 <option id="toto" data-id="2">Jquery</option>
                 <option id="toto" data-id="3">CSS</option>
            </select>
        </datalist>
    </label>

<button type="button" id="button1" onclick="myFunction()"> Clickhere </button>

Этот способ не работает, он возвращает "null":

<label>
Skills :
<input id="inputTest" name='skill' list='skills'>
    <datalist id='skills'>
        <select>
         <div id="toto">
            <option data-id="1">HTML</option>
            <option data-id="2">Jquery</option>
            <option data-id="3">CSS</option>
         </div>
        </select>
    </datalist>
</label>

<button type="button" id="button1" onclick="myFunction()"> Clickhere </button>

<script>
    function myFunction(){
    var skills = document.getElementById('toto');
    var skillId = skills.getAttribute('data-id');
    console.log(skillId); 
    }
</script>

Следующий способ тоже не работает:

...
<datalist id='skills'>
...
    <script>
        function myFunction(){
        var skills = document.getElementById('skills');
        var skillId = skills.getAttribute('data-id');
        console.log(skillId); 
        }
    </script>

И если я поставлю идентификатор на, он тоже не работает ..

метод getAttribute() неизбежно относится к тому же <div></div>, что и метод getElementById()?

Я просто хочу понять правильное функционирование ..

Есть ли у него другой способ сделать это без datalist? Потому что «тег списка данных не поддерживается в Internet Explorer 9 и более ранних версиях или в Safari».

Большое спасибо:)

Ответы [ 2 ]

3 голосов
/ 17 марта 2019

Вы можете использовать filter() и map(), чтобы получить параметр, сопоставив текст:

function myFunction(){
  var skills = document.getElementById('inputTest');
  var allOption = [].slice.call(document.querySelectorAll('#skills option'));
  var selected = allOption.filter(o => o.textContent == skills.value).map(el => el.getAttribute('data-id'))[0];
  console.log(selected); 
}
<label>
Skills :
<input id="inputTest" name='skill' list='skills'>
    <datalist id='skills'>
        <option data-id="1">HTML</option>
        <option data-id="2">Jquery</option>
        <option data-id="3">CSS</option>
    </datalist>
</label>

<button type="button" id="button1" onclick="myFunction()"> Clickhere </button>
1 голос
/ 17 марта 2019

@ Мамун, это работает как шарм, кстати, я нашел другой способ сделать это с помощью Jquery:

$(document).ready(function() {
    $('#button1').click(function()
    {
        var value = $('#inputTest').val();
        console.log(($('#skills [value="' + value + '"]').data('value')));
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<label>
Skills :
<input id="inputTest" name='skill' list='skills'>
    <datalist id='skills'>
        <option value="HTML" data-value="1"></option>
        <option value="CSS" data-value="2"></option>
        <option value="Jquery" data-value="3"></option>
        <option value="Java" data-value="4"></option>
    </datalist>
</label>

<button type="button" id="button1"> Clickhere </button>

Надеюсь, вам это тоже поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...