JavaScript

1: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:23:11.54 ID:Hsqe5k/s0.net

JavaScliptって特定の関数を実行し続けて、何かボタン等でアクションしたときに
その関数を止める、みたいな処理ってできないの?


スポンサードリンク

4: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:25:41.79 ID:n2PEKdf5M.net

よくわかんないけどイベント感知してフラグ立ててメソッド抜ければいいんじゃねーの


5: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:25:43.92 ID:PmuFwrFs0.net

再帰関数中にフラグ判定入れればいいだけじゃないの


3: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:25:27.70 ID:lKFRfk4NM.net

ソースで書いてみて


6: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:27:23.71 ID:Hsqe5k/s0.net

↓こんな感じ。一度ボタン押したら0~9の数字が延々と切り替わって、もう一度ボタンを押したとき別の処理が動くように
ならないかなーと思ったけど、案の定延々とwhileに入ったまま無限ループする

//変数 
var loadFlg = 0; 

//ボタン押下時の処理 
function start_click() { 

if(loadFlg == 0){ 
loadFlg = 1; 
var items = document.getElementsByTagName("li"); 
while(loadFlg == 1){ 
for( var i = 0; i < items.length; i++ ) { 
var li = items[i]; 
li.innerHTML = Math.floor(Math.random() * 9); 
} 
} 
} 
else if(loadFlg == 1) { 
//なにもしない 
} 
} 
</script>

8: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:29:58.53 ID:6SKyKAQK0.net

else if (loadFlg == 1) {
loadFlg = 0;
}
でええんちゃうん


10: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:31:56.75 ID:Hsqe5k/s0.net

