2012-02-08 10 views
3

CodeIgniterアプリケーションでjQueryを使用してフォームを送信したいと考えています。ただし、Controllerで呼び出された関数は、存在しないページ(Controller関数と同じ名前)にユーザーを送りたいと思っています。jQueryとCodeIgniterでページをリフレッシュせずにフォームを送信

私はこれを試してみました:

$('#contactForm').submit(function() { 

}); 

そして、これを:

$('#contactForm').submit(function() { 
    dataString = $("#contactForm").serialize(); 
    $.ajax({ 
     type:"POST", 
     url:"<?php echo base_url(); ?>about/contactSubmit", 
     data:dataString, 

     success:function (data) { 
      alert('test'); 
     } 

    }); 

    return false; //stop the actual form post !important! 
}); 

フォームにid "のContactForm" とシンプルなフォームです。 jQueryのsubmit関数は、コントローラ内の「contactSubmit」関数に移動するという点で機能します。この関数は、次のようになります。

public function contactSubmit() 
{ 

    $this->load->model('customer_model'); 
    $this->customer_model->addCustomer(); 
} 

だから、データベースに情報を追加してモデルにaddCustomer関数を呼び出します。すべてうまく動作します。しかし、存在しない "customerSubmit"ページを開こうとすると、それは私が避けたいものです。私はそれが同じページにとどまりたい、フォームにokが送信されたことをユーザーに伝えるためのjQuery関数があります。

どうすればいいですか?

EDIT:

コントローラの機能contactSubmitによって新しいページに送信されないための鍵は、私が見つけることができる対象のすべてのチュートリアルから判断し、提出するjQueryの機能でfalseを返すためにあるようだが、。私がそれを含むと、コントローラ関数はまったく呼び出されません。これは、上の最初のオプションだけが実際にController関数を呼び出していることを意味します(つまり、返り値falseを返すことはありません)。

だから私はここで間違って何をやっていますか?送信を使用してデータをデータベースに渡すことになっているのに、 "return false"が実際にコントローラの関数を呼び出すのを止めてしまったら?

EDIT 2: 答えを見つけました、Christophs投稿への私のコメントを参照してください!

+0

customerSubmitページを開こうと? – demalexx

+0

まあ、だれもしようとはしませんが、実際にはデータベースにデータを追加する関数を呼び出す必要があり、そうすると、その関数はコントローラ関数名に対応すると思われるページにその関数を渡します。そして、それは私が望んでいないものです... – Anders

+0

@AndersSvensson私はPHPに精通していませんが、あなたはこの答えを見てきましたか?[ここ](http://stackoverflow.com/questions/5098945/submit-external-form-ページ外サイトなし) – sinemetu1

答えて

6

ただの推測: event.preventDefault()を試して、<form action="...">(通常はフォームデータを送信し、何らかの種類の「要求を受け取った」ページに転送している)で定義されている送信アクションのデフォルト動作を停止してください。

コードは次のようなものになるだろう:

$('#contactForm').submit(function (event) { 
    dataString = $("#contactForm").serialize(); 
    $.ajax({ 
     type:"POST", 
     url:"<?php echo base_url(); ?>about/contactSubmit", 
     data:dataString, 

     success:function (data) { 
      alert('test'); 
     } 

    }); 
    event.preventDefault(); 
}); 
+0

残念なことに、戻り値falseと同じ効果があります。つまり、実際のデータベースの更新を行うには、その関数にアクセスする必要があるため、Controllerの関数がまったく呼び出されません。私はちょうどページを去りたくない...私はあなたが正しいと信じている、これはアヤックスの仕事の仕方だと思う。 event.preventDefaultを使用して、通常の送信を停止し、データをポストするだけです。しかし、関数が呼び出されていない、それは私が把握できないものです... – Anders

+0

あなたは確かに、コントローラが呼び出されていませんか?あなたのajaxデータの戻り値は何ですか?あなたはデータを投稿できますか?エラー関数とconsole.log(data)を追加して、何が起こるか見てみましょう。 – Christoph

+0

最後に、実際に私が答えを見つけたことを感謝します。これをチェックすると、私はURLが間違っていたのでそれが呼び出されていないことを認識させた情報を得ました。私は<?php echo base_url();?>を外部のjsファイルに入れましたが、動作しません。だから私はphpファイルでbase_urlのphp関数を使用できるようにjs変数を作成し、次にこのjs変数をajax関数で使用しました。その後、それは働いた!ありがとう、私は答えを見つけるために私を導くための恩恵をあなたに授けます。 – Anders

0

おそらくあなたは、JSは、任意のフォームオブジェクトを参照してくださいしないように、次のようにページロードイベントハンドラでそれを割り当てようと、ページがまだロードされていないsubmitハンドラを割り当てる:

$(function() { 
    $('#contactForm').submit(function() { 
     .... 
    }); 
}); 
+0

いいえ、それは問題ではない、私は重要な部分を示すためにその部分を残しました。前述したように、jQuery関数は、submitメソッドがフォームのaction属性でcontactSubmit関数を呼び出す限り機能します。問題はちょうどCodeIgniterがこのController関数と同じ名前のページを提供しようとしていて、ページを変更したくないということです。データベースにデータを渡す関数を呼び出すだけです... – Anders

関連する問題