[英]FormData doesn't include the button Javascript
我在使用FormData
遇到問題,幾天前它正在工作,但現在不起作用,它提交了除提交按鈕之外的所有輸入。 這是我的登錄表單。
<form action="" method="post" name="login_user">
<label for="username">Username/e-mail <span class="error" id="user-error"></span></label>
<input type="text" name="username" id="username" required>
<br>
<label for="passwd">Password <span class="error" id="passwd-error"></span></label>
<input type="password" name="passwd" id="passwd" required>
<br>
<p><input type="checkbox" checked name="remember"> Remember me <span class="forgot"><a href="<?php echo SITE_URL; ?>/reset">Forgotten password</a></span> </p>
<input type="submit" id="login" value="Login" name="login">
<p>Don't have an account? <a href="<?php echo SITE_URL; ?>/register/">Sign up</a></p>
</form>
JS登錄,使用MVC。
//ajax login
var login = document.forms.namedItem('login_user');
if (login) {
login.addEventListener('submit', function (e) {
if (validatePassword('passwd', 'passwd-error')) {
var data = new FormData(login);
var userlogin = new XMLHttpRequest();
var btn = document.getElementById('login');
btn.value = 'Login, Please wait...';
userlogin.open('POST', url + 'login/login_user_ajax', true);
userlogin.onload = function (event) {
if (userlogin.status == 200) {
var result = JSON.parse(userlogin.responseText);
if (result.results == 'success.') {
alert('logged in'); //change this later
} else {
document.getElementById('cred-error').innerHTML = result.results;
}
btn.value = 'Login';
}
};
userlogin.send(data);
}
e.preventDefault();
}, false);
我的控制器中的登錄方法,未檢測到按鈕。
public function login_user_ajax() {
$this->login_user(1);
}
private function login_user($ajax = '')
{
if (filter_has_var(INPUT_POST, 'login')) {
$new_user = $this->model('User');
$new_user->setDb(Controller::getDb());
$new_user->set_site(SITE_URL);
$user = trim(filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING));
$passwd = trim(filter_input(INPUT_POST, 'passwd', FILTER_SANITIZE_STRING));
if ($new_user->login($user, $passwd)) {
if ($ajax) {
$site_data['results'] = 'success.';
echo json_encode($site_data);
return true;
}else {
$this->redirect(SITE_URL . '/edit');
}
} else {
if (!$ajax){
return 'The username or password is incorrect.';
}else {
$site_data['results'] = 'The username or password is incorrect.';
echo json_encode($site_data);
return false;
}
}
}else {
print_r($_POST);
}
}
當我沒有按鈕print_r
$_POST
,我得到了這個。
因為您實際上並未使用默認提交(而是使用 ajax),所以您需要自己添加單擊的按鈕。 一種簡單的方法是使用您希望按鈕具有的名稱向表單添加一個隱藏輸入,然后讓表單中的所有按鈕使用此單擊處理程序:
function clickHandler() {
this.form.theHiddenInput.value = this.value;
}
這樣,如果使用按鈕提交表單,則按鈕的處理程序會在submit
之前設置隱藏輸入的值。
我使用<button>
元素構建的 SwitchToggle 組件也有類似的問題。 即使該元素有一個name
它在提交表單時也不包含在我的FormData
。
我最終在標記中添加了一個視覺隱藏的<input type="checkbox">
,其name
和value
屬性與 SwitchToggle 組件相同。 除了顯示在FormData
之外,此輸入什么都不做(它不可點擊且不可見)。 此示例在 React 中,但該方法適用於所有框架或普通 JavaScript。
const SwitchToggle = (props) => {
const { id, name, className } = props;
const [enabled, setIsEnabled] = React.useState(props.enabled);
return (
<>
<input
style={{opacity: 0.05}}
name={name}
checked={enabled}
type={"checkbox"}
/>
<button
className={`switch-toggle ${enabled ? 'on' : 'off'}`}
onClick={(e) => {
e.preventDefault();
setIsEnabled(!enabled);
}}
/>
</>
);
};
由於我的組件是開/關,我使用了復選框輸入,但您也可以使用帶有字符串值的文本輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.