<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<title>Password Modal with Finite State Machine</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<form id="app" class="ui-modal" data-state="idle" autocomplete="off">
<div class="ui-icon">
<div class="ui-lock"></div>
</div>
<div class="ui-title">This link is password-protected</div>
<div class="ui-subtitle">
<span data-show="idle validating">
Please enter the password to view this link.
</span>
<span data-show="error" class="ui-error">
Invalid password
</span>
<span data-show="success">
<a class="ui-link" href="https://davidkpiano.github.io/xstate" target="_blank">davidkpiano.github.io/xstate</a>
</span>
</div>
<div class="ui-password">
<input type="password" name="" id="" class="ui-password-input" placeholder="the password is password" />
</div>
<button class="ui-submit">Submit</button>
<button class="ui-reset" type="button" title="Reset"></button>
</form>
<script src='js/xstate.js'></script>
<script src="js/index.js"></script>
</body>
</html>
console.clear();
var elApp = document.querySelector('#app');
var elButton = document.querySelector('.ui-submit');
var elPassword = document.querySelector('.ui-password-input');
var elReset = document.querySelector('.ui-reset');
var externalState = {
password: ''
};
var actions = {
updatePassword: function updatePassword(xs, event) {
return {
password: event.value
};
},
validatePassword: function validatePassword(xs) {
setTimeout(function () {
if (xs.password === 'password') {
send('VALID');
} else {
send('INVALID');
}
}, 2000);
},
'after(2s) reset': function after2sReset() {
setTimeout(function () {
elPassword.value = '';
send('RESET');
}, 2000);
},
clearPassword: function clearPassword() {
elPassword.value = '';
return { password: '' };
}
};
var passwordMachine = xstate.Machine({
initial: 'idle',
states: {
idle: {
onEntry: ['clearPassword'],
on: {
SUBMIT: 'validating',
CHANGE: {
idle: { actions: ['updatePassword'], internal: true }
}
}
},
validating: {
onEntry: ['validatePassword'],
on: {
VALID: 'success',
INVALID: 'error'
}
},
error: {
onEntry: ['after(2s) reset']
},
success: {}
},
on: {
RESET: '.idle'
}
});
var state = passwordMachine.initialState;
function activate(state) {
elApp.dataset.state = state.value;
document.querySelectorAll('[data-active]').forEach(function (el) {
el.removeAttribute('data-active');
});
document.querySelectorAll('[data-show~="' + state.value + '"]').forEach(function (el) {
el.setAttribute('data-active', true);
});
}
activate(state);
function send(event) {
state = passwordMachine.transition(state, event);
state.actions.forEach(function (action) {
var actionFn = actions[action];
Object.assign(externalState, actionFn(externalState, event));
});
activate(state);
}
elButton.addEventListener('click', function () {
return send('SUBMIT');
});
elPassword.addEventListener('input', function (e) {
return send({ type: 'CHANGE', value: e.target.value });
});
elApp.addEventListener('submit', function (e) {
e.preventDefault();
send('SUBMIT');
});
elReset.addEventListener('click', function () {
return send('RESET');
});
你确定它不生成个配置文档
虎友高配版(绿色)
修改密码就是一楼说的:
至于跳转,判断一下有限状态机的当前状态:
@已重置,何必去学宝塔,index.php里做个判断,session一个值到客户端,没有显示html,有显示php
http://qianxun.ml
@已重置,这样不但能保护内容还能免去访客每次进入网站都要输入密码的尴尬
http://qianxun.ml
看不懂
我猜是改这个if (xs.password === 'password')
如果不是请问楼下大佬
http://qianxun.ml