Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Сохранить состояние (https://javascript.ru/forum/dom-window/77096-sokhranit-sostoyanie.html)

Volun 24.03.2019 16:28

Сохранить состояние
 
Прошу вашей помощи. На странице есть 2 формы, при заполнении первой по клику она скрывается и появляется вторая форма. Как мне сохранить такое состояние (видимость форм) при перезагрузке страницы или возврате на нее. Код обработчика форм:

$( document ).ready(function() {
    $("#btn_name").click(
		function(){
			sendAjaxForm('form_pass', 'form_name', 'save_user.php');
			return false; 
		}
	);
});
 
function sendAjaxForm(form_pass, form_name, url) {
    $.ajax({
        url:     url,
        type:     "POST", 
        dataType: "html", 
        data: $("#"+form_name).serialize(),  
        success: function(response) { 
        	result = $.parseJSON(response);
        	$('#form_name').hide();
                $('#form_pass').toggle();
    	},
    	error: function(response) { 
            $('#error_message').html('Error message.');
    	}
 	});
}

ksa 25.03.2019 08:14

Цитата:

Сообщение от Volun
Как мне сохранить такое состояние

На клиенте можно:
- записать в куки
- записать в локальное хранилище

При чтении страницы прочитать. Если есть запись о скрытии - скрыть нужную форму.

Volun 25.03.2019 10:06

Цитата:

Сообщение от ksa (Сообщение 505355)
На клиенте можно:
- записать в куки
- записать в локальное хранилище

При чтении страницы прочитать. Если есть запись о скрытии - скрыть нужную форму.

Да, я пробовал сохранить в localstorage, но что-то никак не получается. Не могли бы вы подсказать как это сделать?

Nexus 25.03.2019 10:21

Volun, пример работы с localStorage:
https://javascript.ru/forum/misc/769...tml#post504507

Volun 25.03.2019 10:33

Да, спасибо, уже разобрался. Вот код если кому понадобится:

$( document ).ready(function() {
    
var hideName = localStorage.getItem("hideName");
$("#form_name").css("display",hideName);
var showPass = localStorage.getItem("showPass");
$("#form_pass").css("display",showPass);

    $("#btn_name").click(
		function(){
			sendAjaxForm('form_pass', 'form_name', 'save_user.php');
			return false; 
		}
	);
});
 
function sendAjaxForm(form_pass, form_name, url) {
    $.ajax({
        url:     url,
        type:     "POST", 
        dataType: "html",
        data: $("#"+form_name).serialize(),  
        success: function(response) { 
        	result = $.parseJSON(response);
        	$('#form_name').hide();
                $('#form_pass').toggle();
                localStorage.setItem("hideName","none");
                localStorage.setItem("showPass","block");

    	},
    	error: function(response) { 
            $('#error_message').html('Error message');
    	}
 	});
}

Volun 25.03.2019 12:37

Господа, еще такой вопрос. Как мне получить значение поля email из формы #form_name и передать его в скрытое поле hidden_email формы #form_pass ?

ksa 25.03.2019 15:07

Цитата:

Сообщение от Volun
поля email из формы #form_name

По форме понятно - ее ИД form_name. Так?
А, что за поле email? Это его ИД?
Показал бы фрагмент html...

ksa 25.03.2019 15:09

Цитата:

Сообщение от Volun
и передать его в скрытое поле hidden_email формы #form_pass ?

Когда получишь значение из email, его нужно прописать в поле hidden_email. Это его ИД или что?
После этого вызвать отправку формы #form_pass. Это ИД той формы?

document.getElementById('form_pass').submit();

Volun 25.03.2019 15:19

Вот код обеих форм. Они находятся на одной странице, и по клику первая скрывается, а вторая появляется без перезагрузки страницы.

<form method="post" id="form_name">
<input name="first_name" placeholder="First Name" class="form-control" data-i18n="">
<input  name="last_name" placeholder="Last Name" class="form-control" data-i18n="">
<input  name="email" placeholder="Email" class="form-control" data-i18n="">
<button type="submit" id="btn_name" class="btn-formnav btn"><span data-animation-name="next-span"><span data-i18n="">NEXT</span> &gt;</span></button>
</form><br>

<form method="post" id="form_pass">
<input name="password" placeholder="Password" class="form-control" data-i18n="">
<input  name="pass_conf" placeholder="Confirm Password" class="form-control" data-i18n="">
<input name="hidden_email" class="form-control" data-i18n="" style="display: none;">
<button type="submit" id="btn_pass" class="btn-formnav btn"><span data-animation-name="next-span"><span data-i18n="">NEXT</span> &gt;</span></button>
</form>

Dilettante_Pro 25.03.2019 15:29

В скрипте пост#6 перед 10 или после 10 строки добавить

hidden_email.value = email.value;

ksa 25.03.2019 15:51

Volun, как вариант...

<form method="post" id="form_name">
	<input name="first_name" placeholder="First Name" class="form-control" data-i18n="">
	<input  name="last_name" placeholder="Last Name" class="form-control" data-i18n="">
	<input  name="email" placeholder="Email" class="form-control" data-i18n="" value='tmp@test.ru'>
	<button type="submit" id="btn_name" class="btn-formnav btn"><span data-animation-name="next-span"><span data-i18n="">NEXT</span> &gt;</span></button>
</form>
<br>
<form method="post" id="form_pass">
	<input name="password" placeholder="Password" class="form-control" data-i18n="">
	<input  name="pass_conf" placeholder="Confirm Password" class="form-control" data-i18n="">
	<input name="hidden_email" class="form-control" data-i18n="" style="display: none;">
	<button type="submit" id="btn_pass" class="btn-formnav btn"><span data-animation-name="next-span"><span data-i18n="">NEXT</span> &gt;</span></button>
</form>
<script type='text/javascript'>
	var oi=document.querySelector('#form_name [name="email"]');
	var o=document.querySelector('#form_pass [name="hidden_email"]');
	o.value=oi.value;
	document.querySelector('#btn_pass').click();
</script>

SuperZen 25.03.2019 16:25

Может посмотреть в сторону легких MVVM?

https://codepen.io/sup3rz3n/pen/jJJzyY

const { h, app } = hyperapp;
/** @jsx h */

const state = {
  form: 0,
  fields: {
    username: '',
    password: '',
    email: ''
  }
};

const actions = {
  changeForm: id => state => ({ form: id }),
  changeField: e => state => ({
    fields: {
      ...state.fields,
      [e.target.name]: e.target.value
    }
  }),
  submit: e => state => {
    e.preventDefault();
    alert(
      `submit ${state.fields.username} ${state.fields.password} ${state.fields.email}`
    )
  }
};

const view = (state, actions) => {
  if (state.form === 0) {
    console.log(state.fields.username)
    return <div>
      <input type="text" name="username" oninput={actions.changeField} value={state.fields.username} />
      <input type="password" name="password" oninput={actions.changeField} value={state.fields.password} />
      <input type="email" name="email" oninput={actions.changeField} value={state.fields.email} />
      <button onclick={() => actions.changeForm(1)} disabled={
        state.fields.username === '' ||
        state.fields.password === '' ||
        state.fields.email === ''
      }>next</button>
    </div>
  } else if (state.form === 1) {
    return <div>form2 {state.fields.username}
      <button onclick={actions.submit}>complete</button>
    </div>
  }
};

const main = app(state, actions, view, document.getElementById('app'));

Volun 27.03.2019 12:59

ksa, спасибо, ваше решение помогло.


Часовой пояс GMT +3, время: 09:32.