>>8
whileで完全にループしてボタン入力を受け付けてないっぽいから意味なかたお( ´ω`)


11: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:35:33.70 ID:6SKyKAQK0.net

んじゃwhile文部分の実装を変えるしかないな
マルチスレッド化すんのが一番わかりやすいけどなんかライブラリとか入れんとアカンな

あとJavaSc「r」iptやで


12: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:36:30.49 ID:Hsqe5k/s0.net

>>11
そっちの方向か…難しそうね
そして誤字はガチで間違えてた。はずかc


14: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:41:05.05 ID:pvp03seg0.net

フラグが1になりっぱじゃね
なんかのトリガーでフラグかえないとほわいる文抜けないだろ


15: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:42:50.43 ID:Hsqe5k/s0.net

>>14
ボタンを2回目に押したらフラグが1だからelsifの方が実行されて上手い具合にループ抜けないかなっていう
望みにかけた結果がこれだよ


16: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:43:12.84 ID:4bXFq472r.net

なるほど。
ボタンの入力を受け取ってフラグをOffにしたいのにWhileで回ってるとイベントループに入らないからボタンがそもそも効かないってことね。
タイマーでやるしかないんじゃね?
JavaScript嫌いだから良くわかんなあけど。


17: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:43:41.86 ID:lKFRfk4NM.net

hiddenにflg持たせればいいよ


18: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:44:32.60 ID:KKHhoN2L+.net

こうじゃなくて?

var loadFlg = 0; 

//ボタン押下時の処理 
function start_click() { 
if(loadFlg == 0){ 
loadFlg = 1; 
var items = document.getElementsByTagName("li"); 
while(loadFlg == 1){ 
for( var i = 0; i < items.length; i++ ) { 
var li = items[i]; 
li.innerHTML = Math.floor(Math.random() * 9); 
} 
} 
} 
else if(loadFlg == 1) { 
loadFlg = 0; 
} 
}

19: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:46:18.12 ID:Hsqe5k/s0.net

>>18
そうそう、そういうこと
ただwhileで抜けなくなってボタンが効かないから
ワーカーとか使ってマルチスレッド処理するしかないっぽいんだが
今なんかワーカー効かねえって苦戦してるとこ

hiddenにflgっつってもボタンが効かないなら意味なくない?


21: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:48:37.02 ID:n2PEKdf5M.net

しょうがねえな
俺が今から本棚にブチ込んだままのオライリーのサイの奴見て大先生になるから待ってろ

JavaScript 第6版
JavaScript 第6版
posted with amazlet at 15.03.10
David Flanagan
オライリージャパン
売り上げランキング: 24,655

22: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:49:15.51 ID:Hsqe5k/s0.net

>>21
大先生たのもc


24: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:52:04.23 ID:yptdtiX8+.net

こんなんとか

var loadFlg = 0; 

//ボタン押下時の処理 
function start_click() { 
if(loadFlg == 0){ 
loadFlg = 1; 
change(); 
} 
else if(loadFlg == 1) { 
loadFlg = 0; 
} 
} 

function change() { 
var items = document.getElementsByTagName("li"); 
for( var i = 0; i < items.length; i++ ) { 
var li = items[i]; 
li.innerHTML = Math.floor(Math.random() * 9); 
} 

if(loadFlg == 1) { 
setTimeout("change()", 10); 
} 
}

26: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:58:06.95 ID:Hsqe5k/s0.net

>>24
うおおおおおお動いた!ありがとう!
でもどうしてだろう?


27: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 13:59:26.30 ID:Hsqe5k/s0.net

あああああああ再起し続ける間にボタンが押せるんかな?


28: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:01:14.93 ID:Hsqe5k/s0.net

もしかして別関数に移った瞬間に元の関数が効くようになる???
Javascript奥ふけえええ


29: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:02:00.23 ID:pmVl2djm0.net

俺も作った

//変数 
var loadFlg = 0; 

//ボタン押下時の処理 
function start_click() { 
loadFlg = 0; 
disp(); 
} 
function stop_click() { 
loadFlg = 1; 
} 
function disp() { 
var items = document.getElementsByTagName("li"); 
for( var i = 0; i < items.length; i++ ) { 
var li = items[i]; 
li.innerHTML = Math.floor(Math.random() * 9); 
} 
if (loadFlg == 0) { 
setTimeout(disp, 100); 
} else { 
//何もしない 
} 
}

31: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:07:37.34 ID:Hsqe5k/s0.net

上と同じことだな。ストップボタンのオブジェクトがないので、止められんがw
やっぱりsetTimeoutしてるとマルチみたいな挙動するのか
実行キューに移すまでの時間は実はイベント待ち状態と同じってことなの?
わからぬ調べ中


30: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:06:22.81 ID:pmVl2djm0.net

setTimeout関数は引数で指定したミリ秒待ってから関数呼び出すから、その間イベントハンドラ呼び出せる


32: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:08:17.17 ID:Hsqe5k/s0.net

>>30
ほうほう!便利ねこれ!


33: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:10:54.18 ID:Hsqe5k/s0.net

ttp://www.infoq.com/jp/articles/js_multithread_2
とかにもちらっと書いてあるのね
いやあこれで捗る。ありがとう先生たちm(_ _)m


34: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:11:53.50 ID:UyhiJsAga.net

いいってことよ


36: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:13:26.83 ID:5dx5opTO0.net

入力待ちとか時間かかる処理は細切れにしてイベントループで回すもんだと思ってたが


37: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:17:29.43 ID:Hsqe5k/s0.net

>>36
しっかり作るならイベントループぽいね
setTimoutは本来の使い方とは少し違う、裏技みたいな印象。でも知っておくと便利ねえこれ


38: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:23:41.36 ID:zzMQTD6+0.net

とりあえず
clearTimeout
clearInterval
あたりを調べることをおすすめしたい


39: 以下、\(^o^)/でVIPがお送りします 2015/03/07(土) 14:32:01.33 ID:Hsqe5k/s0.net

>>38
ほう、ありがとう!
しっかり調べてみるよ。とりあえずclearTimeoutは使っておく


試したい人用のコピペ雛

<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form>
<input type="button" value="START" onclick="start_click()">
</form>
<script>

</script>
<li></li>
<li></li>
<li></li>
</body>
</html>

元スレ:http://viper.2ch.sc/test/read.cgi/news4vip/1425702191/