이봐, 나는 다음과 같은 로그인 대화 상자가있는 웹 응용 프로그램을 만들고 있습니다.
- 사용자가 “로그인”을 클릭
- 로그인 양식 HTML은 AJAX와 함께로드되어 페이지의 DIV에 표시됩니다.
- 사용자는 필드에 사용자 / 패스를 입력하고 제출을 클릭합니다.
<form>
AJAX를 통해 제출 된 사용자 / 패스가 아닙니다. - 사용자 / 패스가 정상이면 사용자가 로그인 한 상태에서 페이지가 다시로드됩니다.
- 사용자 / 패스가 나쁘면 페이지가 다시로드되지 않지만 DIV에 오류 메시지가 나타나고 사용자가 다시 시도해야합니다.
여기에 문제가 있습니다. 브라우저는 다른 사이트에 대해 일반적인 “이 암호를 저장 하시겠습니까?
“autocomplete = ‘on'”으로 <div>
in <form>
태그를 래핑하려고 시도했지만 아무런 차이가 없었습니다.
로그인 흐름을 크게 재 작업하지 않고도 브라우저가 암호를 저장하도록 제안 할 수 있습니까?
고마워 에릭
내 질문에 추가하기 위해 암호를 저장하는 브라우저를 사용하고 있으며 “이 사이트에서는 절대로”를 클릭하지 않았습니다 … 브라우저가 로그인 형식임을 감지하지 못하는 기술적 문제입니다. 운영자 오류 🙂
답변
이 질문에 대한 완벽한 해결책을 찾았습니다. (Chrome 27 및 Firefox 21에서 이것을 테스트했습니다).
알아야 할 두 가지가 있습니다.
- ‘비밀번호 저장’을 트리거하고
- 저장된 사용자 이름 / 암호 복원
1. ‘비밀번호 저장’을 트리거하십시오.
들어 파이어 폭스 (21) 가 제출 입력 텍스트 필드 비밀번호 입력 필드를 포함하는 양식이 있음을 감지 할 때, ‘암호 저장’가 시작됩니다. 그래서 우리는 단지 사용해야합니다
$('#loginButton').click(someFunctionForLogin);
$('#loginForm').submit(function(event){event.preventDefault();});
someFunctionForLogin()
event.preventDefault()
양식을 제출하여 원래 리디렉션 을 차단하는 동안 Ajax 로그인 및 로그인 페이지로 다시로드 / 리디렉션을 수행합니다 .
Firefox 만 다루는 경우 위의 솔루션으로 충분하지만 Chrome 27에서는 작동하지 않습니다. 그런 다음 Chrome 27에서 ‘비밀번호 저장’을 트리거하는 방법을 묻습니다.
들어 크롬 27 , ‘암호 저장’는 트리거 후 가 입력 텍스트 필드를 포함하는 양식을 제출하여 페이지로 리디렉션되는 속성 이름 = ‘이름’으로 입력 암호 필드 속성 이름 = ‘비밀번호’와를 . 따라서 양식 제출로 인해 리디렉션을 차단할 수 없지만 ajax 로그인을 완료 한 후 리디렉션을 수행 할 수 있습니다. (아약스 로그인으로 페이지를 다시로드하지 않거나 페이지로 리디렉션하지 않으려면 불행히도 내 솔루션이 작동하지 않습니다.) 그런 다음 사용할 수 있습니다
<form id='loginForm' action='signedIn.xxx' method='post'>
<input type='text' name='username'>
<input type='password' name='password'>
<button id='loginButton' type='button'>Login</button>
</form>
<script>
$('#loginButton').click(someFunctionForLogin);
function someFunctionForLogin(){
if(/*ajax login success*/) {
$('#loginForm').submit();
}
else {
//do something to show login fail(e.g. display fail messages)
}
}
</script>
type = ‘button’인 단추는 단추를 클릭 할 때 양식이 제출되지 않도록합니다. 그런 다음 아약스 로그인을 위해 버튼에 기능을 바인딩합니다. 마지막으로 호출 $('#loginForm').submit();
하면 로그인 한 페이지로 리디렉션됩니다. 로그인 한 페이지가 현재 페이지 인 경우 ‘signedIn.xxx’를 현재 페이지로 바꾸어 ‘새로 고침’을 수행 할 수 있습니다.
이제 Chrome 27의 방법은 Firefox 21에서도 작동합니다. 따라서 사용하는 것이 좋습니다.
2. 저장된 사용자 이름 / 암호를 복원하십시오.
loginForm을 HTML로 하드 코딩 한 경우 loginForm에 저장된 비밀번호를 복원하는 데 아무런 문제가 없습니다.
그러나 저장된 사용자 이름 / 암호는 문서가로드 될 때만 바인드되기 때문에 js / jquery를 사용하여 loginForm을 동적으로 만드는 경우 저장된 사용자 이름 / 암호는 loginForm에 바인드되지 않습니다.
따라서 loginForm을 HTML로 하드 코딩하고 js / jquery를 사용하여 loginForm을 동적으로 이동 / 표시 / 숨겨야했습니다.
비고 :
아약스 로그인을하는 경우 autocomplete='off'
와 같은 태그 형태로 추가하지 마십시오
<form id='loginForm' action='signedIn.xxx' autocomplete='off'>
autocomplete='off'
사용자 이름 / 암호를 ‘자동 완성’하도록 허용하지 않기 때문에 loginForm에 사용자 이름 / 암호 복원이 실패합니다.
답변
버튼 을 사용 하여 로그인 :
당신은을 사용하는 경우 type="button"
로 onclick
사용하여 로그인 처리기 ajax
, 다음 브라우저가 제공하지 않습니다 암호를 저장합니다.
<form id="loginform">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="doLogin" type="button" value="Login" onclick="login(this.form);" />
</form>
이 양식 에는 제출 단추 가없고 조치 필드가 없으므로 브라우저는 비밀번호 저장을 제공하지 않습니다.
제출 버튼을 사용 하여 로그인 :
그러나 단추를 변경하여 type="submit"
제출을 처리하면 브라우저가 비밀번호 저장 을 제안 합니다.
<form id="loginform" action="login.php" onSubmit="return login(this);">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="doLogin" type="submit" value="Login" />
</form>
이 방법을 사용하면 브라우저는 비밀번호 저장을 제공해야합니다.
두 가지 방법 모두에 사용되는 Javascript 는 다음과 같습니다 .
function login(f){
var username = f.username.value;
var password = f.password.value;
/* Make your validation and ajax magic here. */
return false; //or the form will post your data to login.php
}
답변
나는 이것으로 스스로 고투하고 있었고, 마침내 문제와 실패 원인을 추적 할 수있었습니다.
그것은 모두 내 로그인 양식이 페이지에 동적으로 주입되었다는 사실에서 비롯되었습니다 (backbone.js 사용). 로그인 양식을 index.html 파일에 직접 삽입하자마자 모든 것이 매력처럼 작동했습니다.
브라우저가 기존의 로그인 양식이 있다는 것을 알고 있어야한다고 생각하지만 내 페이지에 동적으로 주입 된 이후로 “실제”로그인 양식이 존재한다는 것을 몰랐습니다.
답변
이 솔루션은 Eric이 코딩 포럼에 게시 한 것을 위해 일했습니다.
메시지가 표시되지 않는 이유는 브라우저가 서버로 다시 새로 고치기 위해 페이지를 물리적으로 만들어야하기 때문입니다. 당신이 할 수있는 작은 트릭은 양식으로 두 가지 작업을 수행하는 것입니다. 첫 번째 조치는 Ajax 코드를 호출하여 제출하는 것입니다. 또한 양식이 숨겨진 iframe을 대상으로합니다.
암호:
<iframe src="ablankpage.htm" id="temp" name="temp" style="display:none"></iframe>
<form target="temp" onsubmit="yourAjaxCall();">
프롬프트가 나타나는지 확인하십시오.
에릭
답변
모든 브라우저 (chrome 25, safari 5.1, IE10, Firefox 16)에서 jQuery 및 ajax 요청을 사용하여 비밀번호를 저장하도록 요청 하는 궁극적 인 솔루션 이 있습니다 .
JS :
$(document).ready(function() {
$('form').bind('submit', $('form'), function(event) {
var form = this;
event.preventDefault();
event.stopPropagation();
if (form.submitted) {
return;
}
form.submitted = true;
$.ajax({
url: '/login/api/jsonrpc/',
data: {
username: $('input[name=username]').val(),
password: $('input[name=password]').val()
},
success: function(response) {
form.submitted = false;
form.submit(); //invoke the save password in browser
}
});
});
});
HTML :
<form id="loginform" action="login.php" autocomplete="on">
<label for="username">Username</label>
<input name="username" type="text" value="" autocomplete="on" />
<label for="password">Password</label>
<input name="password" type="password" value="" autocomplete="on" />
<input type="submit" name="doLogin" value="Login" />
</form>
요령은 양식을 중지하여 자체 방식 (event.stopPropagation ())을 제출하는 대신 자신의 코드 ($ .ajax ())를 보내고 ajax의 성공 콜백에서 양식을 다시 제출하여 브라우저가 양식을 잡고 표시합니다. 비밀번호 저장 요청. 오류 처리기 등을 추가 할 수도 있습니다.
누군가에게 도움이되기를 바랍니다.
답변
spetson의 답변을 시도했지만 Chrome 18에서는 작동하지 않았습니다. 효과는 iframe에로드 핸들러를 추가하고 제출을 방해하지 않는 것입니다 (jQuery 1.7).
function getSessions() {
$.getJSON("sessions", function (data, textStatus) {
// Do stuff
}).error(function () { $('#loginForm').fadeIn(); });
}
$('form', '#loginForm').submit(function (e) {
$('#loginForm').fadeOut();
});
$('#loginframe').on('load', getSessions);
getSessions();
HTML :
<div id="loginForm">
<h3>Please log in</h3>
<form action="/login" method="post" target="loginframe">
<label>Username :</label>
<input type="text" name="login" id="username" />
<label>Password :</label>
<input type="password" name="password" id="password"/>
<br/>
<button type="submit" id="loginB" name="loginB">Login!</button>
</form>
</div>
<iframe id="loginframe" name="loginframe"></iframe>
getSessions ()는 AJAX 호출을 수행하고 실패하면 loginForm div를 표시합니다. 사용자가 인증되지 않은 경우 웹 서비스는 403을 반환합니다.
FF 및 IE8에서도 작동하도록 테스트되었습니다.
답변
브라우저가 양식이 로그인 양식임을 감지하지 못할 수 있습니다. 이 이전 질문 에 대한 논의에 따르면 , 브라우저는 다음과 같은 양식 필드를 찾습니다 <input type="password">
. 비밀번호 양식 필드가 이와 비슷한 방식으로 구현됩니까?
편집 : 아래 질문에 대답하기 위해 Firefox는 form.elements[n].type == "password"
(모든 양식 요소를 반복 하여) 암호 를 감지 한 다음 암호 필드 바로 앞에 텍스트 필드의 양식 요소를 통해 뒤로 검색하여 사용자 이름 필드를 감지 한다고 생각 합니다 (자세한 내용은 여기 ). 내가 알 수 있듯이 귀하의 로그인 양식은 <form>
Firefox의 일부 이거나 Firefox가 감지하지 못합니다.
