お世話になります。
JavaScript初心者になります。
HTML上で、同じ処理をしたいものに、同じクラス名(notOnClick1st)をつけて、
Javascriptで動かそうとしても、動きません。
どこが悪いのでしょうか?
●ボックスに何の文字も入っていない時、あるボタン(下記のコードだと、4と8)を押せないようにしたい。
●setResult を HTML上で<body onLoad="setResult()">で読み込んでいるのですが、Uncaught ReferenceError: setResult is not defined (見つからない変数)というエラー出る。
●クラス名の取得だと、配列処理をしないといけないので、全部書くのが面倒なのでしたくない。(私の知識不足で、いい方法があるのかもしれませんが_ _;)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>test</title></head>
<body onLoad="setResult()">
<div id="wrap">
<table>
<tr>
<td colspan="4" class="white">
<input type="text" id="result">
</td>
</tr>
<tr>
<td>
<input type="button" value="1" onclick="edit(this)">
</td>
<td>
<input type="button" value="2" onclick="edit(this)">
</td>
<td>
<input type="button" value="3" onclick="edit(this)">
</td>
<td>
<input type="button" id="divide" class="notOnClick1st" value="4" onclick="edit(this)">
</td>
</tr>
<tr>
<td>
<input type="button" value="5" onclick="edit(this)">
</td>
<td>
<input type="button" value="6" onclick="edit(this)">
</td>
<td>
<input type="button" value="7" onclick="edit(this)">
</td>
<td>
<input type="button" id="divide" class="notOnClick1st" value="8" onclick="edit(this)">
</td>
</tr>
</table>
</div>
<script>
let result = document.getElementById("result");
function edit(elem) {
result.value = result.value + elem.value;
}
let notOnClick1stClass = document.querySelectorAll('.notOnClick1st');
notOnClick1stClass.forEach(function setResult(v) {
v = "";
if(v == "") {
notOnClick1stClass.disabled = true;
}else{
notOnClick1stClass.disabled = false;
}}
);
</script>
</body>
</html>
どなたかご教授いただければ幸いです。
No.3ベストアンサー
- 回答日時:
/** 現在の値の入力要素. */
var result = document.querySelector(対象);
/** ページをあるべき姿に更新. */
function updatePage(){
_ var x = (result.value == "");
_ document.querySelectorAll(対象).forEach(v=>v.disabled = x);
}
window.onload = updatePage; // 初期化
/** 現在の値を書き換え. */
function setResult(v){
_ result.value = String(v);
_ updatePage(); // 書き換えたから更新
}
/** 押しボタンで、現在の値に加算. */
function edit(elem) {
_ var r = parseFloat(result.value);
_ var a = parseFloat(elem.value);
_ setResult(r+a); // 書き換えは専門の処理で
}
ご回答いただきありがとうございました。
お礼が遅くなり、申し訳ございません。
コードまで書いていただき、ありがとうございます!
(説明付きでとても嬉しいです)
jsをそのまま書き換えたのですが、
>_ var x =
アンダースコア(プライベート関数というもので間違いないですか)があると、「;」がないと言われてエラーになったので、削除してみたせいなのか、
他の数字を押すと、4の数字がどんどん足し算されていきました。
どこかしら、変更が必要ということですよね。
もう少し、元に試行錯誤してみます。
No.2
- 回答日時:
<script>
document.addEventListener('click', (e)=>{
const result = document.getElementById("result");
if([...document.querySelectorAll('[type=button]')].includes(e.target)){
if(result.value!=="" || ![...document.querySelectorAll('.notOnClick1st')].includes(e.target)){
result.value+=e.target.value;
}
}
});
</script>
<div id="wrap">
<table>
<tr>
<td colspan="4" class="white">
<input type="text" id="result">
</td>
</tr>
<tr>
<td><input type="button" value="1" ></td>
<td><input type="button" value="2" ></td>
<td><input type="button" value="3" ></td>
<td><input type="button" class="notOnClick1st" value="4"></td>
</tr>
<tr>
<td><input type="button" value="5"></td>
<td><input type="button" value="6"></td>
<td><input type="button" value="7"></td>
<td><input type="button" class="notOnClick1st" value="8"></td>
</tr>
</table>
</div>
ご回答いただきありがとうございました。
お礼が遅くなり、申し訳ございません。
コードまで書いていただき、ありがとうございます!
できました!
…が、抜き出していないHTMLとJSに反映させると、その他が意図しない動作になりました _ _;。
私が実際に書いているのは計算機で、4は「=」に相当させていたので、1+3=(4)と押すと「4=」と必要のない「=」が最後に出てしまいます。
ちなみに、
if([...document.querySelectorAll('[type=button]')].includes(e.target)){
のdocument.query〜の前の [... はどういう意味ですか?
調べた方が悪いのか、何を示しているか分からなくて…。
お時間ございます時に、またご教授願えれば幸いです。
No.1
- 回答日時:
こんにちは
>●setResult を HTML上で<body onLoad="setResult()">で読み込んで
>いるのですが、Uncaught ReferenceError: setResult is not defined
>(見つからない変数)というエラー出る。
メッセージの通りで、ご提示の関数定義方法だと関数名がスコープ内に無いため参照できないという意味です。
普通に、
function setResult() { ~~ }
あるいは
setResult = fnction() { ~~ }
のように定義しておけば、参照可能になるはずです。
>●クラス名の取得だと、配列処理をしないといけないので、全部書くのが
>面倒なのでしたくない。(私の知識不足で、いい方法があるのかもしれませんが
意味がよくわかりません。
通常は、個別に書くのが面倒なので、配列処理(あるいはリスト処理等)を行うものと認識していますが??
>●ボックスに何の文字も入っていない時、あるボタン(下記のコードだと、
>4と8)を押せないようにしたい。
onloadで処理しても良いですし、直接スクリプトタグ内で実行しても良いですが、例えば、
let notOnClick1stClass = document.querySelectorAll('.notOnClick1st');
notOnClick1stClass.forEach( e =>{ e.disabled = 'disabled'; });
などとしておくことで、初期設定としてdisabledを設定することが可能です。
(解除しない限り、入力できない状態のままになります。)
ご回答いただきありがとうございました。
お礼が遅くなり、申し訳ございません。
>function setResult() { ~~ }
私もそうかな、と思って(v)を取ったのですが、これだと、エラーになるんです。後ろのif文用に(v)を使っているから?
>●クラス名の取得だと、配列処理をしないといけないので〜
たぶん、私の知識が足りないのだと思います。
let notOnClick1st = document.getElementsByClassName("notOnClick1st")[0];
function setResult(v) {
v = "";
if(v == "") {
notOnClick1st.disabled = true;
}else{
notOnClick1st.disabled = false;
}}
で書くと、動くには動くのですが、[0]があるので、当然1つ目のものにしか効かないのです。[0]を取ると動きません…。
>onloadで処理しても良いですし、直接スクリプトタグ内で実行しても良いですが、例えば、let notOnClick1stClass = document.querySelectorAll('.notOnClick1st');
notOnClick1stClass.forEach( e =>{ e.disabled = 'disabled'; });
この解除がifなのかと思ったのですが、if文書き込んでみると、動かなくなるのです。
他に方法があるのですよね、きっと。
もう少し、試行錯誤してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画面表示とともにtableの指定の...
-
チェックボックス付きのテーブ...
-
innerHTMLで自動生成された表を...
-
文字数を数える際に空白、改行...
-
テーブル内のチェックボックス...
-
ボタンクリックでフォーカス移動
-
tableの各セルに同じ関数を対応...
-
ラジオボタンが選択されたらテ...
-
複数のselect値で1つも選択され...
-
ラジオボタンを一括で操作する...
-
テキストから要素を抜き出して...
-
return trueとreturn falseの用...
-
【jQuery】input nameの文字列...
-
現在時刻を取得してフォームのs...
-
tableの任意行にfocusをあてる
-
Selectボックスの幅を自動で広...
-
セレクトを全て選択されていな...
-
value内に変数を入れたい
-
ハイパーリンクを別ウインドウ...
-
一覧から選択した行の行番号を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
チェックボックス付きのテーブ...
-
JavaScriptの「.querySelectorA...
-
ラジオボタンとテキストボック...
-
画面表示とともにtableの指定の...
-
テーブル内のチェックボックス...
-
クリックしたラジオボタンの行...
-
ラジオボタンが選択されたらテ...
-
VBSでの自動ログイン
-
formで項目を連結したい
-
文字数を数える際に空白、改行...
-
Formのシリアライズができない
-
localStorageでのcheckbox制御
-
innerHTMLで自動生成された表を...
-
【緊急】リアルタイムでエラー...
-
DOM追加時に表示されるが自動削...
-
繰り返し処理途中にJavaScript...
-
チェックボックスのチェック結...
-
フォントをまとめて<h5>にでき...
-
Javascriptの電卓で最初の何も...
-
JavaScriptで、コピーボタンを...
おすすめ情報
できました。
いただいた回答を元に、自分なりに色々調べて、手を加えさせていただいて、ようやく、思っていたものが出来上がりました(文字オーバーで、コードがここに載せられないのが残念です)。
みなさま、ありがとうございました。