+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net (711レス)
上下前次1-新
35: 2016/12/03(土)15:16 ID:6IkFDzpo(1) AAS
俺は特定のタグすべてを対象としないのであれば
ほとんどタグ名を書かないかな。
36(2): 2016/12/11(日)11:23 ID:Tn2z+E9L(1/7) AAS
【質問】JSのDOMContentLoadedが発火しません。
■事象
iframeを動的に作成(createElement)して、
addEventListenerに「DOMContentLoaded」を追加しているが、
iframeのsrc先のDOM読み込み完了時にイベントが発生しません。
37(2): 2016/12/11(日)11:24 ID:Tn2z+E9L(2/7) AAS
■コーディング
var parent_obj = document.getElementById("top");
var obj = document.createElement('iframe');
if(obj.addEventListener){
obj.addEventListener("DOMContentLoaded",xxx);//★これが発火しない
//obj.addEventListener("load",xxx);//☆遅い
}else if(obj.attachEvent){
obj.attachEvent("onload",xxx);
}else{
obj.onload = xxx;
省6
38(2): 2016/12/11(日)11:25 ID:Tn2z+E9L(3/7) AAS
>>36
>>37
■やりたい事
addEventListener("load",xxx)だと画像読み込み後にイベントが発生するので、遅いです。
iframeのソースが返ってきた直後にイベントを呼びたいのです。
■質問
なぜDOMContentLoadedが発火しないのでしょうか。
コーディングが悪いのでしょうか?
それともcreateElement('iframe')はDOMContentLoadedのイベントに対応していないのでしょうか?
その場合、上記【やりたい事】の代案はございますでしょうか?
39(1): 2016/12/11(日)12:53 ID:??? AAS
>>38
HTMLIFrameElementにはcontentWindowおよびcontentDocumentというプロパティが存在しますので、そちらのイベントを拾えばよいのではないでしょうか。
obj.contentDocument.addEventListener("DOMContentLoaded",xxx);
引用元
外部リンク:ja.stackoverflow.com
40: 2016/12/11(日)13:42 ID:??? AAS
if(obj.addEventListener){
}else if(obj.attachEvent){
いまどきこんなコード書くなよ。
古いブラウザ切り捨てでいいならaddEventListener使えばいいし、
IE8とかにも対応させるならjQueryを使うべきだ。
コードを自分で書いたならばその行をテストしなきゃいけないんだぜ?
41(3): 2016/12/11(日)15:57 ID:??? AAS
> HTMLIFrameElementにはcontentWindowおよびcontentDocumentというプロパティが存在しますので
マジレスするとコレでは無理。
なぜならiframeの中のwindow(さらにその中のdocument)に触れるとは限らないから
触れると確定するのはiframeのsrcが設定された後。同じドメインであるなど
参照する権限があれば触れる。だから先にsrcを設定する必要がある。
だがsrcを設定した時点で読み込みが始まる。
つまり読み込みが始まった後にDOMContentLoadedをaddEventListenerしても
もう読み込まれてしまっているかもしれない。この場合は発火しない。
最初の一回はネットワークから取ってくるので処理が遅く、
addEventListenerが間に合って発火するかもしれないが
省3
42: 41 2016/12/11(日)15:58 ID:??? AAS
マルチポスト先を見てもどうやらこの問題に触れているのはなさそうだなw
こういうのは経験が物を言う。やったことがある俺じゃないと気づきにくい
43(1): 2016/12/11(日)16:16 ID:??? AAS
俺は質問者ではないんだけど、同ドメインだとしても、src設定した直後にcontentWindowって触れないよな?
44(1): 2016/12/11(日)16:27 ID:??? AAS
そうだったかな?こまないところは忘れた。
作り方によると思う。古いブラウザ対応もあって
about:blankも併用していたからな。
45(1): 2016/12/11(日)16:35 ID:??? AAS
あ、ごめん確かに作り方によるわ
質問のコードをそのまま使うとアクセスできないだけだった
46: 2016/12/11(日)21:01 ID:Tn2z+E9L(4/7) AAS
>>39
クロスオリジン、クロスドメインがやりたい事の前提です。
その場合、DOM系のイベントが使えないのですね。
それでは上記【やりたい事】の代案はございますでしょうか?
47: 2016/12/11(日)21:04 ID:Tn2z+E9L(5/7) AAS
>>41
丁寧なご回答ありがとうございます。
クロスオリジン、クロスドメインがやりたい事の前提です。
その場合、DOM系のイベントが使えないみたいののです。
>>41 さんのご指摘のタイミングの問題もあります。
それでは上記【やりたい事】の代案はございますでしょうか?
一応「2秒待って」という苦肉の策はありましたが、
別の綺麗な順序保障の方法はないでしょうか?
48: 2016/12/11(日)21:05 ID:Tn2z+E9L(6/7) AAS
>>43-45
>>41
丁寧なご回答ありがとうございます。
クロスオリジン、クロスドメインがやりたい事の前提です。
その場合、DOM系のイベントが使えないみたいののです。
それでは上記【やりたい事】の代案はございますでしょうか?
一応「2秒待って」という苦肉の策はありましたが、
別の綺麗な順序保障の方法はないでしょうか?
49: 2016/12/11(日)21:06 ID:Tn2z+E9L(7/7) AAS
あ、元々の質問は以下です。
>>36-38
50: 2016/12/11(日)21:21 ID:??? AAS
クロスドメイン先は自分で管理してるものなの?
51: 2016/12/11(日)22:28 ID:??? AAS
このマルチポスト奴またきたのか
>>20-22
52(3): 2016/12/11(日)22:43 ID:??? AAS
1. image = new Image();
2. image.src = 何々
3. image.onload = ハンドラ
便乗して質問するが、
こう書いておいたら、画像を読み込んだ後に、ハンドラが確実に呼ばれるのか?
それとも、もし画像を読み込むのが速ければ、もうハンドラは呼ばれないのか?
確か、画像の読み込みは、非同期だよね。
読み込みしながら同時に、3行目も実行されるよね?
53: 2016/12/11(日)23:55 ID:??? AAS
>>52
onloadよりも先に画像が読み込まれれば、onloadは発生しない。
ただこの場合は単に2と3を逆にすればいい。
iframeが特殊なだけ
54: 2016/12/12(月)00:57 ID:??? AAS
>>52
>読み込みしながら同時に、3行目も実行されるよね?
1, 2, 3 を同期的に実行すればハンドラは必ず呼ばれるだろう
キャッシュされていようが image 読み込みは非同期になるので
上下前次1-新書関写板覧索設栞歴
あと 657 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.087s*