ПРИМЕЧАНИЕ. Этот вопрос был сильно изменен из его первоначальной версии. Этот вопрос был значительно упрощен.
Подобные вопросы задавались несколько раз раньше, в разных формах - например,
Как заставить браузер запрашивать пароль?
Как браузер знает, когда запрашивать пользователя для сохранения пароля?
Однако этот вопрос касается очень специфического аспекта функциональности Chrome, поэтому в этом отношении он совсем другой.
Судя по прошлым ответам, кажется, что лучший подход к тому, чтобы заставить Chrome запрашивать сохранение пароля, заключается в том, чтобы отправить форму в фиктивный iframe, а фактически войти в систему через AJAX: пример. Это имеет смысл для меня, и поэтому я несколько раз искал несколько примеров кода. Однако поведение Chrome в этом отношении НЕ имеет смысла для меня. Вообще. Отсюда вопрос.
По какой-то причине Chrome не предложит вам сохранить ваш пароль, если форма, которая отправляется в фиктивный iframe, присутствует во время/справа после onDomReady.
В jsfiddle можно найти здесь, но это мало используется, потому что вы должны локально создать dummy.html
, чтобы увидеть описанное поведение. Поэтому лучший способ увидеть это - скопировать полный html в свой собственный index.html
, а затем создать файл dummy.html
.
Вот полный код для index.html
. Три подхода выделяются как (1)
, (2)
, (3)
. Только (2)
гарантирует, что пользователю будет предложено сохранить свой пароль, а тот факт, что (3)
не работает, вызывает у меня особое недоумение.
<html>
<head>
<title>Chrome: Remember Password</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
<script type="text/javascript">
$(function(){
function create_login_form()
{
$('#login_form').html(
"<input type='text' name='email'>" +
"<input type='password' name='password'>" +
"<input id='login-button' type='submit' value='Login'/>");
}
// (1) this does not work. chrome seems to require time after "onDomReady" to process
// the forms that are present on the page. if the form fields exist while that processing
// is going on, they will not generate the "Save Password?" prompt.
//create_login_form();
// (2) This works. chrome has obviously finished its "work" on the form fields by now so
// we can add our content to the form and, upon submit, it will prompt "Save Password?"
setTimeout(create_login_form,500);
});
</script>
</head>
<body>
<!-- Our dummy iframe where the form submits to -->
<iframe src="dummy.html" name="dummy" style="display: none"></iframe>
<form action="" method="post" target="dummy" id="login_form">
<!-- (3) fails. form content cannot be present on pageload -->
<!--
<input type='text' name='email'>
<input type='password' name='password'>
<input id='login-button' type='submit' value='Login'/>
-->
</form>
</body>
</html>
Если бы кто-нибудь мог объяснить, что здесь происходит, я был бы очень благодарен.
РЕДАКТИРОВАТЬ: Обратите внимание, что эта "проблема с сохранением пароля" с Chrome распространяется на людей, работающих с AngularJS, также разработанных Google: Github