+ JavaScript の質問用スレッド vol.86 +
自演防ぐの無理だから中身で議論してほしいね
954 :
Name_Not_Found:2011/05/26(木) 16:48:54.49 ID:WDr8djnW
親ウィンドウから子ウィンドウを操作する方法について質問させて下さい。
var subwin;
subwin = window.open('hoge','piyo');
として、
subwin.document.getElement・・・としていけば、
ieでは普通に子ウィンドウのノードを取得したり、
属性を書き換えたのにそれ以外のブラウザでは出来ませんでした。
プロではなく習いはじめの素人なので、
jqueryやAjaxのような難しい話無しに教えて頂けると有り難いです。
質問です。
IE8でcreateDocumentFragmentの返すモノのprototypeをいじりたいのですが、
対象が分からないのでご存じの方は教えてください。
具体的に言うと、たとえばcreateElementの場合、
Firefoxではwindow.HTMLElement、IE8ではwindow.Elementのprototype。
createDocumentFragmentの場合、
Firefoxではwindow.DocumentFragmentのprototypeですが、、IE8では???ということです。
−−−
「いじるな」は不要で。当方承知の上。
createElementとappendChildで、0から複雑な内容組み立てる処理で
"いちいちこんな長いメソッド名書いてられるか鬱陶しい"という話ですので。
>>954 セキュリティ上の理由で異なるドメインの window を操作できない
IE もサーバにアップロードすれば出来ないことがわかるはず
>>955 document.createDocumentFragment().constructor
958 :
Name_Not_Found:2011/05/26(木) 17:39:11.09 ID:WDr8djnW
>>956 では、100枚のサムネイルがあってそれをクリックすると、
別ウィンドウで表示したい場合、100ページ作る必要があるのでしょうか?
>>958 100枚のサムネイルがどこから出てきたのかわからないけど、
>>956は↓に対する回答
> ieでは普通に子ウィンドウのノードを取得したり、
> 属性を書き換えたのにそれ以外のブラウザでは出来ませんでした。
>>957 ああそか、それでいいんだ。
いま試して動作も確認できました。ありがとうございました。
962 :
Name_Not_Found:2011/05/27(金) 12:32:35.05 ID:S5wRS9KZ
初期化スクリプトの実行でIEと他との違いに悩んでいます。
書いてるのは開閉するリストを擁するdiv要素の制御で、
ページ読み込みと同時に非表示=>初期処理(リスト開閉)=>表示します。
IE以外では問題ないのですが、IEでは以下のようになります(特にIE8/9が顕著)
(1)<head>
<script>/*div#fooを非表示にするCSSを定義するインラインスクリプト*/</script>
</head><body>...<div id="#foo">...</div>...
<script src="...">/*リストの処理を実行=>表示*/</script></body>
=> headのスクリプト実行で止まるため一瞬画面が白くなる
(2)<body>...<div id="foo">...</div>...
<script src="...">/*div#fooを非表示に=>開閉の処理を実行=>表示*/</script></body>
=> リストのレンダリングが済んでるので一瞬リストが開いた状態で見えてしまう
(3)<body>...
<div id="foo"><script>/*div#fooを非表示にするインラインスクリプト*/</script>...</div>...
<script src="...">/*リストの処理を実行=>表示*/</script></body>
=> div#fooのみ一瞬遅れて表示される
おそらく3つの動作はどれも正常のように思うのですが、なにしろ他のブラウザでは
どの書き方(スクリプトの配置)でもスムーズにページが切り替わり、白くなる瞬間はありません。
他のブラウザがうまくやってくれてるだけでIEが正直なのか、
IEだけの特徴があるのか、区別がつきません。助言いただけるとうれしいです。
※スクリプトは8k程度、処理もごく軽いものです
964 :
962:2011/05/27(金) 14:12:05.51 ID:S5wRS9KZ
すいません。小さいコードでもほぼ同じなのでタイミングの問題か
ブラウザのレンダリングの違いのみのつもりで・・
>>962の説明と一部違いますが再現する簡易コードは以下です。
document.getElementById("foo").style.visibility="hidden"; # div#fooを非表示(3ではインライン,2では外部ファイル)
document.getElementById("list").style.display="none"; # リストを非表示(ページ末尾の外部スクリプト)
var cnt=0; while (++cnt < 10000) {} # なんらかのちょっとした処理(〃)
document.getElementById("foo").style.visibility="visible"; # div#fooを再表示(〃)
ただ、今ふと思いついてJSオフにしてIEで見てたんですが、
スクリプトがなくともページの描画がチラチラッと何段階かに分かれてて
スクリプトで処理してるリスト部分も後から描画されてるように(一瞬白く)見え、
ちょうど
>>962の(3)にしたときとほぼ同じように見えます。
(スクリプトとは別にIEのレンダリングが速いor描画のタイミングがマメ?)
ちょっと質問の焦点がうやむやになってしまった感なので
ひとまず時間帯を変えるなどして観察してみようと思いますm(_ _)mスイマセン...
>>964 そのやり方ならブラウザに関係なく一瞬見えるはずだよ
IE以外は描画速度が速くて見える時間が短いだけ
確実な方法は document.stylesheets から新たなスタイルを定義すること
対象の要素がDOMツリーに追加される前にスタイルを定義しないとダメ
966 :
Name_Not_Found:2011/05/27(金) 20:08:24.06 ID:Ei1exLbg
ECMAScriptのグローバルオブジェクトにアクセスするやり方ってどうやるんでしょうか。
JavaScriptならwindowで常にアクセス出来るんですが、
SVGを含む色々なライブラリからアクセスされるので、グローバルオブジェクトの名前が
一意に規定出来なくて困っています。
グローバルスコープでthisで取れるのはわかるのですが、
グローバルスコープ以外でどうすればいいのかお分かりになる方、どうかご教示ください
windowで常にアクセスできるって認識がおかしい
フレームあるときどうすんだと
あとthisとスコープは関係ねえ
SVGならnode.ownerDocument.defaultViewとかevent.viewとかで十分だろ
node.jsならglobalだか何かなかったか
(function(){return this})()には何か問題があった気がするが何だっけ
968 :
Name_Not_Found:2011/05/27(金) 20:38:00.00 ID:Ei1exLbg
>>967 よくわからないのに無理にレスしなくていいですよ ^^;;;
あとWebWorker使ったときも、windowじゃ駄目だな
>>968 そうか、頑張ってな
>>2 > (1) 質問にならない投稿はご遠慮ください。(煽り、コード制作依頼など)
node.jsのマニュアル見たが
トップレベルでvar hogeしてもモジュールローカルなんだな
グローバル変数にしたければglobalにつけろ、と
今の主要ブラウザって1.7で作っても問題ないですか?
>>966 Function('return this')();
>>968 質問する立場で煽るのはどうなんですかね。
>>973 それ"use strict"だとダメらしい
>>974 ありゃ、本当ですか。私は Strict Mode でも大丈夫と教わったんですが…。
検証してみたところ、Google Chrome 11, Firefox 4, Opera 11.11, IE8 でOKでした。(IE8 は Strict Mode を実装していないので当然ですが)
http://jsfiddle.net/sufH4/3/ >>968 IE8- を懸念しているのなら parentWindow でいけますよ。
>>973は eval() に近い(evalよりは安全ですが)ので、可能なら defaultView を採用することをお勧めします。
69-801の範囲を判定する場合
/^69|[7-9][0-9]|[1-7][0-9][0-9]|80[0-1]$/.test(a.toString())とか
if(a>=69 && a<=801)とすると思うのですが、もっとスマートで高速にする方法はないのでしょうか
if(69<=a<=801)
>>976 if (68 < a && a < 802)
スレ立て人ですが…また立てられないよ〜。誰かお願い。
テンプレは
>>945-947 あたりを参考に。
>>974 strict modeになってダメになる理由がなさそうだけど
あ、じゃあ俺が立ててくる。
テンプレ間違ったらすまん
>>976 ifで十分スマートだが
似たような条件がelseifで続く場合はswitchのほうがいい
984 :
982:2011/05/28(土) 12:01:53.06 ID:???
テンプレの議論がグダグダでわからん
他の人よろしく
じゃ俺が立てる
俺もテンプレ見てないからちょっと時間かかるかも
ろくに議論してないからこのままでいつもどおりのテンプレで立てて次スレで議論すればいい
今strict modeを実装しているブラウザってFx4以外にあるの?
"use strict";で8進数リテラルの下位互換がなくなるのは勘弁してほしい
if(010 == 10) みたいな
すまん、規制にひっかかった
これも別ipアドレスから書いてる(かけてたら)
他の人頼む
梅
>>983 ありがとう 以前から数値範囲の判定の書き方に違和感を感じていました
しかし、switchの方が良いというのはどういうケースでしょうか?
if(0<a && a<8){}
else if(a<16){}
else if(32<a && a<64){}
else if(63<a && a<100){}
else {}
という条件分岐の場合、switchに置き換えられますか?
switch(true){
case 0<a && a<8:...
case a<16:...
case 32<a && a<64:...
case 63<a && a<100: ...
default: ...
}
>>999 while(true) と同じぐらいバッドノウハウな気がするなあ
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。