• 締切済み

JSでactionを指定すると、IEforMacだとおかしくなる

同じFORM内にボタンが複数配置してあり、遷移先の振り分けを行うのに、javascriptで分岐させ、それぞれのactionを設定しています。 上記の方法で、なぜかIEforMacだけ動作がおかしくなります。その他のブラウザは問題ありません。 一度actionが実行されると、そのactionが実行されたFORM内のどのobjectをクリックしてもactionは実行されてしまうのです。 objectというのは、text項目やgif含めすべてです。 一番の問題はtextにカーソルを当てただけで、actionが実行されてしまうので入力ができないということです。 ただ、actionを実行したあと、リロードを行うと、この動作はクリアされるようです。 いろいろ調べた結果、FORMタグにactionを記述すると問題なく動作するのですが、JSでactionを指定すると、問題の動作になるようです。 これは、actionがFORM内にひとつしかなくても同じでした。 1つしかない場合は、FORM内に直に記述するように修正したのですが、どうしてもactionの振り分けが必要な部分があるので、困っています。 同じような経験をお持ちの方、どうぞご教授願います。

みんなの回答

  • taseki
  • ベストアンサー率66% (155/233)
回答No.5

情報が少ないので状況がちょっと解らないのですが、 少なくとも、私の環境で試したところ、何も問題はありませんでした。 やはり他の部分が原因、あるいは下にも書きましたがイベントバブルも確認してはどうでしょうか。

noriko1714
質問者

お礼

ありがとうございます。 MacのIE5.2なんですけど、同じ環境で起きないですか? 下の方が参考に掲載していただいたソースでも起きてしまいます。 私はもうIEのバグなんだと思い初めてるのですが・・・ 同じ環境で起きないとなるとやっぱり書き方なのでしょうか、でもなぜこのブラウザだけ問題なのでしょう。いつもMac環境のブラウザには悩まされます。

  • taseki
  • ベストアンサー率66% (155/233)
回答No.4

formの内容(formタグだけでなく <form> から </form> まで)と、イベントプロシージャだけでも掲載してもらえると状況が解ると思うのですが、 とりあえず質問文などから推測できる範囲では、イベントバブルと実行のタイミングに原因があるように思えます。 まず、「actionが実行される」と書かれていますが、実際のところactionは属性ですから実行されるものではありません。 ●formのaction属性を書き換える ●formをsubmitさせる の2つを混同していませんか? それと、ANo.1の捕捉欄に書かれているコードですが、上記2つの処理を続けて行っています。 もしこのコードをエレメントのイベントハンドラにバインドさせていたら、質問文にあるように、イベントが発生するたびにformがsubmitされてしまいます。どのエレメントにバインドさせていますか?(onclickを書いているタグ) また、form自体のイベントハンドラにバインドさせていたら、その中のエレメントのイベントが、そのままformのイベントプロシージャに渡され、それで、formの中のすべてが反応してしまっている、ということではないでしょうか。 また、そもそものご希望の動作が少々よく解らないのですが、 ・form内に複数のボタンがある ・各ボタンがクリックされた際に、それぞれ決められたURIにformをPOSTさせたい と理解していいでしょうか。 > actionがFORM内にひとつしかなくても同じでした。 上記については意味が解りませんでした…。 普通、1つのformには1つのactionしか書けないはずですが…。 いずれにしても、やはり情報が少なすぎますので、コードを掲載すれば回答が得られやすいと思います。

noriko1714
質問者

補足

すみません。まとめて皆様の意見、まとめて補足させていただきます。 FORM内にactionが1つまたは複数というのは、submitするボタンが1つか複数あると意味です。 1つのパターンとして、FORM内にPOPUP画面を表示させるボタンが複数あり、その入力値をOPENERに戻す。 POPUP画面を呼ぶのにopener側でsubmitさせてるのには、入力値をいったん保存させるために必要だからです。なので、ボタンによってactionを引数で渡しsubmitさせるfunctionを呼んでいます。イベントは各ボタンのonClick()です。 2つ目のパターンはFORM内にボタンが1つしかない場合ですが、上記と同じやり方で、ボタンのonClickでsubmitのfunctionを呼んでいます。この場合、actionは引数ではなく、直書きです。これはPOPUP画面ではなく、同画面での画面遷移です。 上記2パターンとも、FORMタグにactionを記述すると問題の動作が起こりません。 2つ目の場合は、振り分けの必要がないのでFORMタグにactionを記述する方法に変えました。 本日はソースが手元にないため掲載できませんが、明日にでも掲載したいと思います。 情報が少ないところ、いろいろ情報をいただきありがとうございます。

回答No.3

>FORM内のどのobjectをクリックしてもactionは実行されてしまう。 >actionがFORM内にひとつしかなくても同じでした。 上記の原因はわかりません。 inputのtypeはsubmitではなくbuttonとし、onClickの関数に引数を渡してあげるのがポイントかなと。 <script type="text/javascript"> function movePages($pnum) { if($pnum){ alert(document.form1.txt1.value); if($pnum==1){ document.form1.action = "new.html"; } else if($pnum==2){ document.form1.action = "new2.html"; } document.form1.target= "newPage"; document.form1.submit(); } } </script> <form method="POST" name="form1"> <!--このtextのonClickは実験です //--> <input type="text" name="txt1" onClick="javascript:movePages(1);return false"> <img src="a.bmp"> <input type="button" value="p1" onClick="javascript:movePages(1);return false"> <input type="button" value="p2" onClick="javascript:movePages(2);return false"> </form>

noriko1714
質問者

お礼

参考になるソースありがとうございます。 上記のソースをコピーして試してみましたが、やはり問題の現象が起きました。 p1のボタンを押下し、new.htmlが開いた後に、もとの画面のtxt1にカーソルを当てただけで、new.htmlが呼び出されてしまいます。 キャッシュをクリアしても同じで、もとの画面をリロードするまで現象は続きます。

noriko1714
質問者

補足

以下に画面内次ページに遷移するときのソースを記載します。 動作としては、いくつかの入力項目に入力し、ボタン押下でsubmit、javascriptで入力チェックを行い、OKであれば次画面へ遷移する。 問題の動作は次画面から、ブラウザの「戻る」ボタンで戻った時に起こり、入力項目にカーソルを当てると、次画面へ遷移してしまいます。 各入力項目は普通のtext項目でイベントなどの処理はありません。 <form method="post" name="frmEx" onSubmit="return setCond();" > --入力項目がいくつか入ります-- <input type="submit" value="登録する"> 同HTML内に以下のjavascriptを記述 function setCond(){ --いくつかの入力チェックが入ります   エラーの場合はreturn falseを戻す--  document.frmEx.method= "post";  document.frmEx.action = "nextPage.html";  document.frmEx.target="_self";  return true; } 皆様の返答にまとめて補足させていただいて済みません。よろしくお願いいします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>補足の内容からは、質問文の状況はよくわかりません。(フォーム内のテキストや画像をクリックしただけでsubmitされるとか、多分onclickを書いている場所が悪いのではないかと思うけど)が actionを設定したなら、問題が起こらないということであれば、 <form name="form1" action="~.html" …> とした上で、 document.form1.action="new.html"; の様に振り分け先をそれぞれ設定すればいいような気がします。

noriko1714
質問者

お礼

ありがとうございます。 formタグとjsのactionに同じ内容を記述し、試しましたが、だめでした。 jsの方をコメントアウトすればうまく行ったのですが。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Formの部分と、Scriptの部分を補足で挙げてもらえませんか?

noriko1714
質問者

補足

以下の処理は、POPUPでnewPageを作成し、そこに分岐で選択されたurlを表示させるというものです。 問題の動作はPOPUPや、画面遷移関係なく起こります。 以下の記述で実行すると問題が起こります。 <form method="post" name="form1" > document.form1.method= "post"; document.form1.action = "new.html"; document.form1.target= "newPage"; document.form1.submit(); 上記を以下に書き換えると問題が起こりません。 <form method="post" name="form1" action="new.html"> document.form1.method= "post"; document.form1.target= "newPage"; document.form1.submit(); よろしくお願いします。

関連するQ&A

  • 読み込み後発動するjsを他のjsに連携させたい

    javascriptを使ってiPhoneアプリを作っています。 サーバー側のmysqlと交信させるようにしているのですが、下記のように単純にpostすると、post後に表示されるのはサーバー側のhoge.ne.jp/usr_in.phpです。 【iphone側 index.html】 <script type="text/javascript" src="js/jquery.js"></script> <form name="form1" id="form1" method="POST" name="form1" action="https://hoge.ne.jp/usr_in.php"> <input type=“hidden” name="myname" value="" /> <input type="hidden" name="pass" value="" /> <button class="button8">購入</button> </form> そこで、下記のような【遷移JS】を用い、ボタンを押すと、サーバー側にpostしたあと、【iphone側のfinish.html】に遷移するようにしました。ここまではうまくいきました。 【遷移JS】 <script type="text/javascript" src="js/jquery.js"></script> <script> jQuery(function($) { $('#form1').submit(function(event) { // HTMLでの送信をキャンセル event.preventDefault(); // 操作対象のフォーム要素を取得 var $form = $(this); // 送信ボタンを取得 // (後で使う: 二重送信を防止する。) var $button = $form.find('button'); // 送信 $.ajax({ url: $form.attr('action'), type: $form.attr('method'), data: $form.serialize() + '&delay=1', // (デモ用に入力値をちょいと操作します) timeout: 10000, // 単位はミリ秒 // 送信前 beforeSend: function(xhr, settings) { // ボタンを無効化し、二重送信を防止 $button.attr('disabled', true); }, // 応答後 complete: function(xhr, textStatus) { // ボタンを有効化し、再送信を許可 $button.attr('disabled', false); }, // 通信成功時の処理 success: function(result, textStatus, xhr) { // 入力値を初期化 $form[0].reset(); // location.href = "finish.html"; // }, // 通信失敗時の処理 error: function(xhr, textStatus, error) { alert('購入できませんでした。再度お試しください'); } }); }); }); </script> <form name="form1" id="form1" method="POST" name="form1" action="https://hoge.ne.jp/usr_in.php"> <input type=“hidden” name="myname" value="" /> <input type="hidden" name="pass" value="" /> <button class="button8">登録</button> </form> 次に、このmysqlへの会員登録機能を自動化するために、読み込み後に自動的にsubmitされる【自動実行JS】を組み、<body onLoad="loadHello()"></body>で囲んだ後、<form></form>の最底辺に挿入しました。 【自動実行JS】 <SCRIPT language="JavaScript"> function loadHello(){ document.form1.submit(); } </script> 結果、自動登録機能は機能するのですが、サーバー側のhoge.ne.jp/usr_in.phpが表示されてしまい、【iphone側のfinish.html】に遷移してくれません。 bodyをloadした後、【自動実行JS】が実行された時に、【遷移JS】にトスされずにそのまま送信されてしまうようです。どこをどう修正すればいいかご教授願います。

  • jquery.validate.jsについて

    jqueryで入力チェックを行うプログラムを実装したく、「jquery.validate.js」を利用したいと思っているのですが、inputのnameが配列の場合、うまく動作しません。 ご存知の方、いらっしゃいましたら、ご教授いただけると幸いです。 以下に動作しないコードを貼り付けます。 尚、下記コードで「[]」を取り除いて実行すると正常に動作するため、nameに配列を指定するのが問題であると考えています。 どなたか、よろしくお願いいたします。 <form method="post" id="check_form1"> 名前 <input name="name[]" type="text" id="name"> メール <input name="mail[]" type="text" id="mail"> <input type="submit" name="Submit" value="Submit"/> </form> <!-- 入力チェック --> <script type="text/javascript" src="js/jquery.validate.js"></script> <script type="text/javascript"> $(function(){ $("#check_form1").validate({ rules: { name[] :{ required: true }, mail[] :{ required: true, email: true } }, messages: { name[] :{ required: "お名前を入力してください" }, mail[] :{ required: "メールアドレスを入力してください", email: "正しいメールアドレスを入力してください" } } }); }) </script>

  • scrollsmoothly.jsが動かない

    質問させていただきます。 下記のscrollsmoothly.jsを設定したいのですが、どうしても うまく動作しません。 http://d.hatena.ne.jp/KAZUMiX/20080418/scrollsmoothly ソースコードをDLして jsフォルダに入れました。 そして <head>~</head> の間に <script type="text/javascript" src="js/scrollsmoothly.js"></script> と記述しました。 そして <body> <div id="head"> ~ <a href="#head">topへ戻る</a> </body> と記述しました。 何か間違っていますでしょうか? よろしくお願いします。

  • js.ファイルの呼び込み

    http://village.infoweb.ne.jp/~tkiku/wsp/java/java39.html の万年カレンダーですが、このソースを外部ファイルとして「cal.js」と作成。HTMLのhed内に <script type="text/javascript" src="script/cal.js"></script>を記述。<body>内で <form><input type="button" value="カレンダ表示" onclick="dispkoyomi()"></form>とボタンで呼び出すには、またはテキストでの呼び出しはどのようにしたらいいのでしょうか?。

  • shadowbox.jsについて

    shadowbox.jsとslimbox.jsを併用したいと考えています。 もともとshadowbox.jsをPrototypeで使用し、HTMLを呼び出すのに使用していたのですが、 画像のライトボックス表示にslimbox.js(jquery使用)を使いたいと思い、 両方とも記述したらshadowboxの方が正常に動作しなくなりました。 何か解決策はありますでしょうか。 非常に困っています。お願いします。 ちなみに以下の様なコードをhead内に記述しております。 <script src="../../common/js/prototype.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="../../common/js/shadowbox/shadowbox.css"> <script src="../../common/js/shadowbox/shadowbox.js" type="text/javascript"></script> <script type="text/javascript">Shadowbox.init();</script> <link rel="stylesheet" type="text/css" href="shadowbox.css"> <script type="text/javascript" src="shadowbox.js"></script> <script type="text/javascript">Shadowbox.init();</script> </script> <link href="../../common/css/slimbox/slimbox.css" type="text/css" rel="stylesheet" media="screen" /> <script type="text/javascript" src="../../common/js/jquery.js"></script> <script type="text/javascript" src="../../common/js/slimbox.js"></script> <script type="text/javascript"> //slimbox $(document).ready(function() { $('a[rel*=lightbox]').slimbox(); }); </script>

    • ベストアンサー
    • CSS
  • h:commandButtonのアクション

    現在jsf Beanを使ったwebアプリを書いています。 h:commandoButtonで定義したテストボタンを押下後 ページのリロードを行うと 情報の再送信を求めるダイアログが表示されます。 ここで「はい」を選ぶとテストボタン押下の処理が再び勝手に走ります。 テストボタン押下前にはリロードしても何も動作はしません。 もしかして初歩的な所で間違っているかも知れませんが お気づきの点有りましたらお教え下さい。 以下がサンプルプログラムと動作時の流れです。 ◎test.jsp----------------------------------- <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> (中略) <body> <f:view> <h:form>  <h:commandButton action="#{test.action}" value="テスト"/></h:form> </f:view> </body> </html> ◎test.jsp----------------------------------- ※test は スコープをsessionで実装した管理Beanで下記 Test.java。 ◎Test.java----------------------------------- public class Test {  public Test(){  }  public String action() {   System.out.println("アクション");   return "action";  } } ◎Test.java ここまで ------------------------------------- ページ表示  ↓ テストボタン押下  ↓ アクションと表示  ↓ ページのリロードを行う  ↓ 情報の再送信を求めるダイアログで「はい」を選択  ↓ テストボタンを押していないのにアクションと表示される。 ページ表示  ↓ ページのリロードを行う  ↓ 情報の再送信を求めるダイアログで「はい」を選択  ↓ 異常なし

    • ベストアンサー
    • Java
  • form actionでmailtoを指定することについて

    Windows2000pro,IE6.0SP1+最新累積パッチです。 手元のHTML辞典に、 <form action="mailto:xxx@xxx.xxx"> <input type="text"> <input type="submit"> </form> とすることでcgiを使わなくてもHTMLだけでブラウザからメールが送れると書いてありました。 上記を入力したhtmlファイルをデスクトップ上に作成し、IEで開き、textboxに内容を記述してsubmitボタンを押しました。 まず警告ウィンドウが現れOKボタンを押すと、メールは送信されずに,OutlookExpressが起動してメール作成ウィンドウが表示され、あて先のところにmailtoで指定したものが設定されているだけで、本文には何も設定されていません。 少し調べてみると、どうやらこのform actionを使ったメールの送信はブラウザ等の環境によって左右されるらしく、推奨されていないそうですが、私の環境でうまくメールを送信するにはどうすればよいでしょうか? よろしくお願いします。 ちなみに公開ページにこのような記述をするのではなく、個人的な利用です。

    • ベストアンサー
    • HTML
  • 画像拡大機能のjsをスマホで読み込まない

    ホームページの画像拡大表示に、shadowbox.jsを使っています。 このような画像拡大機能を持つJavaScriptjsをスマホで読み込まないHTMLの書き方を教えてください。 <head>内に、以下のように記述しています。 <link type="text/css" href="../css/shadowbox.css" rel="stylesheet" media="all" /> <script type="text/javascript" src="../js/shadowbox.js"></script> <script type="text/javascript"> Shadowbox.init(); </script> PCでこのホームページを表示させた場合は問題無いのですが、スマホではshadowbox.jsを動作させたくありません。 そのための手法を教えてください。 PC・iPadで動作、スマホ(iPhone・Android)で動作させないの区分けで考えています。 または、shadowbox.jsと同じような画像拡大表示jsのケースでも、結構です。 以上、ソースで書いていただけると助かります。 よろしくお願いいたします。

  • JSP内で外部jsファイルを指定する

    昨日から散々悩んでいます。 tomcatのJSPから外部jsファイルが読み込めません。 最初htmlのみでテストしたのですが そのときは何の問題も無く動きました。 URLの指定の仕方かなと思いましたが、 cssのほうは同じ指定の仕方で効いています。 <!---------- JSP内容 ------------------------> <!-- [テスト]ボタン押下でscript実行 --> <html> <head> <title>テスト</title> <script Language='JavaScript'    type='text/javascript' charset="shift_jis" src='/Test/script/Script.js'> </script> <script language='JavaScript' type='text/javascript'> <!-- function test(){ jstest(); } function test1(){ alert("test1:OK"); } // --> </script> <link rel="stylesheet" href="/Test/css/Style_ver1.css" type="text/css"> </head> <body> <form> <input type='button' class="button" value='テスト' onclick="test()"> </form> </body> </html> <!---------- 外部js内容------------------------> function jstest(){ alert("jstest:OK"); } <!---------------------------------------------> onclick="test1()"にすると動きます。 以前に作られた別アプリケーションのJ2EEのソースを見ると、 src=<c:url とcoreタグが使用されています。 coreタグの使用なしにURLを書くことはできないのでしょうか? すいませんが、どなたか教えてください。 宜しくお願いします。

    • ベストアンサー
    • Java
  • suggest.jsに関する質問

    入力補完ライブラリのsuggest.jsを使って検索したいと思っています。 補完候補は表示できたのですが、その候補語で検索できません。 http://www.enjoyxstudy.com/javascript/suggest/ 下記フォームでは検索ボタンをクリックすればsearch.phpに移行しました。 <form method="POST" action="search.php"><input type="text" size="10" name="key"><input type="submit" value="検索"></form> しかしながら下記フォームだと検索ボタンをクリックしてもページ移動せず何も起こりません。 <form method="POST" action="search.php" onsubmit="return false;"><input id="text" type="text" name="key" autocomplete="off" size="10" style="display: block"><input type="submit" value="検索"><div id="suggest"></div></form> どこがおかしいのでしょうか?

専門家に質問してみよう