元スレ+ JavaScript の質問用スレッド vol.80 +
JavaScript覧 / PC版 /みんなの評価 :
751 = :
あなたは実行される順番が分かっていない。「ASPが処理」→「結果のHTML+
JavaScriptができる」→「ブラウザに送られる」→「表示、JavaScript実行」
という順番だからそのように書いたらASP側がまず実行されるのは当たり前。
JavaScriptからサーバに結果を送信して、サーバ側でそれを受け取って
結果を書き込む、というふうにしないと。あとは自力で勉強してね。
752 = :
特定の要素が生成されるタイミングで関数を実行したり出来ますか?
753 = :
その要素が「どうやって」生成されるかによるんでは。
754 = :
>>751
理解のあやふやだった部分でした。<サーバ側の処理、クライアント側の処理
submit()し、次ページで書き込み処理することで意図通りに動かすことが出来ました。
どうもありがとうございました。
755 = :
>>752
onload
756 = :
XMLHttpRequestの戻り値として、バイナリデータを受け取って
ブラウザ側でダウンロードダイアログを表示させて
取得したバイナリデータをダウンロードさせることって可能でしょうか
現在YUIのConnection ManagerでXMLHttpRequestを
サーバに投げてバイナリデータを取得する所まで
確認できたのですが、ブラウザ側にコレを認識させる事ができない状態です。
758 :
>>757
なにがわからんの?
759 = :
>>758
要素の重なり等を考慮すると、最終的に表示されている色は、
スタイルシートの情報からは取得できないですね。
質問内容が無謀でした。
763 = :
JavaScript + jQuery + localStorage ってブラウザ間の挙動の違いは大きいですか?
Firefoxで開発したのがChromeで動かなくて凄くショックだったんですが・・・
挙動の違いを解説してるページとかあったら教えてください
764 = :
自己解決しましtあ^^
765 = :
要素を削除するとき
obj.parentNode.removeChild(obj);
以外の簡単な方法はありますか?
767 = :
>>645
こういうのを使えるならXMLHttpRequestで取得してからこいうのを使ってDOM操作するほうがいいの?
iframeに読み込むのはよくないの?
jetpackもHTMLをDOM操作するためにiframeに読み込む仕組みを採用しているっぽいですが
> SCRAPBLOG : Jetpack SDK 0.4 の Page Worker API
>http://www.xuldev.org/blog/?p=792
768 = :
769 = :
質問です。
リンクにaddEventListener('click',~
とイベントを追加したのですが、関数の中でreturn false;してもリンク先へ移動してしまいます。
どうすればリンクの本来の動作を止めることが出来ますか?
770 = :
>>767
Jetpack のAPIを利用することが前提にあるようだが、違うのだろうか。
他に適切なAPIがあるのであれば、勿論それでも構わない。
が、標準の DOM, ECMAScript メソッドを利用することが前提としてあるなら iframe に読み込むのはお勧めしない。
iframe に読み込むということはDOMを document に結びつけるということ。当然、それに関わる処理も働く。
ドキュメントに挿入しなくて済む処理なら、わざわざ iframe に読み込む必要はないと思う。
771 = :
すいません。自己解決しました。
772 = :
>>769
return false; はIEが独自実装した仕様で HTML5 もそれに追従しているが、DOM 本来のやり方ではない。
DOM では event.preventDefault() を規定している。
773 = :
>>771
自己解決したなら、解決法を書いてほしい。
774 = :
>>770
iframeだと再レンダリングされて
それが問題ってことですか
わかりました
どうもありがとうございます
775 = :
777 = :
スレチ
778 = :
スレチでしたか、失礼しました
781 = :
ループ内で関数を定義するコードを書いたところ、JSLint に Don't make function within a loop.
と怒られてしまいました
どういう理由があってこのエラーが出るのでしょうか
コードは以下の通りです
Function.prototype.createClass = function(class_name, proto){
proto = proto || {};
var c = class_name.split('::');
var target = this;
for(var i = 0; i < c.length; i++){
if(!target[c[i]]){
target[c[i]] = function(){};
}
target = target[c[i]];
}
target.prototype = proto;
};
782 = :
ループ中にfunctionを作ってはならないってそのまんまじゃないか
for(var i = 0; i < c.length; i++){
if(!target[c[i]]){
target[c[i]] = function(){}; //←ここ
}
783 = :
>>782
ですので、なぜ作ってはいけないのかその理由が知りたいのです
784 = :
ループ内で作れるならループ外でも作れるでしょって事じゃねーの
785 = :
自己解決しました
>>784
全然違います
var t = {};
for(var i = 0; i < 10; i++){
t[i] = function(){
alert(i);
}
}
としたときに、
t[0] を呼び出しても t[1] を呼び出しても常に 9 が表示されます
どうやらクロージャ内でうまくインデックスの値を参照できないようです
786 = :
そんな書いてないコードの事なんかわかんねーよ
for (var i=0;i < 10;i++) {
t[i] = (function(index){alert(index)})(i);
}
ほれ
787 = :
あ、すまんそのままだと参照というか実行されるな
でもまぁクロージャで参照したいならそんな感じで書けば良い
どちらにせよ同じエラーは出ると思うがな
788 = :
>>785
だからクロージャが参照している変数「i」は1個でしょ。
そのiは変更していっているんだから、t[1]でもt[0]でも
変更された現在のiを参照するに決まっているじゃない。
クロージャってそういうもののためにあるわけで。自分で
勝手に書いた時点のiで固定されて欲しいとか思っても
そう書かなかったらそうなるわけがない。
そもそもアンタはFAQのQ14/A14を読んだのか。読んでない
のならどっかよそに行って欲しいね。読んだけど理解でき
ないとかなら説明するけどさー。
789 = :
>>786
JSLintご存知ない?
質問の意図は「JSLintで静的に解析したとき、このエラーが出るのはどんな落とし穴があるためか」でしたが、
これを知らなかったが故に変に解釈されてしまった気がします
申し訳ないです
>>788
Q14. タイマーやイベントハンドラに設定するコードにthisを含めたいのですが
「"...this..."」とか「function(){...this...}」ではうまく行きません。
A14. それらが実行されるときはthisは別のもの(window等)を指してしまってる。
「function(x){return function(){...x...};}(this)」のようにthisを別の変数に
束縛しその変数を使って。循環参照によるメモリリーク問題あり(この項記述検討中)
この情報からクロージャと変数のスコープの関係を類推して
更に今回の落とし穴になりうる条件を類推するのは無理があるかとw
790 = :
<head>
<script type="text/javascript">
function func1(str) { ←ココ
alert(str + "がクリックされました");
}
function init() {
alert("ドキュメントがロードされました");
}
window.onload = init;
</script>
</head>
<body>
<form id="myForm" name="myForm"><p>
<input type="button" value="ボタン1"
name="button1" onclick="func1('ボタン1');">
</p></form>
</body>
とあるのですが
このfunc1(str)のstrって何なのでしょうか?
strにonclickの'ボタン1'が格納される事はわかるのですが、変数でもないようですし、初心者ですみません
791 = :
>>790
引数の1番目に指定されたものが入ってる変数だよ
792 = :
>>789
まずJSLint関係ないと思うぞ?
Don't make function within a loop.
これの訳を考えてみろよ
で、君が原因だと思ってるiの参照を解決できる方法はこんな感じだけど
for (var i=0;i < 10;i++) {
t[i] = (function(index){
return function () {
alert(index);
};
})(i);
}
これでやっても同じメッセージは出る
>>790
<input type="button" value="ボタン1"
name="button1" onclick="func1('ボタン1');">
の onclick="func1('ボタン1');"にあるボタン1
793 = :
>>785
で、>>781の原因はなんだったんだ?
そのコードを実際にブラウザで動かしたらエラーをはかないから、俺はJSLintがおかしいと思ったけど。
>>792も言っているけど、その問題は>>785のクロージャ関係と無関係だと思うよ。
function(){};の中身がわからないから確かではないけど、普通のforで回すだけなら、target = this;はいらないとおもうよ。
794 = :
だからt[0]とかが呼ばれる時はiは別のものをさしてしまっている。
t[i]=(function(x){return function(){alert(x);}})(i);
とすればt[i]に入れた時のiの値が関数が呼ばれる時に作られる
環境のxに渡されて保持され、それをクロージャから参照している
からiその時点のiの値が取れると。
795 = :
>>791
varで宣言しなくても変数になると言う事なんでしょうか?
入門書やってる程度なので、ちょっとよくわからんとです
796 = :
>>795
関数の引数(strの事)に関してはvarはいらない
関数と引数について勉強すれば良いと思う
797 = :
>>792
最初に提示した例ではそもそもクロージャになっていないので問題なく動くはずです
JSLintでメッセージが出る部分は落とし穴となる可能性の高い部分
メッセージの内容については「してはいけない」としか書かれていないです
なぜこのようなメッセージを出さなければいけないか、どんな落とし穴があるのかを知りたく質問したのです
原因さえはっきりしていればそのメッセージをスルーするという選択肢もあるでしょう
>>793
問題はJSがブロック単位の変数のスコープを持っていないことです
なので、
var t = {};
for(var i = 0; i < 10; i++){
t[i] = function(){
alert(i);
}
}
t[0]();
は
var t = {};
var i = 0;
for(; i < 10; i++){
t[i] = function(){ alert(i) };
}
t[0]();
と解釈され、t[0] を呼び出している部分では i = 9 となり、9が出力されるわけです
これを解決するには >>792 のようにクロージャで変数をバインドする必要があります
JSLintは落とし穴になりそうな部分を警告してくれているだけなのでおかしくはないとです
target = this は 普段 jQuery 書いているのでその癖ですw
798 = :
なんだJSLintはエラーじゃなくて注意だったのか。
>>797
いや、スコープの事なんか知ってるよ。
てか>>781から>>785の変化が大きすぎだろw
書いてないことで「違います(キリッ」なんて言われてもねぇ・・・
799 = :
キチ
800 = :
>>797
最初に示した例でも同じ警告は出るわけだが・・・
難しく考えすぎだろ
こういうLint系って落とし穴以外にも
オーバーヘッドが発生する場合等も警告だすよ
もうちょっと単純なテストからしてみたらどうよ
結局どこが原因か切り分けできてないんでしょ?
因みに>>781のコードでfunctionを外部化し、>>781のコードの前に持って行き
その関数を代入するとその警告は消える
類似してるかもしれないスレッド
- + JavaScript の質問用スレッド vol.85 + (1001) - [97%] - 2011/4/25 21:32
- + JavaScript の質問用スレッド vol.81 + (1001) - [97%] - 2010/12/10 20:01
- + JavaScript の質問用スレッド vol.87 + (1001) - [97%] - 2011/6/21 6:33
- + JavaScript の質問用スレッド vol.86 + (1001) - [97%] - 2011/5/27 21:50
- + JavaScript の質問用スレッド vol.90 + (1001) - [97%] - 2011/10/26 4:18
- + JavaScript の質問用スレッド vol.84 + (1001) - [97%] - 2011/3/30 7:32
- + JavaScript の質問用スレッド vol.83 + (1001) - [97%] - 2011/2/24 8:02
- + JavaScript の質問用スレッド vol.82 + (1001) - [97%] - 2011/1/19 7:54
- + JavaScript の質問用スレッド vol.90 + (1001) - [97%] - 2011/11/15 20:32
- + JavaScript の質問用スレッド vol.89 + (1001) - [97%] - 2011/9/4 4:17
- + JavaScript の質問用スレッド vol.88 + (1001) - [97%] - 2011/7/20 7:03
- + JavaScript の質問用スレッド vol.130 + (1001) - [95%] - 2017/11/25 20:45
- + JavaScript の質問用スレッド vol.104 + (1001) - [95%] - 2013/1/28 4:00
- + JavaScript の質問用スレッド vol.103 + (1001) - [95%] - 2012/11/9 15:30
- + JavaScript の質問用スレッド vol.102 + (1001) - [95%] - 2012/9/11 17:30
- + JavaScript の質問用スレッド vol.120 + (1002) - [95%] - 2014/11/8 1:15
- + JavaScript の質問用スレッド vol.101 + (1001) - [95%] - 2012/7/16 14:15
トップメニューへ / →のくす牧場書庫について