2014-01-08 4 views
6

У меня возникла проблема, когда у нас есть страница оплаты, которую мы только разрешаем вам отправить один раз.IOS 7 помню этот обратный вызов

И на iOS, если вы введете кредитную карту, она спросит вас, хотите ли вы ее сохранить (функция Safari не наша). Однако это вызвано после того, как наша проверка javascript присваивает логическое значение для запрещения повторного ввода.

Всплывающее окно Safari останавливает распространение страницы и ничего не происходит.

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

Примечание: я уже пробовал autocomplete="off" на форме и вводе, чтобы это всплывающее окно не отображалось. Что не работает.

Редактировать: Я обнаружил, что причина, по которой форма не отправляется после нажатия не сейчас, заключается в том, что мы используем Recaptcha (которая скрыта за всплывающим окном на картинке).

enter image description here

+0

Попробуйте использовать formnovalidate, autocorrect и autocomplete all together. – Pinal

ответ

4

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

Это побуждает автозаполнение:

<form action="test" method="post" id="credit"> 
    Name:<input type="text" name="cardholder" /> 
    <br/> 
    Credit Card Type: 
    <select name="cardtype" > 
     <option></option> 
     <option value="amex">amex</option> 
     <option value="visa">visa</option> 
     <option value="mastercard">mastercard</option> 
    </select> 
    <br/> 
    Credit Card:<input type="text" name="cardnumber" /> 
    <br/> 
    Expiration:<input type="text" name="expirationdate" /> 
    <br/> 
    <input type="submit"> 
</form> 

Это не подскажи :

<form action="test" method="post" id="credit" autocomplete="off" > 
    Name:<input type="text" name="h" autocomplete="off" /> 
    <br/> 
    Credit Card Type: 
    <select name="t" autocomplete="off" > 
     <option></option> 
     <option value="amex">amex</option> 
     <option value="visa">visa</option> 
     <option value="mastercard">mastercard</option> 
    </select> 
    <br/> 
    Credit Card:<input type="text" name="n" autocomplete="off" /> 
    <br/> 
    Expiration:<input type="text" name="d" autocomplete="off" /> 
    <br/> 
    <input type="submit"> 
</form> 
+0

Я буду исследовать его, у нас есть максимальная длина 16 в этом поле, и я бы предположил, что они тоже могут это искать. При дальнейшем поиске, если вы просматриваете javascript на Safari с подключенным устройством ios, вы можете видеть внутренние вызовы, выполняемые сафари после отправки формы. Чтобы дать вам намек на то, что происходит. Спасибо за ответ. Если он выйдет, я буду награждать вас. –

+0

Также я могу получить всплывающее окно в одной из наших тестовых сред. Не на моей локальной машине. Может быть, это потому, что только эта среда имеет действительный сертификат? –

+0

Использование SSL может влиять на уравнение. В моем тесте я использовал https-соединение. –

1

Это вариант на Sam Nunnally's answer.

Я был в ситуации, когда я работал с пакетом Python и не мог редактировать имя кредитной карты, поэтому мне пришлось переименовывать поля на лету с помощью jQuery. Это может или не может работать для других в зависимости от того, как им нужно использовать представленные данные формы.

Вот наиболее подходящий код, который работал для меня с некоторыми комментариями. Мне нужно было переименовать поле и отделить ярлык от ввода (когда была отметка for, в которой говорилось, что «Кредитная карта», iOS вынюхала ее), и я выбрал autocomplete="off" для хорошей оценки.

var iOSCheck = false; 
var cardField = $("#id_card_number"); 

if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) { // This could be more elegant; should sniff iOS 7.x specifically 
    iOSCheck = true; 
} 

if (iOSCheck == true) { 
    $("#id_card_number").attr('id','workaround-one'); // Rename ID. Nondescript name. 
    $('#workaround-one').attr('autocomplete','off'); // Turn off autocomplete (not sure if necessary) 

    $("#w1-label").after('<div class="simulate-label">Credit Card</div>'); // Kill the label. Append the text, 
    $("#w1-label").remove(); // Then remove the label. That way the text in the label doesn't link to the CC field. 

    cardField = $('#workaround-one'); // Redefine our credit card field so we can reference it later in the script. 
} 
Смежные вопросы