2015-09-04 2 views
0

Я хочу защитить входные данные всплывающим окном подтверждения, и когда кто-нибудь подтвердит, я хочу удалить эту защиту и дать фокус на вход , Моя попытка была:javascript: Как сфокусироваться на объекте после выключения («фокус»)

my_input.on('focus', switch_off_focus_handler(my_input)); 

function switch_off_focus_handler(input){ 
    var confirm = confirm("Are you sure?"); 
    if (confirm) { 
     input.off('focus'); 
     input.focus(); 
    } 
} 

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

Я делаю неправильно?

EDIT: Извините, это был не тот код, который я использовал. Здесь (с испытательной средой html):

<!doctype html> 
<html> 
    <head> 
     <script src="/static/js/jquery-1.11.1.min.js" type="text/javascript"></script> 
    </head> 
    <body> 
     <input type="text" value="HALLO" id="my_input"> 
     <script type="text/javascript"> 
      my_input=$("input#my_input") 
      my_input.on('focus', switch_off_focus_handler(my_input)); 

      function switch_off_focus_handler(input){ 
       return function() { 
        var conf = confirm("Are you sure?"); 
        if (conf) { 
         input.off('focus'); 
         input.focus(); 
        } 
       } 
      } 
     </script> 
    </body> 
</html> 

Проблема, похоже, исходит из диалогового окна подтверждения. Если я заменить

var conf = confirm("Are you sure?"); 

по

var conf = true; 

затем он работает.

ответ

0

Вам необходимо передать ссылку на функцию как обработчик события фокусировки, внутри обработчика this будет ссылаться на текущий элемент.

Кроме того, это лучшая практика, чтобы предназначаться только обработчик, а отменяя обработчик, один из возможных решений для этого является использование Namespace событие с

my_input.on('focus.confirm', switch_off_focus_handler); 

function switch_off_focus_handler() { 
    var confirm = confirm("Are you sure?"); 
    if (confirm) { 
     $(this).off('focus.confirm').focus(); 
    } 
} 

Если вы не хотите, чтобы изменить синтаксис метода, а затем использовать анонимный обработчик событий, который может вызываем метод switch_off_focus_handler

my_input.on('focus.confirm', function() { 
    switch_off_focus_handler(this); 
}); 

function switch_off_focus_handler(input) { 
    var confirm = confirm("Are you sure?"); 
    if (confirm) { 
     $(input).off('focus.confirm').focus(); 
    } 
} 
+0

Прошу прощения. Я использовал ссылку на функцию, но я скопировал неправильный код в минимальном примере :(Но он все еще не работает, так или иначе из-за поля подтверждения. Я отредактирую свой вопрос. –

0

Я надеюсь, что вы хотите, чтобы вход должен быть отключен, и вы хотите, чтобы открыть confirmat когда он нажимает на отключенный вход, а затем вы хотите включить его, как только пользователь его подтвердит. В этом случае добавьте disabled к вашему входу, а затем используйте следующий код, чтобы удалить отключенный и сделать его функциональным. Обратите внимание, что событие click не привязывается к отключенному вводу, поэтому вам нужно обернуть свой ввод в какой-либо контейнер (например, #container), а затем привязать его к этому контейнеру.

$("#container").on('click', function(){ 
    if(my_input.prop("disabled")){ 
    switch_off_focus_handler(my_input); 
    } 
}); 

function switch_off_focus_handler(input){ 
    var confirm = confirm("Are you sure?"); 
    if (confirm) { 
     input.prop('disabled', false).focus(); 
    } 
} 

Надеюсь, это поможет. См. Это fiddle.

+0

спасибо за идею с контейнером. –

+0

переменная подтвердите, должно быть другое имя, как функция подтверждения. –

+0

Да, спасибо, я попробовал, и теперь он работает в скрипке –