6

Проверка, имеет ли элемент <input> фокус с помощью jQuery

22

На главной странице сайта, который я разрабатываю, несколько <div> используют псевдокласс CSS :hover, чтобы добавлять рамку при наведении мыши. Один из <div> содержит <form>, который с помощью jQuery сохраняет рамку, если одно из полей ввода внутри него имеет фокус. Это работает идеально, но IE6 не поддерживает :hover для любых элементов, кроме <a>. Поэтому для этого браузера мы используем jQuery, чтобы эмулировать поведение CSS :hover с помощью метода $(#element).hover().

Единственная проблема заключается в том, что теперь, когда jQuery обрабатывает и focus(), и hover(), когда поле ввода имеет фокус, а пользователь перемещает мышь внутрь и наружу, рамка исчезает.

Я думал, что мы могли бы использовать некий условный оператор, чтобы остановить это поведение. Например, если при выходе мыши мы проверим, имеет ли какое-либо из полей ввода фокус, мы могли бы предотвратить исчезновение рамки. Насколько я знаю, в jQuery нет селектора :focus, поэтому я не уверен, как это сделать. Есть идеи?

5 ответ(ов)

0

Вопрос: Как сделать так, чтобы при фокусе на инпуте его граница становилась красной, а при потере фокуса — граница возвращалась к исходному состоянию?

Ответ: Вы можете использовать следующий код на CSS и jQuery для достижения желаемого эффекта.

Сначала добавьте CSS-класс .focus для изменения цвета границы:

.focus {
    border-color: red;
}

Теперь добавьте jQuery, чтобы управлять классами при фокусе и потере фокуса:

$(document).ready(function() {
    $('input').blur(function() {
        $(this).removeClass("focus"); // Убираем класс focus при потере фокуса
    })
    .focus(function() {
        $(this).addClass("focus"); // Добавляем класс focus при установке фокуса
    });
});

Этот код работает следующим образом: при получении фокуса класс focus добавляется к элементу <input>, изменяя цвет его границы на красный. Как только фокус теряется (нажимаете на другое место на странице или переходите к другому элементу), класс focus удаляется, и граница возвращается к своему исходному состоянию.

Убедитесь, что у вас подключена библиотека jQuery, чтобы код работал корректно.

0

Не совсем понимаю, что именно вы хотите сделать, но, похоже, это можно решить, сохраняя состояние элементов ввода (или div?) в переменной:

$('div').each(function(){

    var childInputHasFocus = false;

    $(this).hover(function(){
        if (childInputHasFocus) {
            // здесь можно выполнить какое-то действие
        } else { }
    }, function() {
        if (childInputHasFocus) {
            // здесь можно выполнить другое действие
        } else { }
    });

    $('input', this)
        .focus(function(){
            childInputHasFocus = true;
        })
        .blur(function(){
            childInputHasFocus = false;
        });
});

В этом примере при наведении на div проверяется, находится ли курсор на элементе ввода. Переменная childInputHasFocus отслеживает, имеет ли фокус какой-либо из дочерних элементов ввода, и в зависимости от этого можно выполнять определённые действия.

0

Если кому интересно, сейчас существует гораздо лучший способ захвата фокуса — $(foo).focus(...).

Вы можете ознакомиться с документацией по этому методу по следующей ссылке: jQuery API - focus().

0

Да, вы можете рассмотреть возможность использования событий mouseOver и mouseOut, чтобы смоделировать это поведение. Эти события позволяют отслеживать, когда курсор мыши входит и покидает элемент. Также рекомендую обратить внимание на события mouseEnter и mouseLeave. Они работают аналогично, но не срабатывают при наведении на дочерние элементы, что может быть полезно в некоторых случаях. Выбор между этими событиями зависит от ваших требований.

0

Чтобы отслеживать состояние наведения (hover) и фокуса (focus), вы можете использовать булевы переменные (флаги), которые будут принимать значение true или false. При изменении любого из этих состояний вызывайте функцию, которая будет добавлять или удалять границу в зависимости от значений этих флагов.

Вот пример реализации:

let focused = false;
let hovered = false;

function updateBorder() {
    const element = document.getElementById('yourElementId'); // Замените 'yourElementId' на ID вашего элемента
    if (!focused && !hovered) {
        element.style.border = 'none'; // Убираем границу, если оба флага ложны
    } else {
        element.style.border = '1px solid black'; // Показываем границу, если хотя бы один флаг истинен
    }
}

// Обработчик события onfocus
document.getElementById('yourElementId').addEventListener('focus', () => {
    focused = true;
    updateBorder();
});

// Обработчик события onblur
document.getElementById('yourElementId').addEventListener('blur', () => {
    focused = false;
    updateBorder();
});

// Обработчик события onmouseover
document.getElementById('yourElementId').addEventListener('mouseover', () => {
    hovered = true;
    updateBorder();
});

// Обработчик события onmouseout
document.getElementById('yourElementId').addEventListener('mouseout', () => {
    hovered = false;
    updateBorder();
});

В этом коде:

  • Мы объявляем два булевых флага: focused и hovered.
  • Функция updateBorder проверяет состояние этих флагов и добавляет или удаляет границу у элемента.
  • Мы используем обработчики событий для управления значениями флагов при наведении и фокусировке на элементе.

Таким образом, граница будет добавляться и удаляться в зависимости от состояния элементов, что позволит добиться ожидаемого поведения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь