質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

754閲覧

最初のイベントがうまく拾えない

Otazoman

総合スコア44

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/06/28 02:57

編集2018/06/28 04:36

前提・実現したいこと

ボタンをクリックした際に、チェックボックスにチェックを付けて
そのままフォーム送信するという処理を行いたいと考えております。

発生している問題・エラーメッセージ

最初の1回目でonclickに設定されているイベントが
拾えません。2回目以降は正常に拾えます。
どうすれば最初の1回目もきちんとイベントを拾えるでしょうか。

該当のソースコード

JavaScript

1<script type="text/javascript"> 2 //チェックボックス 3 function clickCheckBox(){ 4 var clickButton = document.getElementsByName('aButton'); 5 var checkedBox = document.getElementsByName('pitem[]') 6 7 for(var i = 0 ; i < clickButton.length ; i++){ 8 clickButton[i].onclick = (function(ix){ 9 return function(){ 10 console.log(ix); 11 checkedBox[ix].checked=true; 12 }; 13 })(i); 14 } 15 } 16 //Submit 17 function goSubmmit(){ 18 console.log("do!!"); 19 externalfunc();  //外部jsの処理 20 var target = document.getElementById("form1"); 21 target.method = "post"; 22 target.action = "/scripts/hoge.php" 23 return false; 24 } 25</script>

外部のjsになります。別の方が作成したもので、私の方では
修正が禁じられています。

Javascript

1var base_path = '/cart/'; 2 3function externalfunc() 4{ 5 var chkCount = $("[name='item[]']:checked").length; 6 // validate 7 if (chkCount < 1) { 8 alert('選択されていません。'); 9 return false; 10 } 11 $("[name='pitem[]']:checked").each(function(){ 12 codes.push($(this).val()); 13 }); 14 15 var url = location.href; 16 if (debug) { 17 console.log('url: ' + url); 18 } 19 $.ajax({ 20 url: base_path + 'hoge.php', 21 type: 'POST', 22 data: { 23 "action": "addItem", 24 "item[]": codes, 25 "url": url 26 }, 27 dataType: 'json', 28 timeout: ajax_timeout, 29 }).done(function(cartArray, textStatus, jqXHR) { 30 if (debug) { 31 console.log('status: ' + jqXHR.status + ' ' + textStatus); 32 console.log(cartArray); 33 } 34 showModal(cartArray, 'addItem'); 35 }).fail(function(jqXHR, textStatus, errorThrown) { 36 console.log('status: ' + jqXHR.status + ' ' + textStatus + ' ' + errorThrown); 37 console.log(); 38 alert(jqXHR.status + ' ' + errorThrown); 39 }).always(function() {}); 40 return false; 41}

HTML

1<form id="form1" action="#" onsubmit="return goSubmmit();"> 2 <label><input type="checkbox" class="checkbox" name="pitem[]" value="aaa" /></label> 3 <input id="submitbtn" type="image" src="/img/abutton.png" name="aButton" onclick="clickCheckBox();" value="Added"> 4 <label><input type="checkbox" class="checkbox" name="pitem[]" value="aaa" /></label> 5 <input id="submitbtn" type="image" src="/img/abutton.png" name="aButton" onclick="clickCheckBox();" value="Added"> 6 <label><input type="checkbox" class="checkbox" name="pitem[]" value="aaa" /></label> 7 <input id="submitbtn" type="image" src="/img/abutton.png" name="aButton" onclick="clickCheckBox();" value="Added"> 8</form>

試したこと

下記も試してみましたがダメでした。
window.onload=clickCheckBox();

最初の1回目のボタンクリック時にチェックが入りません。
2回目以降ではボタンクリックした際にチェックボックスにチェックが
入り外部js処理後にhoge.phpが動きます。

補足情報(FW/ツールのバージョンなど)

制約があってjqueryは使えず、通常のJavascriptで
解決しないといけません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/28 02:59

なぜわざわざボタンクリックを挟むのでしょうか。goSubmmit()でいきなりretrun falseしたりしていますが、何か分岐が入っているのでは?実際のコードを提示してください。
Otazoman

2018/06/28 04:04

画面遷移させたくないので、return false;が正しいです。 分岐は特にございません。
m.ts10806

2018/06/28 04:07 編集

私が言っているのは編集前のコードのreturn falseの位置です。「いきなり」としています。return falseの後にも処理がつづいてたので何がしたいのか分からなかったというところです。 ところで、「なぜわざわざボタンクリックを挟むのでしょうか」はどうでしょうか?「実際のコードを提示してください。」についても本当に「外部jsの処理;」と書いてあるわけではないですよね。
Otazoman

2018/06/28 04:17

ボタンクリックを挟むのは外部jsで、チェックボックスにチェックが入っていないとパラメータを引いてこれないという制約がありどうしてもボタンをクリックしてチェックをさせるという必要があるからです。
m.ts10806

2018/06/28 04:21

その外部js(externalfunc()?)で何をしているかの提示は可能でしょうか。コードを提示していただくのが一番ですが、場合により今回うまくいかない原因になっている可能性もあります。それも見なければわかりませんので。
Otazoman

2018/06/28 04:42 編集

外部jsのコードです。提示した箇所が受取って処理をしている箇所で そのほかは別のウィンドウの処理関連の模様です。
m.ts10806

2018/06/28 04:44

(回答とは直接は関係ありません)差し支えなければ教えていただきたいのですが、外部jsでjQuery記述が使われていて自身の対応にてjQuery記述が使えないのはなぜでしょう?課題か何かなのでしょうか。
Otazoman

2018/06/28 04:50

修正しようとしているページがSSI構成になっています。自分の編集しているページのみでボタン制御を行うので極力自分html内で完結してほしいとのことでjQueryを使えないと考えてのことです。解決できるならそちらでもいいと思うのですが
退会済みユーザー

退会済みユーザー

2018/06/28 05:17

お前ら、日本がポーランド戦に勝てるのか!?
guest

回答4

0

ベストアンサー

clickCheckBox()はクリック時に呼ぶものではないように見えます。
ロード時に呼んでみてはどうでしょうか?

投稿2018/06/28 05:05

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/06/28 05:19

ありがとうございます。おっしゃってる方法で解決できました。
guest

0

オラよ

js

1document.addEventListener('DOMContentLoaded', function() { 2 3 var clickButton = document.getElementsByName('aButton'); 4 var checkedBox = document.getElementsByName('pitem[]'); 5 6 for(var i = 0 ; i < clickButton.length ; i++){ 7 clickButton[i].onclick = (function(ix){ 8 return function(){ 9 console.log(ix); 10 checkedBox[ix].checked=true; 11 }; 12 })(i); 13 } 14 15});

html

1<form id="form1" action="#" onsubmit="return goSubmmit();"> 2 <label><input type="checkbox" class="checkbox" name="pitem[]" value="aaa" /></label> 3 <input id="submitbtn" type="image" src="https://ssl.gstatic.com/onebox/media/sports/logos/yJF9xqmUGenD8108FJbg9A_48x48.png" name="aButton" onclick="return false;" value="Added"> 4~~~

HTML側のaButtonにonclickイベントハンドラが設定されてるのに
さらにjs側でonclickイベントが設定されてるというw
クソコードだから掃除しといたぞ

てか今日のワールドカップさ、ポーランドに日本負けるべ

投稿2018/06/28 05:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Otazoman

2018/06/28 05:19

ありがとうございます。
guest

0

type=imageでサブミットする場合動作が安定しないかもしれません
imageの座標を必要としないならimgタグとlabelで処理するほうがよいでしょう。

投稿2018/06/28 03:55

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

x_xさんのアドバイスの方法です。

JavaScript

1script src="/cart/js/cart.js"></script> 2<script type="text/javascript"> 3 //Checkbox 4 window.onload = function clickCheckBox(){ 5 var clickButton = document.getElementsByName('submit_siryo'); 6 var checkedBox = document.getElementsByName('item[]') 7 8 for(var i = 0 ; i < clickButton.length ; i++){ 9 clickButton[i].onclick = (function(index){ 10 return function(){ 11 checkedBox[index].checked=true; 12 }; 13 })(i); 14 } 15 } 16 //Submit 17 function cartSubmmit(){ 18 19 console.log("パラメータです"); 20 addItem(); 21 var target = document.getElementById("siryo"); 22 target.method = "post"; 23 target.action = "https://hoge/aaa/check.php" 24 return false; 25 26 } 27</script>

投稿2018/06/28 05:21

編集2018/07/17 08:46
Otazoman

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問