
画像のように2回同じように打つとアラートを出すようなプログラミングを作ろうとしてます。
let Exist = new Array();
while(true){
let msg = "";
let inp = inputs;
console.log(inp)
if(Exist[inp]){
msg = inp+"は既に存在します";
}else{
msg = inp+"は存在しないのでExistに登録します";
Exist[inp] = true; // false; //
}
alert(msg);
}
inputsにテキストの要素を入れています。2回同じことを打つと
if(Exist[inp]){
msg = inp+"は既に存在します";
}
のイベントを起こしたいのですが今のままだと1回目で
if(Exist[inp]){
msg = inp+"は既に存在します";
}
のイベントが起きてしまいます。
どうすれば2回目以降でこのイベントを発生できるかを教えてください。
サンプルコードでいいのでよろしくお願いします。

No.13ベストアンサー
- 回答日時:
No10です。
No11さん、ありがとうございました。
わたしも最初、他の回答者さんへのコメントはいいのか迷いましたが、
https://blog.goo.ne.jp/oshietegoo/e/8b3c38e5134b …
ガイドライン上は、
>質問者の疑問や問題の解決に寄与するようなものではない、他の回答者へ向けたコメント。
がダメであり、
No2のサンプルコードから、No10へ
ブラッシュアップしていただいたおかげで、
最終的に質問者さんの解決に寄与するものとなり、
ガイドラインに適合すると考えます。
質問者さんの
>どうすれば2回目以降でこのイベントを発生できるか
への回答は、要点としては、
・focusout発火のイベントを、inputではなく、documentに追加する
・比較したい値を配列に格納する
・上記配列を、some関数で、e.target.valueの値と照合する
・自分自身と照合しないために、事前に自分だけは空にしておく
といった感じになるのではと思います。
わたしの当初の回答では不備があったと思いますが、
今回は知らない用語や、関数、バブリングフェーズなど、
大変勉強になりました。
No11さん、ありがとうございました。
No.12
- 回答日時:
#質問者置き去りな者です
Inputs.filter (f=> e != f).map (e => e.value)
--
const は除いて1行で!?
document.addEventListener ('focusout', ({target: e}, V)=>
Inputs.includes (e) && (
e.value = isNaN (V = parseInt (e.value, 10) + '')
? ''
: (Inputs.filter (f=> e != f).map (e => e.value).some ( v => v == V) && (
alert (V + 'はすでに存在します'),
e.focus ()
), V)
)
);
No.11
- 回答日時:
#質問者置き去りな者です
人間が入力するであろうデータには、チェックが必要です。
(数値の後に空白文字とか・・・)
それにしても素晴らしいですね!相当できる方なのですね。
失礼しました。
({target: e})=> {
・・・
}
次はショートコーディングでもいかがですか?(w)
No.10
- 回答日時:
No6です。
No7-9さん、ありがとうございます。
こんな感じでどうでしょう。
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" /><br />
<a href="#">ダミーアンカー</a><br />
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" />
<script>
const Inputs = [...document.querySelectorAll('input[name="inputs"]')];
document.addEventListener('focusout', (e) => {
let val = e.target.value;
let isNotTarget = !(Inputs.includes(e.target));
let isBlank = (val === '');
if (isNotTarget || isBlank) { return };
if (isNaN(val)) {
// 数字以外入力時の処理
}
e.target.value = '';
let isDouble = Inputs.map(e => e.value).some(v => v === val);
if (isDouble) {
alert(val + 'はすでに存在します');
e.target.focus();
} else {
e.target.value = val;
}
});
</script>
No.8
- 回答日時:
#5 です
1つ言い忘れてました。
document でイベントを監視するときは、e.target が アンカータグでも反応します。それが対象要素なのかもチェックが必要です
No.7
- 回答日時:
#5です
すっきりしてきましたね。
isNan はタイポでしょうか?
getElementsByName に拘っているの?
以下の時点で配列化しておく
const Inputs = [...document.querySelectorAll('****')];
"e.target.value" の出現回数が多いです。タイポにつながります
余談ですがこれはどう?
Inputs.map (e=> e.value).every (v=> v==???)
No.6
- 回答日時:
No4です。
No5さん、ご指摘ありがとうございます。
修正しました。
こんな感じでどうでしょう。
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" /><br />
<input type="text" name="inputs" value="" />
<script>
const Inputs = document.getElementsByName('inputs');
const Exist = new Array(Inputs.length).fill(null);
document.addEventListener('focusout',(e)=>{
if(isNan(e.target.value)){
// 数字以外入力時の処理
}
let idx = [...Inputs].indexOf(e.target);
Exist[idx] = null;
if(Exist.includes(e.target.value)){
alert(e.target.value + 'はすでに存在します');
e.target.value = '';
}
Exist[idx] = (e.target.value === '')? null : e.target.value;
});
</script>
No.5
- 回答日時:
#3です
質問者は”数字”と言っています。範囲が決められていません。
例えば最初の要素に1を入力して、次の要素に11を入力しようとすると途中でアラートされます。
Array.includes をご存じですか?
イベントの監視を document からしてみてはどうでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
入力した文字を大文字に変換し...
-
return trueとreturn falseの用...
-
Selectボックスの幅を自動で広...
-
onchangeイベントを強制的に発...
-
RegularExpressionValidatorの...
-
クリックされた罫表セルの行番...
-
チェックボックス付きのテーブ...
-
ASP.NETでNAME属性を固定にしたい
-
JavaScript ログアウト処理
-
【jQuery】input nameの文字列...
-
sessionの値でボタンを活性・非...
-
ラジオボタンにタブインデック...
-
submitした値を返したい
-
JavaScriptによる自動計算フォ...
-
setIntervalの間隔を途中で変更...
-
selectを変更不可にしたい
-
プルダウン 項目が多いので先頭...
-
【FORM】 リンク文字で submit...
-
一覧から選択した行の行番号を...
-
JSP内で可変するチェックボック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォームの値が0だったら空白...
-
onClickとsubmitの処理順序
-
JSPとJavaScriptの連携について...
-
JavaScriptのアレンジがしたいです
-
条件により、リンク先に画面遷...
-
テキストボックス入力を半角英...
-
WebサイトにOutlookマクロ(V...
-
Javaについて教えてください。 ...
-
javascriptで、イベントが発生...
-
dijit.form.ComboBoxについて
-
onChange()メソッド
-
手書き入力モードを利用して、...
-
PDFフォームで条件つき金額を表...
-
JavaScript のプログラム質問で...
-
2重でメール入力チェックをした...
-
テキストボックスを無効にする...
-
数字の1文字目を消したい
-
入力モード 自動 切り替え
-
日付入力欄の表示形式を自動的...
-
Webブラウザにてページのりロー...
おすすめ情報