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
しょうがねえな
俺が今から本棚にブチ込んだままのオライリーのサイの奴見て大先生になるから待ってろ
オライリージャパン
売り上げランキング: 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/