ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:JS node.childNodesの仕様について) JS node.childNodesの仕様について 2012/02/09 13:58 このQ&Aのポイント JSのnode.childNodesの仕様について調査しました。dummyTag.childNodesの動作がfirefoxとIEで異なることがわかりました。firefoxでは、childNodesの要素は1つでAAAのみが要素となり、BBBはAAAの子要素になります。IEでは、childNodesの要素は3つで、AAA、BBB、/AAAが要素とされます。 JS node.childNodesの仕様について var dummyTag = document.createElement("div") dummyTag.innerHTML = "<AAA>BBB</AAA>"; としたときに、dummyTag.childNodes の動作がfirefoxとIEで異なります。 firefoxでは、childNodes の要素は1つでAAAのみ。BBBはAAAの子要素になります。 IEでは、childNodesの要素は3つで、AAA, BBB, /AAA がそれぞれ要素とされてしまうようです。 AAAをタグとして解釈しているfirefoxの動作の方が自分にとって好ましいのですが、 IEでもこのように認識させる方法はないものでしょうか。 なお、WinXP SP3, firefox10, IE8 で確認しています。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (8) 専門家の回答 質問者が選んだベストアンサー ベストアンサー Chaire ベストアンサー率60% (79/130) 2012/02/09 15:52 回答No.2 先に createElement('AAA') しておく、というのならあります。HTML(5) の新要素を IE8 以下に認識させるときに用いられています。ただし、フレームをまたぐなどした別文書には効果がありません。 そもそも「HTML として」なら、IE(ver. 8 以下)の振る舞いも仕方ない面があるでしょう。「HTML としては」不正なデータなのですから、エラー処理が走ります。 HTML 2.0-4.01 規定では「未知のタグは無視する」とだけあり、具体的な処理方法および DOM 木にどう反映すべきかまでは書かれていません。未知のタグセットであっても要素ノードとして解釈するのは、XML および HTML(5) です。 どうしても AAA 要素なるものを DOM 断片として扱いたければ、XML として処理して下さい。当然ながら、XML 要素ノードには innerHTML などありませんので、IE/MSXML なら xml プロパティ、DOM Level 3 なら markupContent プロパティ(サポートしている実装を見たことがありませんが)があります。でなければ、いちいち createElement() して下さい。 XML 処理したくなければ(あるいは整形式でないのなら)、既存の HTML 要素を用いて下さい。 なお、childNodes にはちゃんと定義がありますので、そこから外れた振る舞いは「バグ」と見なせます。「ブラウザごとに違う」で終わるのでなく、それが規定の動作であるのか、それとも規定から外れた振る舞いであるのか、を把握して下さい。後者は将来的に修正される可能性が高く、例外処理に回すべきものだからです。これは CSS を使うときも同じです。 とはいえ今回の件は childNodes の定義よりもっと下層、マークアップデータの解析レベルの問題です。 質問者 お礼 2012/02/09 17:57 innerHTMLとして読み込ませたいテキストは 状況によって内容がことなり、しかも、 その子要素を再帰的に処理する必要があるため、 createElement()することはできないという事情があります。 HTML5として解釈するというのは、古いブラウザだと対応してないですよね。 XMLとしてテキストを読み込んで要素ノードとして解釈し、 処理を実施した後に結果をinnerHTMLに入れるようにすれば、 可能なのでしょうか。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (7) Chaire ベストアンサー率60% (79/130) 2012/02/15 03:10 回答No.8 すでに別質問に移っておられますが、とりあえず。 No.7 お礼より: > 実行時に他のjsonファイルを参照しながら非HTMLタグをHTMLタグに変換 サーバ側と何回往復するかによりますが、もしクライアント側だけで完結を目指すのなら、データ保持層(モデルとしての XML)と、ブラウザ表示層(ビューとしての HTML)を分離する必要があります。ぶっちゃけ、XSLT でやった方が楽です。 基本的に、HTML と XML(すなわち未知要素)の混在という手段は「ない」ものと考えて下さい(最近、この問題についての W3C Report も出ました)。どうしてもそれが必要なら XHTML でやることになりますが、何度も繰り返しております通り、IE の HTML パーサを通しては駄目です。HTML パーサを通すのは、それを表示するときだけです。 私の結論としてましては、全てを X(HT)ML でやるか(ブラウザに表示させるときのみ HTML 変換して innerHTML を使う)、全てを HTML でできるよう未知要素を使わないようにするか、どちらかしかない、としておきます。 ※一応、IE 5.0-8.0 には XML Data Island というのがあり、<script type="text/html">...</script> または独自拡張の xml 要素を置くことで、HTML 文書内に XML 文書を埋め込めます(IE9 で廃止されました)。しかし、ご要望とはまた少し違うでしょう。 質問者 お礼 2012/02/17 17:27 <http://ejohn.org/blog/pure-javascript-html-parser/> にあるhtmlparser.jsを参考に、パーサを実装しました。 ご回答ありがとうございました。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 Chaire ベストアンサー率60% (79/130) 2012/02/11 19:38 回答No.7 今気付いたのですが、ひょっとしてご質問の意図は <A>BBB</A> から DOM 文書木を構築できれば良いだけで、HTML 語彙との混在は別に考えていなかったりしますか? であれば、No.6 に書いた通り、IE なら DOMDocument、それ以外なら DOMParser を使えば良いだけです。 問題になるのは、木と木を結合するときです。Firefox は(大雑把に)XML ノードと HTML ノードが一元管理されていますので、割と自由に切り貼りできます。しかし、IE は MSXML と MSHTML が別機構ですので、自由にノードを切り貼りすることができません。 本来、このために DOM Level 2 の document.importNode() があるのですが、これはこれで微妙な問題があります(略)。だから、MSXML 側のノードをいったん文字列に直し、MSHTML 側の innerHTML に解析させるという二度手間を行うことになります。 このとき、innerHTML による HTML 解析が走る以上、IE7 以下にとって未知の要素は使えません。なので、No.6 では MSXML ノードの文字列化がてら、HTML の span 要素に変換したわけです。 innerHTML は万能のプロパティではないです。かなり限定された用途にしか使えません。 質問者 お礼 2012/02/13 13:35 丁寧なご回答ありがとうございます。 やりたいことは、HTMLタグと非HTMLタグが混在したHTMLライクなドキュメントがあり、実行時に他のjsonファイルを参照しながら非HTMLタグをHTMLタグに変換して、変換結果を表示する、というものです。非HTMLタグは何度か非HTMLタグに変換されたあとに最終的にHTMLタグに変換されることもあり、再帰的な処理が必要になります。 HTMLライクなドキュメントの階層構造を再帰的に辿りながら変換する際に、childNodeで辿るようにFireFoxで確認しながら実装したのですが、IEで確認したところ思うように動かず、childNodeの挙動が違うことに気づいた次第です。 domなり、MSXMLなり、調べていますが、この辺りの経験があまりなく、推奨される方法がありましたら教えてください。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 Chaire ベストアンサー率60% (79/130) 2012/02/11 17:54 回答No.6 No.2 お礼より: > XMLとしてテキストを読み込んで要素ノードとして解釈し、処理を実施した後に結果をinnerHTMLに入れる ですから、これは DOM の問題ではなく、ソース解析レベルの問題だということを念頭に置いて下さい。IE6/7 が HTML 文書内の未知のタグ(開始タグであれ終了タグであれ)をひとつの空要素と見なす以上、未知のタグのまま扱うことはできません。基本的に方法はひとつ、既知のタグに置き換えてやることです。 下記では、A 要素を HTML の span[@class="A"] 要素に変換します。 var xmlDoc; var xmlString = '<dummyRoot>' + '<AAA>BBB</AAA><AAA>CCC</AAA>' + '</dummyRoot>'; var xslDoc; var xslString = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' + '<xsl:output method="html"/>' + '<xsl:template match="/">' + '<xsl:apply-templates select="dummyRoot/*"/>' + '</xsl:template>' + '<xsl:template match="*">' + '<span class="{local-name()}">' + '<xsl:apply-templates/>' + '</span>' + '</xsl:template>' + '</xsl:stylesheet>'; var htmlDoc = document; var htmlDiv = htmlDoc.createElement('div'); try { xmlDoc = new ActiveXObject('Msxml2.DOMDocument.3.0'); xmlDoc.loadXML(xmlString); xslDoc = new ActiveXObject('Msxml2.FreeThreadedDOMDocument.3.0'); xslDoc.loadXML(xslString); htmlDiv.innerHTML = xmlDoc.transformNode(xslDoc); } catch (err) { var proc = new XSLTProcessor; var parser = new DOMParser; xmlDoc = parser.parseFromString(xmlString, 'application/xml'); xslDoc = parser.parseFromString(xslString, 'application/xml'); proc.importStylesheet(xslDoc); htmlDiv.appendChild(proc.transformToFragment(xmlDoc, htmlDoc)); } alert(htmlDiv.innerHTML); もちろん、こんな手間をかけるくらいなら最初から span[@class="A"] で出力した方が早いです。@class の他、@itemprop、@rel、@content、@data-* なども候補になるでしょう。 なお、No.2 で触れた MSXML の xml プロパティですが、読み取り専用であることを失念しておりました。失礼しました。 ちなみに、実装的には HTMLUnknownElement がなくても Element で返せば十分です。HTML(5) で HTMLUnknownElement をわざわざ設けたのは、未知の要素でも innerHTML など HTML-DOM API を使えるようにするためです。とはいえ、基本的に文字列処理を避けるべきなのは言うまでもありません。 ここから分かるように、HTML(5) では未知の要素の解析・処理方法も定められています。3.2.2 節、12.2.4.10 節、15.3.4 節などを参照して下さい。でないと将来、要素が追加されたときに、またも今の IE のような扱いになりますので。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 think49 ベストアンサー率59% (285/482) 2012/02/10 23:03 回答No.5 IE8 はhtmlファイルに "<AAA>BBB</AAA>" を直書きしても不正な要素を(制作者の期待通りに)認識しません。 http://fiddle.jshell.net/hDNkE/2/ 最近のブラウザは HTML 5 規定に従い、HTMLUnknownElement インターフェースを持つ HTMLElement を返します。(Google Chrome 16, Firefox 10.0, Opera 11.61 で確認) http://www.whatwg.org/specs/web-apps/current-work/multipage/elements.html#htmlunknownelement IE8 は不正な要素に対して [object HTMLUnknownElement] を返す実装をしていますが、質問者さんが期待する動作はしていないようです。 HTML (HTML5) がなかった時代のブラウザですから仕方ないですが…。 http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/appendix/notes.html#h-B.1 最も、対象ブラウザ全てが HTML (HTML5) に従うようになったとしても "<AAA>BBB</AAA>" は Invalid な文字列です。 "<AAA>BBB</AAA>" というXML文字列をDOMに挿入せずに処理をした上で HTML に変換し、DOMに挿入させるのが一般的な対応だと思います。 でなければ、XHTML文書にしてXMLを挿入しても良いですが、IE8- は XHTML を認識できないため、XML文書として扱わせるようにトリックを使う必要があります。 具体的には IE8- 向けに「Content-Type: application/xml」を出力して XML 文書として扱わせます。 http://www.w3.org/MarkUp/2004/xhtml-faq#ie 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 神崎 渉瑠(@taloo) ベストアンサー率44% (1016/2280) 2012/02/09 19:04 回答No.4 IEはタグとして認識してます。 ただそれが、空要素(<img>などと同じ)か、空要素ではない<span>などと同じかの違いだけです。 HTMLの文法では未定義タグの扱いをどうするかは定義されていません。 完全にブラウザ依存です。 (なお、タグ属性の扱いに付いてもブラウザ依存です。) HTMLで定義された要素を使うのをお勧めしますが、どうしても未定義タグを使用するなら、createElementで可能です。 var tmp=document.createElement('AAA'); var div=document.createElement('div'); div.innerHTML='<aaa>あいうえお</aaa>'; より厳格にするには、詳しくは、いわゆる"html5.js"を参考にしてみてください。 HTML5タグをサポートしないIEで、<section>や<article>などを、空要素ではなくいわゆるインライン要素として認識させるためのスクリプトです。 (ブロック要素にみせかけるには、display:blockをスタイルシートで指定する) googlecodeなどに登録されている物では、DOCTYPEやXML/HTMLモードなどで区別しているのか、そうとうややこしい処理を行っている物もあります。 ファイル名として"html5.js"が使われることが多いので、そのファイル名で検索したらたくさん出てきます。 -------- 逆に、Fxで空要素として認識させる方法はたぶんありません。 <p><mytag>あいうえお</p> 上記は、Fxは<p><mytag>あいうえお</mytag></p>として認識します。 質問者 お礼 2012/02/10 17:57 詳しい回答ありがとうございます。 どうもIEの動きが掴めないのですが・・・。 IEが空要素として認識しているのであれば、 以下を実行した場合、0=AAAから始まると思います。 また、var tmp=document.createElement('AAA'); があってもなくても動作は変わらないようです・・・。 <html> <head> <title>テスト</title> </head> <body> <div>本文</div> <div id="xx">あああ</div> <script type="text/javascript"> var ret = new Array(); //var tmpA=document.createElement('AAA'); //var tmpB=document.createElement('BBB'); var dummyTag = document.createElement("div") dummyTag.innerHTML = "<AAA>a</AAA><BBB>b</BBB><CCC>c</CCC>"; for ( var i = 0; i < dummyTag.childNodes.length; i++){ ret[ret.length] = i + "=" + dummyTag.childNodes[i].nodeName; } var res = ret.join(''); document.getElementById("xx").innerHTML = res; </script> </body> </html> childNodeエンティティを上書きする(できるのか分かりませんが)か、 innerHTMLに相当するテキストをタグかどうか解釈して createElement するしかないものでしょうかね。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 yambejp ベストアンサー率51% (3827/7415) 2012/02/09 17:44 回答No.3 つまりこういう処理 var dummyTag = document.createElement("div") var BBB=document.createTextNode("BBB"); var AAA=document.createElement("AAA"); AAA.appendChild(BBB); dummyTag.appendChild(AAA); 質問者 補足 2012/02/09 17:58 innerHTMLとして読み込ませたいテキストは 状況によって内容がことなるため、 createElement()で対応できないという事情があります。 ご丁寧に作成いただいたのに申し訳ないです。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 nda23 ベストアンサー率54% (777/1416) 2012/02/09 14:34 回答No.1 >IEでもこのように認識させる スクリプトでブラウザの動作を変更できたら どうなると思います? 誰もそんな恐ろしいブラウザは使いません。 しょうがないから自分でブラウザを識別して 同じ結果になるようにプログラムしている のが現状です。ブラウザごとに微妙に違う ところはChildNodesだけではありませんしね。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピュータープログラミング・開発JavaScript 関連するQ&A 【javascript 文法】値渡し?参照渡し? 以下実行すると、AAAをクリックしてもBBBをクリックしても「BBB」とアラートされます。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <script type="text/javascript"><!-- var gDown= false; var div = document.createElement('div'); div.id = 'AAA'; div.innerHTML = 'AAA'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); var div = document.createElement('div'); div.id = 'BBB'; div.innerHTML = 'BBB'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); Event.observe(document, 'mouseup',function(){ alert(gDown.id); gDown=false; }); //--></script> </body> </html> javascriptって値渡しだと思っていたので、期待した動作と異なります。参照渡しだと考えると納得できるのですが、javascriptって 参照渡し?それとも値渡し? と混乱しています。 この辺のところを、教えてください。お願いいたします。 appendChildがieだとできない?? こんにちは。DOMについては全く無知です。 このようなのを作ったところ、google chromeでは動いたものの、ieでは動きませんでした。 var iBody = $("hoge").contentWindow.document.getElementsByTagName("body")[0]; var newText = document.createElement("div"); newText.innerHTML = "aaa"; iBody.appendChild(newText); ※$("hoge")は、iframeタグを指しています いろいろ試したところ、ieだとフレーム内にアクセスすることができないみたいです。 どうすればいいのか、ご存知でしたらご教示願います。 firefox、opera等での番号の数え方 現在Javascriptを勉強中で 教材中での疑問なのですが 下の記述でどうしても腑に落ちないことがあります。 IEの方の[]の中の番号の数え方は分かるのですが firefox用ではどういう数え方をすれば node[0].childeNodes[5].childeNodes[1].innerHTML......... という数え方になるのでしょうか? 開始タグと終了タグを分けて数えているのでしょうか? 分かる方回答お願いします。 // IE用 function change(){ var node = document.getElementsByTagName("body"); node[0].childNodes[2].childNodes[0].innerHTML = "変更しました"; } // FireFoxやOpera用 function change(){ var node = document.getElementsByTagName("body"); node[0].childNodes[5].childNodes[1].innerHTML = "変更しました"; } --------HTML---------- <body> <h1>サンプル3</h1> <p>ここが変わります。</p> <div> <p>深いノード1</p> <p>深いノード2</p> </div> <form> <input type="button" value="変更" onclick="change();"> </form> </body> ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム [JS] あるクラス名をページからすべて削除したい ページ内のすべてのタグから、例えば"aaa"というクラス名を削除したいです。 単純に以下のようにしてみました。 var elms = document.getElementsByClassName("aaa"); for ( var i = 0; i < elms.length; i++ ) { elms[i].removeClassName("aaa"); } この場合、firefoxではremoveClassNameする度に、elmsから動的に要素が削除されてしまいます。 そこで、以下のようにしましたが、IEではelmsから要素が減らないため、無限ループになってしまいます。 var elms = document.getElementsByClassName("aaa"); while ( elms.length > 0 ) { elms[0].removeClassName("aaa"); } どうやって削除するのがよいのでしょうか?? PSPのWebブラウザで、動的にタグ入の文字を挿入するにはどうしたら良 PSPのWebブラウザで、動的にタグ入の文字を挿入するにはどうしたら良いですか? <div id="aaa">ここを変える</div> function change(){ document.getElementById('aaa').innerHTML="<b>foo</b>"; } としても、<div>の中身が太文字のfooとならずに、<b>foo</b>となってしまいます。 <div id="aaa">ここを変える</div> function change(){ var aaa=document.getElementById("aaa"); aaa.firstChild.nodeValue='<b>foo</b>'; document.body.appendChild(aaa); } としても結果は同じでした。 これを太字で表示させる方法はありますか? appendChildとinnerHTMLを短く テーブルのthタグと内容を追加したい ・下記で期待通り動作するのですが、冗長かなと思い、スッキリさせたいです ・どうすれば良いでしょうか? var tr = document.createElement("tr"); tbody.appendChild(tr); var th = document.createElement("th"); th.innerHTML = '見出1'; tr.appendChild(th); var th = document.createElement("th"); th.innerHTML = '見出2'; tr.appendChild(th); var th = document.createElement("th"); th.innerHTML = '見出3'; tr.appendChild(th); var th = document.createElement("th"); …… Apend前のElementの中のElement var div = document.createElement('div'); div.innerHTML="hogehoge<div id='hoge'>aaa</div>"; とし、 このdivの中のelementをID指定で取得したいです。 document.body.appendChild(div); とした後なら、 document.getElementById('hoge') で取得できるのですが、 appendChildしたくないです。 ご名案ありましたら、ご教授ください。宜しくお願いいたします。 JS onmouseoverについて お世話になっております。 お忙しいところ申し訳ありません onmouseoverでテキストリンクから 画像を表示させているのですが onmouseで出た画像の場所に <select>で表示したセレクターがあり 画像が隠れてしまいます どちら様か画像を一番上に持ってくる 方法を教えていただけないでしょうか? 仕様 WIN XP IE SP2 NNで見ると表示されます。 文章が下手で申し訳ありません かいつまんだソースをのせます <!-- function msg() { document.all.aaa.innerHTML ='<table width=200 cellspacing=0 cellpadding=0 border=1><tr><td>bbb</td></tr></table>'; } //--> </script> <div id="aaa" STYLE="position:absolute;"></div> <a onmouseover="msg()" HREF="###">1111</a> <select name="ggg"> <option VALUE="" SELECTED>xxx</option> <option VALUE="">yyy</option> </select> です。 bbbを見えるようにしたいのです よろしくおねがいします 要素を追加する関数の作成 <div id="here"></div> 上の様な要素内に要素と内容を追加する関数を作りたいのですが、思った結果が得られずに悩んでいます。 function ins( id ) { var output = document.createElement( 'span' ); output.className = 'ins'; output.innerHTML = <p>content</p>; var element = document.getElementById( id ); element.appendChild( output ); } ins( 'here' ); この様な場合にはどうしたら良いのか、何かアドバイスを頂けると嬉しいです。 【javascript】document.getElementByIdは一つしか使えないの? 以下をhtmlをブラウザで見ると、文字列"aaa"は表示されますが、"bbb"は表示されません。 <html> <head> <SCRIPT LANGUAGE='JavaScript1.2'><!-- function init(){ document.getElementById("a").innerHTML="aaa"; document.getElementById("b").innerHTML="bbb"; } //--></script> </head> <body onload="init()"> <div id="a"></dev> <div id="b"></dev> </body> </html> ブラウザはIE,FFと試しましたが共に同じ結果でした。 FFのエラーコンソールには document.getElementById("b").innerHTML="bbb" is null のエラーメッセージが出てましたが、文法的に何が問題なのでしょうか? jsでプルダウンで選択したものがうまく表示されない 以下のhtml文があります。 <!DOCTYPE html> <html> <head> <title></title> <script language="javascript" type="text/javascript"> function onButtonClick() { var val = document.forms.form1.textBox1.value; var target = document.getElementById("output"); if (val == "Penguin") { target.innerHTML = "合っています。"; } else { target.innerHTML = "間違っています。"; } } </script> </head> <body> <form action="" id="form1"> <div>"Penguin"と入力してください。</div> <input id="textBox1" type="text" value="" /> <input type="button" value="Exec" onclick="onButtonClick();" /> </form> <div id="output"></div> </body> </html> Penguinと入力すると合っていますと表示が出ます。 これを、プルダウン方式にしました。 <!DOCTYPE html> <html> <head> <title></title> <script language="javascript" type="text/javascript"> function selectboxChange() { var val1 = document.forms.form1.Select1.value1; var target = document.getElementById("output"); if (val1 == "要素1") { target.innerHTML = "合っています。"; } else { target.innerHTML = "間違っています。"; } } </script> </head> <body> <form name="form1" action=""> <select id="Select1" onchange="selectboxChange();"> <option>---</option> <option value1 == "要素1">要素1</option> <option>要素2</option> <option>要素3</option> <option>要素4</option> <option>要素5</option> </select> </form> <div id="output"></div> </body> </body> </html> これにすれば、要素1を選択すれば、会っていますと表示されるのですが、されません。 どうしたら改善されますか。 javascriptで要素の構造を生成 昨日質問したプログラムの続きなんですが、 実はクリックした画像を大きくしたくてその方法を考えています function getElements ( obj ) { //イメージタグここから var src = obj.getAttribute('src'); var element = document.createElement('img'); element.src = src; //div生成 var box = document.createElement('div'); box.style.position = 'fixed'; box.class = 'photobig'; box.style.top = '50%'; box.style.left = '50%'; box.style.width = '900px'; box.style.height = '600px'; box.style.background = '#000000'; box.style.opacity = '0.7'; box.style.marginTop = '-300px'; box.style.marginLeft = '-450px'; box.innerHTML = element;//←ここが問題 var objBody = document.getElementsByTagName("body").item(0); objBody.appendChild(box); // body要素にdivエレメントを追加 // var objPhotobox = document.getElementsByClassName("photobig").item(0); // objPhotobox.appendChild(element); } javascriptでdivを生成し、その中にimgタグで画像を入れようとしています appendChildで生成した後で、innerHTMLにimgタグの情報を入れようとしています innerHTMLに変数をいれてもタグとして生成されないのが分かったところで、 divにクラス名を付けてそのクラスにappendChildしてみたんですが、これもダメでした どうすればよいのか見当つかず困っています 生成した後のものを扱うのが難しそうなので一度にすべて生成するようにするのかなと思いつつやり方がわかりません よろしくお願いします AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム 下記のスクリプトを高速にする具体的な方法 下記のスクリプトを高速にする具体的な方法 現在、特定のクラスを表示、非表示にしたいと 考えております。 下記のスクリプトだとIEでの動作が遅いので改善方法を模索しております。 どなたかご教授ください。 宜しくお願いいたします。 <script type="text/javascript"> var ids = new Array(); ids = ['default','aaa','bbb']; function change(site){ if(!document.getElementsByTagName){return;} var objs = document.getElementsByTagName('*'); var check = ids.join('|'); var re = new RegExp('(?:^|\\s)'+site+'(?:$|\\s)'); for(var i=0; i<objs.length; i++){ var obj = objs.item(i); if(re.test(obj.className)){ obj.style.display = ''; }else{ if(obj.className){ if(obj.className.match(check)){ obj.style.display = 'none'; }else{ obj.style.display = ''; } } } } } </script> <html> <select name="site_change" id="site_change" onchange="change(this.value)"> <option value="default">デフォルト</option> <option value="aaa">aaa</option> <option value="bbb">bbb</option> </select> <div class="aaa bbb">aaa bbb</div> <div class="aaa">aaa</div> </html> 画像メニューの開閉 JavaScriptで画像メニューの開閉を行いたいのですが、 うまく動きません。 「aaa」が閉じていた場合には「aaa」を開くまではできたのですが、 「bbb」を閉じるという1行を追加したら動かなくなりました。 どなたかご教授願います。 【JavaScript】 function showSubmenu01() { if(document.getElementById("aaaSub").innerHTML == '') document.getElementById("aaaSub").innerHTML = '<img src="aaa.gif">'; document.getElementById("bbbSub").innerHTML = ''; else document.getElementById("aaaSub").innerHTML = ''; } 【HTMLソース】 <ul> <li><a href="#" onClick="showSubmenu01()"><img src="img/menu_aaa.gif" /></a></li> <li><div id="aaaSub"></div></li> <li><div id="bbbSub"><img src="bbb.gif" /></div></li> </ul> スクロール付きのdivタグを作成するには 縦スクロール付きのdivタグを作成するにはどうすればよろしいでしょうか。 下記のコードでやってみたのですが、うまくいきません。何が悪いのでしょうか。 var tarobj = object; var ele = document.createElement("div"); ele.setAttribute("overflow-y","scroll;"); ele.setAttribute("width", "100px"); ele.setAttribute("height", "25px"); ele.innerHTML = strobj; tarobj.appendChild(ele); 変数の中にjavascript文を入れたい どうにも、うまく動作しないので教えてください。 バナーやブログパーツなどを切り替えて表示したくて、やってみているのですが、変数にjavascriptを使ったタグ(ブログスイッチ等)を入れると動作しません。 リンクバナー等はうまく表示できるんですが。 <DIV>を使った表示の切替方法だと、音声とか裏で動いちゃってるようなので、 innerHTMLで切り替えてみようとしたのです。 変数にjavascript文は入れられないのでしょうか。 <script type="text/javascript"> tagu = new Array(4); tagu[0]='aaa'; tagu[1]='bbb'; tagu[2]='ccc'; tagu[3]='ddd'; n=0 function taguclick() { n=n+1; if (n>3) n=0; document.getElementById('taguimgview').innerHTML = tagu[n]; }; </script> <div id='taguimgview' >aaa</div> <button onClick="taguclick()">CHANGE</button> innerHTMLでは無理でしょうか。 var AAA = document.getElementById("hoge1"); AAA.innerHTML = "<div id=\"test0\" class=\"hoge\"><scr"+"ipt type=text/javascript src=hogege.js></scr"+"ipt></div>"; と言うように、<div id="hoge1"></div>を置換したいのですがうまく行きません。 置換した直後にhogege.jsを作動させたいのですが、思いつくのはこの程度です。。(笑 何か別な方法はございませんでしょうか。 IEのみ作動・・。とか言うのはご遠慮願います。 ご教授よろしくお願い申し上げます。 .innerHTMLの不一致? こんにちは。 Javascriptは全くの初心者です。 よろしくお願いします。 <div id="test"> <ul> <li><a href="a.html"><span>AAA</span></a></li> <li><a href="b.html"><span>BBB</span></a></li> <li><a href="c.html"><span>CCC</span></a></li> </ul> </div> <script type="text/javascript"> <!-- var data = "AAA";// AAAは自動取得させる予定 var nodes = document.getElementById('test').getElementsByTagName("a"); for (i = 0; i < nodes.length; i++) { if(nodes[i].innerHTML == data){ nodes[i].setAttribute("class","ddd"); } } //--> </script> 上記のようなjavascriptを設置し、 <li><a href="a.html"><span>AAA</span></a></li> の<a>にclass="ddd"を適用させようと思います。 (<span>には適用させたくない。) しかし、 var data = "AAA"; だと<a>の.innerHTMLは<span>AAA</span>なので <span>AAA</span> ≠ AAA で一致しません。 そこで、 var data = "<span>AAA</span>"; としたところ、FirefoxとNNでは成功しましたが、それ以外のブラウザでは駄目でした。 初心者でお恥ずかしい限りですが、 どうしたらよいのかご教授いただければ幸いです。 よろしくお願いします。 [JS] htmlをパースしてdomにしたい テキストのhtmlライクの構文があります。 これをパースして、dom構造のオブジェクトに変換したいです。 createElement("div")して、innerHTMLに入れる方法の場合、 IEではhtmlで定義されていないタグ名が無視されてしまうため、不可です。 xmlのパーサに食わせる方法の場合、 テキストが厳密にxml構文に沿っていないとエラーとなるので、 閉じタグ漏れがあるテキストを処理できないため、不可です。 パースする関数を作成するしかないかと思っています。 すでに誰かが作成していそうですが、探しても見つかりませんでした。 こうやって作った、とか、参考となるページなどありましたら教えてください。 jqueryにて、独自属性を使ってタグを操作したい 皆様 いつもお世話になります。 早速ですがご質問させていただきます。 現在、独自属性を使った学習をしております。 jqueryでidを使って以下のタグの「追加位置」に「追加要素」を挿入すると 以下のようになると思いますが、 <div id="aaa"> <!--追加位置--> </div> $(div#aaa).prepend("追加要素"); 独自属性を使って、同じことをしようとする際、idを識別するのに「#」を使うと思いますが、独自属性はどういう識別子(★にあたる箇所)を使うのでしょうか? div data-hoge="aaa"> <!--追加要素--> </div> var dokuji = $('div').attr('data-hoge'); $(★dokuji).prepend("追加要素"); お詳しい方ご教授のほど宜しくお願い致します。 開発環境: Dreamweaver CC Firefox 34.0.5 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター プログラミング・開発 Microsoft ASPC・C++・C#CGIJavaJavaScriptPerlPHPVisual BasicHTMLXMLCSSFlashAJAXRubySwiftPythonパフォーマンス・チューニングオープンソース開発SEOスマートフォンアプリ開発その他(プログラミング・開発) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
innerHTMLとして読み込ませたいテキストは 状況によって内容がことなり、しかも、 その子要素を再帰的に処理する必要があるため、 createElement()することはできないという事情があります。 HTML5として解釈するというのは、古いブラウザだと対応してないですよね。 XMLとしてテキストを読み込んで要素ノードとして解釈し、 処理を実施した後に結果をinnerHTMLに入れるようにすれば、 可能なのでしょうか。