この関数は、渡された引数がそれぞれのイベントのイベント ハンドラーであることsubmit
に非常によく似ています。click
したがって、クリックイベントの場合、正しく釘付けになっているように見えますが、そのイベントハンドラー内で行うことは、イベントハンドラーを form.submit イベントにアタッチすることだけです。そのイベントをトリガーしません。
コードと質問を見ると、ボタンのクリック時にフォームを送信したいようです。もしそうなら、あなたのコードを以下に変更することができます
if ($jq(".ie")) {
$jq('#searchFormHeader').submit(function () {
alert('Handler for .submit() called.');
return false;
});
$jq(".site-search-input").click(function () {
alert("clicked");
$jq('#searchFormHeader').submit();
});
}
イベント ハンドラーをクリック イベントの外に移動して、同じ関数をイベント ハンドラーとして何度も (ボタンがクリックされるたびに) アタッチすることを回避しました。これにより、ボタンを複数回クリックした場合に、毎回イベント ハンドラーを送信イベントにアタッチする必要がなくなります。
EDIT
入力値が送信されないという問題には、3つのオプションがあります
- IE8 をサポートする場合は、入力をフォーム内に移動します。これは私の好みのオプションであり、単純で問題全体を排除します。
- submit を使用せず、$.post を使用してポストバックします
- 入力要素を複製してフォームに追加し、送信後に再度削除します。これはハックだと思います
ポストバックしたい場合は、このようなことができます
var form,formId,data,url,id,
submit = function () {
//find the form of whatever activated the submitting
form = $(this).closest("form");
formId = form.attr('id');
//iterate all related input fields and collect the data
//note selects, textareas and checkbox/radiobuttons
//needs attention if those are also possible
data = {};
$jq("input[form="+formId + "]").each(function(){
id = this.attr('name') ? this.attr('name') : this.attr('id');
data[id] = this.val();
});
//find the url to post to
url = form.attr('action') ? form.attr('action') : windows.location;
//post the data to the server
//using your original submit event handler as callback
$jq.post(url,data,function () {
alert('Handler for .submit() called.');
});
return false;
}
//make sure they all have a form attribut
$jq("input").each(function(){
if(!this.attr('form')){
formId = this.closest("form").attr('id');
this.attr('form',formId);
}
}
//attach click event handler to the button
$jq(".site-search-input").click(submit.call(this))
.closest("form")
.submit(submit.call(this));