• ベストアンサー

一つのページで二つのFormを別々に使いたい

<body> <form name="fm1"> <input type="hidden" value="1" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <form name="fm2"> <input type="hidden" value="2" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <div id="container">content</div> </body> </html> 上記のように同じ関数execute()を実行するのですが、受け渡す値がvalue="1" と value="2"と別々になっています。 素人考えではフォームfm1とfm2とは別々の値(1or2)を渡すと思ったのですが、どちらのボタンを押してもvalue="1"の結果となります。 二つのフォームを別々に動作させるにはどのようにすればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

id="page"が2つありますよ。 たとえば、こんな感じではないでしょうか。 1つめのフォーム <input type="hidden" value="1" name="page" id="page1"> 2つめのフォーム <input type="hidden" value="2" name="page" id="page2"> スクリプトの$F('page')の部分も、どちらのフォームの"page"をとるのか、明確に指定する必要があります。 1つめのフォーム <input type="button" value="送信する" onClick="execute(1)"> 2つめのフォーム <input type="button" value="送信する" onClick="execute(2)"> <script> function execute(id) { // 中略 paramList += "&page=" + $F('page'+id); // 後略 未検証です。 prototype.jsには詳しくないので適宜動作するように書き直してください。

mutsukiame
質問者

お礼

有難う御座います!! 1つ目のフォームと2つ目のフォームのidをご指摘どおり変更し、それぞれのonClickをexecute(1)と(2)に変更しました。 そして、 function execute(id) { // 中略 paramList += "&page=" + $F('page'+id); とidを追加記述したところ、無事二つのフォームが別々に動作しました。 二日ずっと悩んでいたことが解決しましたこと、大変感謝いたします。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

execute()の内容が提示されていないので、どうなっているのか不明ですが、勝手に想像するところ…  function execute(){   document.fm1.submit();  } とか、  documnet.form[0].submit(); みたいになっているだけではないのでしょうか? もし、他に処理を行っていないのならば、input buttonにしているものを、submitボタンに変えてしまえば、それぞれのformが送信されますし、スクリプトも不要になります。  <input type="submit" value="送信する"> スクリプトで他に処理を行っている場合は、executeの呼び出し側でexecute(this.form)のようにして、formを渡しておいて、  function execute(f){ f.submit(); } みたいにすれば、それぞれのformがsubmitされます。 (他の処理内容が不明なので、↑では省略しています。)

mutsukiame
質問者

補足

すみません。長くなるので関数部分を省きました。 念のため、全てを記述いたします。 <html> <head> <title>サンプル</title> </head> <script type="text/javascript" src="./prototype.js"></script> <script type="text/javascript"> function execute() { var url = './ItemSearch07.php'; var paramList = "sword=" + encodeURIComponent($F('txtWord')); paramList += "&sort_mode=1"; paramList += "&sort=" + $F('slctSort'); paramList += "&page=" + $F('page'); new Ajax.Request(url, { method: 'get', onSuccess: getData, onFailure: showErrMsg, parameters: paramList }); function getData(data){ var response = data.responseXML.getElementsByTagName('Responce'); var details = response[0].getElementsByTagName('Details'); var TotalItems = parseInt(response[0].getElementsByTagName('TotalItems')[0].firstChild.nodeValue); var TotalPages = parseInt(response[0].getElementsByTagName('TotalPages')[0].firstChild.nodeValue); var tmpHtml = ""; tmpHtml += "<p>総商品数:" + TotalItems + "<br />" tmpHtml += "総ページ数:" + TotalPages + "</p><br />" tmpHtml += "<table><tr>"; for(i = 1; i < TotalPages+1; i++){ //HTML作成 tmpHtml += "<td><form name='" + i + "'><input type='hidden' value='" + i + "' id='page'><input type='button' value='" + i + "' onClick='execute()'></form></td>"; } tmpHtml += "</tr></table>"; for(i = 0; i < details.length; i++){ //値を取得 var ProductName = details[i].getElementsByTagName('ProductName'); var ProductNameValue = ProductName[0].firstChild.nodeValue; var DetailURL = details[i].getElementsByTagName('DetailURL'); var DetailURLNameValue = DetailURL[0].firstChild.nodeValue; var Price = details[i].getElementsByTagName('Price'); var PriceNameValue = Price[0].firstChild.nodeValue; //HTML作成 tmpHtml += "<p>"; tmpHtml += "<a href='" + DetailURLNameValue + "' target='_blank'>" + ProductNameValue + "</a>&nbsp;&nbsp;:" + PriceNameValue + "円<br />"; tmpHtml += "</p>"; tmpHtml += "<hr />"; } //結果を表示 container.innerHTML = tmpHtml; } function showErrMsg(){ clearDisp(); container.innerHTML = "データを取得できませんでした。<br />\n"; } } </script> <body> <form name="fm1" id="fm1"> <input type="text" id="txtWord" size="30" value="PSP" /> ソート <select id="slctSort"> <option value="0" selected>価格順(昇順)</option> <option value="1">価格順(降順)</option> </select> <input type="hidden" value="1" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <form name="fm2" id="fm2"> <input type="text" id="txtWord" size="30" value="PSP" /> ソート <select id="slctSort"> <option value="0" selected>価格順(昇順)</option> <option value="1">価格順(降順)</option> </select> <input type="hidden" value="2" id="page"> <input type="button" value="送信する" onClick="execute()"> </form> <div id="container">content</div> </body> </html>

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

formは5個でも6個でも設定できるわ。 execute()関数の実装がおかしいために 発生している不具合でしょうね。 そのHTMLだけだと1も2も送信されないわ。

mutsukiame
質問者

補足

execute()関数ですが、長いのではしょってしまいましたが下記のようなものです。 value="1" or value="2"の値は"page"に反映させているつもりなのですが、ここがおかしい可能性が大きいみたいですね。 <script type="text/javascript" src="./prototype.js"></script> <script type="text/javascript"> function execute() { var url = './ItemSearch07.php'; var paramList = "sword=" + encodeURIComponent($F('txtWord')); paramList += "&sort_mode=1"; paramList += "&sort=" + $F('slctSort'); paramList += "&page=" + $F('page'); new Ajax.Request(url, { method: 'get', onSuccess: getData, onFailure: showErrMsg, parameters: paramList }); function getData(data){ var response = data.responseXML.getElementsByTagName('Responce'); var details = response[0].getElementsByTagName('Details'); var TotalItems = parseInt(response[0].getElementsByTagName('TotalItems')[0].firstChild.nodeValue); var TotalPages = parseInt(response[0].getElementsByTagName('TotalPages')[0].firstChild.nodeValue); var tmpHtml = ""; tmpHtml += "<p>総商品数:" + TotalItems + "<br />" tmpHtml += "総ページ数:" + TotalPages + "</p><br />" tmpHtml += "<table><tr>"; tmpHtml += "</tr></table>"; for(i = 0; i < details.length; i++){ //値を取得 var ProductName = details[i].getElementsByTagName('ProductName'); var ProductNameValue = ProductName[0].firstChild.nodeValue; var DetailURL = details[i].getElementsByTagName('DetailURL'); var DetailURLNameValue = DetailURL[0].firstChild.nodeValue; var Price = details[i].getElementsByTagName('Price'); var PriceNameValue = Price[0].firstChild.nodeValue; //HTML作成 tmpHtml += "<p>"; tmpHtml += "<a href='" + DetailURLNameValue + "' target='_blank'>" + ProductNameValue + "</a>&nbsp;&nbsp;:" + PriceNameValue + "円<br />"; tmpHtml += "</p>"; tmpHtml += "<hr />"; } //結果を表示 container.innerHTML = tmpHtml; } function showErrMsg(){ clearDisp(); container.innerHTML = "データを取得できませんでした。<br />\n"; } } </script>

関連するQ&A

専門家に質問してみよう