javascript - скачать - изменение значения input js




jQuery focus() иногда не работает в IE8 (5)

Была похожая проблема с IE8. Я хотел сфокусировать ввод в диалоге, когда он открыт. Используется autoOpen = false. Заметил, что фокус не работает только для первого фокусируемого элемента в диалоге. Пробовал setTimeout но он работал только иногда. Размытие элемента перед фокусировкой мне помогло.

$('#dialog').find('#name').blur();
$('#dialog').find('#name').focus();

Я разрабатываю веб-приложение с использованием JQuery. У меня есть функциональность, которая добавляет новую строку из 3 полей ввода. После создания этих элементов DOM я хочу сфокусировать одно из полей ввода. Я делаю это с помощью вызова функции jQuery focus () в нужном поле ввода.

Проблема в том, что вызов focus () отлично работает в IE6 и FF3.5, но не работает в IE8.

Я пытался сделать простой рабочий пример этой проблемы, чтобы показать ее здесь, но с урезанной версией кода focus () работает нормально. Поэтому я предположил, что DOM еще не готов, когда я вызываю focus () в IE8. Для этого я попытался вызвать setTimeout ('myFocus ()', 400). У меня был успех, и в некоторых случаях фокус действительно работал, но все же не всегда. Случайно это не фокусирует мое поле ввода.

Вопрос: кто-нибудь сталкивался с подобными проблемами и кто-нибудь знает, как это обойти? Использование setTimeout выглядит как очень уродливый обходной путь.

Tnx заранее

Отредактировано: 26.08.2009

Удалось воспроизвести на простом примере. Вот код HTML + JS, который воспроизводит эту ошибку на IE8.

<html>
<head>
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript">
        function performChanged() {
          formChanged = true;
        }

        function handleChange() {
          var parentDiv = $('#container');
          newValue = $(html).html();

          parentDiv.html(newValue);
          $(".sel1",parentDiv).bind('change',handleChange);
          //alert('Uncomment this and after alert focus will be on input');
          $("input.cv_values",parentDiv).focus();
        }

        $(document).ready(function() {
          $('.trackChange').bind('change', handleChange);
        });
        var html = '<div class=\"div1\">\n<select class=\"sel1\" id=\"sel1\" name=\"sel1\"><option value=\"\"><\/option>\n<option value=\"11\">Select me to see problem<\/option>\n<\/select>\n\n\n<input class=\"cv_values\" id=\"sel3\" name=\"sel3\" size=\"30\" type=\"text\" value=\"\" /><br/>Focus should in input field. With alert it is but without alert focus is not there</div>';
    </script>
</head>
<body>
    <select class="trackChange" onchange='performChanged();'>
      <option value=""></option>
      <option value="1" >Select me to generate new inputs</option>
    </select>

    <div id="container"></div>
</body>

Для воспроизведения: 1) выберите значение из первого выпадающего списка. Вы увидите, что ввод в первый раз работает 2) выберите значение из второго раскрывающегося списка. Вы увидите, что ошибка воспроизводится.

Затем в коде вы можете закомментировать строку, где он показывает JS alert (). Странно то, что если есть этот alert (), то после него фокус работает нормально.

Надеюсь, это поможет понять, где моя проблема.

PS Мне нужно, чтобы мое приложение работало таким образом - оно восстанавливает эти входные данные после выбора значения из выпадающего списка. Это упрощенный пример моего приложения;).


В связи с решением Kazys я обнаружил, что это решает все мои проблемы (с использованием файлов IE8 и .HTA):

$("elem").blur();
$("elem").focus().focus();

Я понятия не имею, почему, но как-то вызов дважды фокусировки помогает IE в этом.

РЕДАКТИРОВАТЬ: я обнаружил, что вызовы .show () и .select () также могут помочь.


Странно, у меня была такая же проблема, и я решил ее, используя простой старый javascript следующим образом:

document.getElementById('friend_name').focus();

Использование jQuery-эквивалента $('#friend_name').focus(); не работал в IE8: - /


У меня была похожая проблема с моим приложением, но я не могу воспроизвести проблему фокуса с вашим кодом. Моя проблема немного отличалась тем, что на моей странице был хеш ссылки, из-за которого IE не фокусировался на моем элементе.

В любом случае, чтобы обойти проблему, я добавил таймаут:

setTimeout(function () {
  $('.my-thing').focus();
}, 100);

Не заметно для пользователя, но это дает IE возможность дышать.


Это старый вопрос, но он топ в поиске, поэтому хотел обновить.

Я не знаю, было ли когда-нибудь это исправлено, но сегодня я снова столкнулся с этой проблемой в IE11, используя jquery-2.1.3. Я обнаружил, что завершение вызова фокуса в setTimeout, как указано выше в Ponny, работает лучше всего для меня.

Мне действительно нужно было увеличить время ожидания в некоторых случаях, чтобы оно заработало.





internet-explorer-8