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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

3回答

2564閲覧

selectタグのonchange属性で指定されたjavascript関数を一度実行されたら、3秒間隔をあけるようにしたい

kyopee233

総合スコア12

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/09/14 05:26

selectタグのonchangeにjavascriptの関数を設定しているのですが、
これが、一度実行されると次の実行まで、三秒ほど間隔をあけたいです。

HTML

1<select name="test" onchange="test();"> 2<option value=1>1</option> 3<option value=2>2/option> 4<option value=3>3</option> 5<option value=4>4</option> 6</select>

何かいい方法が、あれば教えていただきたいです。
よろしくお願いします。

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

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

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

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

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

m.ts10806

2018/09/14 05:29

どのような経緯・背景・目標があって導入されようとしていますか?「三秒ほど間隔を」とのことですが、「3秒以上たたないと実行できないように」なのか「3秒たつと自動で実行」なのかでいうとどちらでしょうか。 また、一部 optionタグの閉じ部分が正しくなっていませんが、こちらは転記ミスですか?
kyopee233

2018/09/14 05:44

optionタグが非常に多く、それらをキーボードの下矢印をおしっぱなしのような状態で高速に切り替えるとサーバーへの負荷が重くなってしまうので、それを避けたいです。なので、一度実行すると「3秒以上たたないと実行できないように」にしたいです。説明不足で申し訳ないです。optionタグについては転記ミスです。
yambejp

2018/09/14 05:56

selectのname「test」と呼び出す関数「test」は場合によって競合するので極力別名にするのをおすすめします
papinianus

2018/09/14 07:11

仕様なんですが、optionを↓やマウスのスクロールで連続的に変化させたときにサーバに到達してよいのですか?なんか処理が根本的に間違っていませんか?
m.ts10806

2018/09/14 07:11

onchangeで例えばajaxなどでサーバーサイドにアクセスしない限りはあくまでクライアントサイドの出来事なので負荷がかかるのはその利用者の端末だと思います。それに3秒って結構長いので、yambejpさんも仰っていますが使いづらくて仕方ないかなと。私の回答も含めていずれの回答でもおおよそ解決は可能かと思いますが、余程重たい処理をしないのであればもうちょっと別の手段を考えた方がいいかもしれません。
guest

回答3

0

一度実行されると次の実行まで、三秒ほど間隔をあけたいです。

質問者さんが本当に知りたいのはこれですか?
[Javascript] ユーザーが入力を停止するまで.keyup()ハンドラーを遅延させる方法

これは「delayedCall」という技術で、「delayedCall JS」みたいなワードで検索をかけるといくつかヒットします。


そうではなく、単純に質問文の内容で知りたければ、
isTesting = falseみたいな「実行中だよ」と知らせてくれる変数を用意すればうまくいくでしょう。

JavaScript

1var isTesting = false; 2function test() { 3 // 1行目にこれを仕込んでおく 4 if (isTesting) return; 5 isTesting = true; 6 7 // 元々あった処理 8 9 // 3行経過したらisTestingを取り下げる 10 setTimeout(function(){ isTesting = false; }, 3000); 11}

【おまけ】更に凝った実装にしてみる

test関数はシンプルに保ちたいなぁと思うのでラッピングしてみました。

JavaScript

1var delay = function (fn, time) { 2 var isDoing = false; 3 return function () { 4 if (isDoing) return; 5 isDoing = true; 6 fn(); 7 setTimeout(function(){ isDoing = false; }, time); 8 } 9} 10var test = delay(function () { 11 console.log('do test'); 12}, 3000); 13 14test(); // "do test"が出力 15test(); // すぐに再実行したので何も出力されない 16setTimeout(test, 3500); // 3秒程経ってから"do test"が出力された

投稿2018/09/14 05:38

編集2018/09/14 06:20
miyabi-sun

総合スコア21158

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

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

m.ts10806

2018/09/14 05:41

あ…フラグ切り替えたいだけならfunction用意しなくて良かったですね^^;
guest

0

ひとまず思うところで回答してみます。

「3秒以上たたないと実行できないように」

js

1var action_flg = true; 2 3function test(){ 4 if(action_flg){ 5 action_flg = false; 6 console.log("yes"); 7 setTimeout(setaction, 3000); 8 }else{ 9 console.log("no"); 10 } 11} 12var setaction = function(){ 13 action_flg = true; 14}

フラグを1つ用意しておき実行時にfalseに切り替え、setTimeout()で任意の時間経過後そのフラグを切り替えます。
動作確認のためconsole.log("no");を入れていますが、「何もさせたくない」場合はこのelseの分岐は入れなくても良いです。またはreturnだけ書いておいてください。

参考まで。

投稿2018/09/14 05:37

編集2018/09/14 05:42
m.ts10806

総合スコア80850

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

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

miyabi-sun

2018/09/14 05:43

testとsetactionの関数宣言が揺れてますね。 巻き上げ的な話でこれ動きますか?多分大丈夫じゃないかなぁと思いますがちょっと自信ないです
m.ts10806

2018/09/14 05:52

Chrome最新で動作確認済みです。 関数宣言の揺れについては私の癖みたいなもので、onchangeのようにHTMLから直で呼び出されるところについてはこのように書いてしまってますね・・。
miyabi-sun

2018/09/14 06:05

おお、動くんですね。ちゃんと動作確認しててGJです。
m.ts10806

2018/09/14 06:09

動くか自信がないものは「※未検証です。実装イメージだけもってください」とつけるようにしています。(たぶんそこちゃんと見られている質問者さん少ないですけど)
guest

0

間違った項目を選んでしまった場合、死ぬほどストレスかかるので
やめたほうがいいと思いますが・・・
またキーボードから操作するときとかも、1から4まで変更するのに
2でも3でも3秒ずつ待たされるのは相当なクソ仕様です

それをおいておいて
単純にselectを移動できないようにするにはdisabledにすれば
変更はできなくなりますね

javascript

1<script> 2window.addEventListener('DOMContentLoaded', function(e){ 3 document.querySelector('[name=test]').addEventListener('change',function(e){ 4 var t=e.target; 5 t.disabled=true; 6 setTimeout(function(){t.disabled=false;},3000); 7 }); 8}); 9</script> 10<select name="test"> 11<option value=1>1</option> 12<option value=2>2</option> 13<option value=3>3</option> 14<option value=4>4</option> 15</select>

投稿2018/09/14 06:22

yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問