HTML-элемент, показывающий неправильный индекс при двойном щелчке в Chrome

У меня есть список, как показано ниже. Я хочу дважды щелкнуть элемент, а затем получить индекс элемента для элемента, по которому дважды щелкнули. Я использую Edge/Chrome. Кажется, он работает в Firefox.

Чтобы увидеть проблему, в Edge запустите фрагмент кода и дважды щелкните элемент. Предупреждение показывает -1. Теперь щелкните элемент, затем дважды щелкните тот же элемент, и в предупреждении отобразится значение индекса.

     <select id = "jobs" multiple size = "15" style = " width: 150px; height: 280px" ondblclick = "move('jobright');">
            <option value = "1">Day 1 - Sunday</option>
            <option value = "2">Day 2 - Monday</option>
            <option value = "3">Day 3 - Tuesday</option>
            <option value = "4">Day 4 - Wednesday</option>
            <option value = "5">Day 5 - Thursday</option>
            <option value = "6">Day 6 - Friday</option>
            <option value = "7">Day 7 - Saturday</option>
        </select>
     <script>  
    function move(direction)
            {
                var source;
                source = document.getElementById('jobs');
                
        alert(source.selectedIndex);
            }
</script>

Есть ли причина, по которой вы пытаетесь использовать для этого элемент ввода <select>? Этот элемент предназначен не для этого.

Sean 14.06.2024 18:51

Не можете ли вы предоставить минимальный воспроизводимый код, как рекомендовано в SO, который вы, как ожидается, уже знаете?

Mister Jojo 14.06.2024 18:52

Я не могу воспроизвести то, что вы говорите, - ваш фрагмент кода работает у меня правильно в Firefox.

TylerH 14.06.2024 20:55

@Шон, я не вижу проблем с использованием <select> для этого. Это стандартный способ отображения списка предопределенных элементов из внешнего источника, и это все, что нужно спрашивающему для тестирования своего JavaScript.

TylerH 14.06.2024 20:59

Хорошо, тогда похоже на проблему с Edge/Chrome. У меня это тоже работает в Firefox. К сожалению, это необходимо запустить в Edge.

user2774515 14.06.2024 21:10

@TylerH Нестандартно пытаться использовать его в контексте, когда вам нужно привязать события двойного щелчка к параметрам. Тем более, что разные пользовательские агенты отображают вещи совершенно по-разному. Например, принятый ответ не будет работать в Safari iOS. Гораздо лучше использовать список кнопок.

Sean 17.06.2024 17:59

@ Шон, конечно, поскольку для этого не существует стандарта; это вопрос предпочтений. Конечно, это необычный выбор, но не неправильный. Что касается iOS Safari, это не имеет значения; ОП явно просит, чтобы что-то работало в Microsoft Edge. Решения не должны касаться совместимости браузеров.

TylerH 18.06.2024 15:52

@TylerH Нам придется согласиться не согласиться.

Sean 18.06.2024 16:49

Интересно, что приведенный выше фрагмент кода начал работать несколько дней спустя... хммммм

user2774515 27.06.2024 17:55
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
9
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша проблема в том, что при двойном щелчке мыши вы сначала выбираете элемент, а затем отменяете его выбор, а это означает, что при срабатывании события ondblclick у вас ничего не выбрано. source.selectedIndex возвращает -1, потому что вы только что отменили выбор этой опции. Вот почему индекс возвращается правильно, когда вы начинаете с выбранного объекта, потому что на этот раз второй щелчок выбирает элемент.

Вы можете решить эту проблему, используя первый аргумент ondblclick, event. (См.: Элемент: dblclick на MDN). Свойство target события будет объектом HTML option, и вы можете использовать option.value для получения его индекса. Вы все равно можете использовать аргумент direction, передав его в качестве второго параметра.

<select id = "jobs" multiple size = "15" style = " width: 150px; height: 280px" ondblclick = "move(event,'jobright');">
  <option value = "1">Day 1 - Sunday</option>
  <option value = "2">Day 2 - Monday</option>
  <option value = "3">Day 3 - Tuesday</option>
  <option value = "4">Day 4 - Wednesday</option>
  <option value = "5">Day 5 - Thursday</option>
  <option value = "6">Day 6 - Friday</option>
  <option value = "7">Day 7 - Saturday</option>
</select>
<script>  
  function move(event, direction) {
    alert(event.target.value);
  }
</script>

Другие вопросы по теме