2016-10-23 69 views
3

我在FormData有問題,它在幾天前工作,但現在它不起作用,它提交除提交按鈕之外的所有輸入。這是我的登錄表單。FormData不包括按鈕Javascript

<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 for login,uses 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,沒有按鈕。

enter image description here

+0

這就是它應該如何工作,提交按鈕沒有提交? – adeneo

+0

@adeneo但它工作。 – julekgwa

+0

@adeneo:通過正常的表單提交,如果該按鈕用於提交,則提交按鈕的名稱和值將與表單一起發送。例如,如果你有一個帶有四個不同提交按鈕的表單,所有的名稱都是'btn',並且每個都有不同的值,如果你使用一個按鈕來提交表單,數據將會有'btn = the-value點擊按鈕「。 –

回答

1

因爲你沒有實際使用默認的提交(而不是你做的AJAX),你需要自己添加點擊的按鈕。一個簡單的方法做,這是一個隱藏的輸入添加到您的形式你想要的按鈕有名字,然後讓所有的按鈕形式使用該單擊處理:

function clickHandler() { 
    this.form.theHiddenInput.value = this.value; 
} 

這樣,如果使用了一個按鈕來提交表單,那麼按鈕的處理程序將設置隱藏輸入的值,即submit之前的值。