+ JavaScript の質問用スレッド vol.88 +
952 :
951:2011/07/18(月) 22:31:34.34 ID:???
* リファレンスに書いてあるようなこと
setTimeout / setInterval は、
引数として与えられたコードと、実行までの間隔と、
set〜 がキャンセル用に生成するIDとを、
実行キュー(実行順番待ちの列)に設定します。そしてIDを返します。
このIDは、setTimeout / setIntervalするたびに新しいもの(連番)が生成されます。
clear〜は、指定したIDのコードを実行キューから外します。
実行キューに収めたコードの実行が始まってからそのIDでclear〜しても
その回の実行が中断されるわけではないことに注意してください。
* 繰り返しを止めるには
setInterval で指定間隔での繰り返し実行が出来ますが
実際のところ実行キューに入るのは次の1回分のみです。
繰り返しになるのは、コードを実行するとともに
同じコード・間隔・IDで自動的に再設定されるものだからです。
つまり一度設定すれば同じID再利用で繰り返しなので、
実行されるコードの中からであっても clearInterval にそのIDを与えてやれば
次回分は実行キューから外され、繰り返しは止まります。
実行されるコードの中に setTimeout を書いて繰り返しさせる場合には、
実行されるコードの中で clearTimeout しても繰り返しは止まりません。
IDは使い捨てだし、clear〜するタイミングが遅すぎます。
「繰り返しを止めたいところでは次回分の setTimeout しない」ように書く必要があります。
プログラムの良し悪しなんて全部価値観なのにな。
もちろん、動作しないのは論外だけど。
>>953 方法の良し悪しは目的の達成度で測れるから、価値観が入り込む余地はない
「コードを破壊されない」が目的なら、より「破壊されない」方法が「正しい」に決まっている
目的を批判するのは価値観にもとづく
「コードを破壊されるのは仕方ない」から「破壊されない方法を求めるのは無駄」と主張することはできる
だが「var、prototype には注意」し、「undefined はどうなっても良い」のなら、一貫性に欠ける
目的ではなく価値観で方法を採用するから、こういうチグハグなことになり、バグを生む
955 :
954:2011/07/18(月) 23:50:38.27 ID:???
例えば「打鍵コストを下げる」という目的で「undefined には目を瞑る」と言うなら、まだ一貫性がある
「保守する」という目的で「自分に理解できないものは使わない」と言うなら、正直で好感が持てる
だが価値観の話を延々とされた所で、そいつの目的が分からなければ、方法の是非など議論できるはずがない
まして、そいつの目的が単に「相手の論破」であるなら、そいつの価値観の話なんぞ付き合うだけ無駄だ
方法の是非だけを問えば良い、どうせそいつには答えられない
ここは質問用スレなんだから
チラ裏日記なら他所でやれよ
http://blogs.wankuma.com/kacchan6/archive/2008/01/28/119508.aspx にあるクロージャの動作、というか関数定義のタイミングがよく分かりません
window.onload = function(){
for(var i = 1; i <= 3; i++){
var button = document.getElementById("button" + i);
button.onclick = function(){
alert(i);
};
}
};
これはbutton.onclick=以降の関数定義時のスコープに、ループカウンタの変数iが入っているので
それに対する参照を持ってしまうのは分かりますが、
window.onload = function(){
for(var i = 1; i <= 3; i++){
var button = document.getElementById("button" + i);
//もう一つ関数で囲む
(function(n){
button.onclick = function(){
alert(n);
};
//iを渡す
})(i);
}
};
これが前のものとどう違うのかがよく分かりません。
iを引数として渡しているので、それを参照してもよさそうな気がするのですが・・・
button.onclick=…を匿名関数でくるんだときにスコープが変わるのでしょうか?教えてください
>>957 上のはiを直接参照してるからループが終わった後の値を参照する事になる
下のだと個無名関数でスコープを作ってるからiと切り離せて参照できるためループが関係なくなる
>>958 下のは無名関数にわたされてる引数の i がループカウンタの i を隠してるって感じですか?
関数定義のタイミングと変数定義のタイミングが違うから・・・とか変なこと考えてましたが、これは全然関係ないっぽいですね・・・
>>959 下でやってるのはこれとだいたい同じ
window.onload = function()
{
for (var i = 1; i <= 3; i++) {
var button = document.getElementById("button" + i);
setButtonClick(button, i);
}
};
function setButtonClick(button, n) {
button.onclick = function() {
alert(n);
};
}
for内で呼ばれたsetButtonClickは、ループごとに n がそれぞれ別の値になっている。
alertは、onclickが実行された時点で引数を探しにいって、nをみつけて表示している。
よって、alertはそれぞれ別の値になっているnをみつけて表示できる。
>>957の前者では、alertが実行されてiを探しにいった時点で、iはループを終了して3になっているから、
どれを実行しようとも3が表示されてしまう。
3じゃなくて4だな
962 :
945:2011/07/19(火) 08:39:27.74 ID:???
書き忘れてる所があったらアラートで教えてくれるようなの作ったんですが
アラートってもしかして嫌われたりしてますか?
なにを書き忘れてて、どういうタイミングかにもよる。
多分フォームのこと言ってるんだろうけど説明足りなすぎ
965 :
951:2011/07/19(火) 12:20:29.06 ID:???
>>962 肝心なところを見落としてました。
例えばidが text1 の要素を 0 、text2 の要素を 10 とかにしてあると、
text1 のほうは 2 までしかカウントアップしません。
innerHTMLでpoo には文字列 "0" 、boon には文字列 "10" が入り、
if (poo < boon) が、数値としての大小ではなく
文字コード順を比較するものになってしまっています。
text2の数値までカウントアップなら、 poo boon ともに parseInt などで
数値に変換しておいてから比較しないとダメでしたね。ごめんなさい。
>>882,885-886
テンプレ議論はここらへんが残ってるな
IDに関しては完全に持ち越しだな
あほみたいな議論を長々とするから・・・
>>963 個人的にだけど、submitのタイミングならむしろ分かりやすいと思う
blurとかfocusで発動したら発狂する
969 :
945:2011/07/19(火) 15:10:30.57 ID:???
>>965 わざわざありがとうございます。もう少しがんばってみます
>>963 <input type="text" required />
HTML5でname属性って必須じゃなくなったんだっけ?
mjd?
973 :
Name_Not_Found:2011/07/19(火) 17:25:31.84 ID:yjnQvp1X
ajax初心者です。ajaxでDBから取得した情報を特定のdivの中に反映させたいと思っているんですが
取得した情報(多次元連想配列)を任意の形にレイアウトするのはどのタイミングでやるべきなんでしょうか?
$.post(
"/ajax/aaa.php",
{var:val},
callbackfunc()
)
上記の書式でaaa.phpにアクセスして以下のような形で返ってきた値を
array(
array('tag'=>'dog', 'val'=>'1'),
array('tag'=>'cat', 'val'=>'2'),
…
)
以下のようにcheckboxのフォーム要素としてレイアウトしたいと思います
<input type="checkbox" name="pet" value="1" />dog
<input type="checkbox" name="pet" value="2" />cat
このレイアウト(html化)はaaa.phpでやった上でreturnするのか
配列を受け取ったあとのjs(callback関数?)でやるのか、わかりません
どっちがいいんでしょうか?
.postメソッドの理解も不十分なので変なことを書いていたらすみません
普通はcallback内で必要なデータだけ取得してレイアウトする
PHPでレイアウトもやっちゃう場合もあるだろうけどね(テンプレートとか使う場合等)
975 :
945:2011/07/19(火) 18:13:48.17 ID:???
>>965 今書き直したらおもい通りに動きました。
if の前にparseIntを置いたら大丈夫でした
ありがとうございました
976 :
Name_Not_Found:2011/07/19(火) 20:42:39.80 ID:CH4oI7ck
ライブラリを使わず
フォームの各コントロールの選択された/入力された値を
まるっと簡単に取得する方法を教えてください
multipleなselect要素とかname属性の値が同じのラジオボタンとかチェックボックスとかが
ほかと違うので面倒くさくなってしまって
そのためのライブラリだろ
>>974 ありがとうございます
つぎはjavascriptでの配列操作などを勉強してみます
981 :
Name_Not_Found:2011/07/19(火) 22:42:53.20 ID:IvPy3ovO
スレ立て人ですが、やっぱLv不足で立てられません。どなたかよろ。
テンプレは
>>978 であってると思われ。
>>982 すまんレベルは足りてるはずなんだがホストのせいで立てられなかったわ
どれどれおいちゃんがスレ立てにチャレンジしてみようかな
ありがとー
>>985 多謝!
ぶじ平常に復帰してめでたい。テンプレテロのアンタ、残念だったねー(笑)。
2ちゃんらしい煽りでした。
旧スレの余り、もったいない。リンクがついてないから誰もいないし。
居たりはするが
埋めでいいだろ
function ume(){
while (thread.length <= 1000) {
thread.write("埋め");
}
}
梅子
ume();
function ume(){
while (thread.length <= 1000) {
alert("埋め");
}
}
onload = ume;
var ume = function(){
while (thread.length <= 1000) {
thread.write("埋め");
}
}
setTimeout(ume, 10);
おいちゃん1000とっちゃうぞー
1000とったら
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。