2016-10-23 7 views
3

私はFormDataに問題があります。数日前に動作していましたが、動作しません。送信ボタン以外のすべての入力を送信します。ここに私のログインフォームがあります。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 for login、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:通常のフォーム送信では、送信ボタンの名前と値は、そのボタンが送信を引き起こすために使用された場合はフォームとともに送信されます。たとえば、4つの異なる送信ボタンを持つフォームがあり、すべてが名前が 'btn'であり、それぞれが異なる値を持ち、ボタンを使用してフォームを送信すると、データは' btn = the-valueその中に「クリックされたボタン」が表示されます。 –

答えて

1

あなたが実際に(代わりに、あなたは、AJAXをやっている)を提出デフォルトを使用していないので、あなたがクリックされたボタンを自分で追加する必要があります。これを行う1つの簡単な方法は、このクリックハンドラーを使用すると、ボタンを持たせたい名前を使用して、フォームに隠し入力を追加し、フォームの使用中のすべてのボタンを持つことです。

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

そうすれば、ボタンを使用してフォームを送信した場合、ボタンのハンドラは非表示入力の値をsubmitよりも前に設定します。

関連する問題