JavaScriptで実体参照を扱う方法

このQ&Aのポイント
  • JavaScript上でXHTML上の実体参照を含む文字列を生成する方法を教えてください。
  • String.fromCharCode()などを使用すれば数値参照は文字化できますが、一文字に変換する方法がわかりません。
  • 現在はXHTML本文にテキストを書いてJavaScriptで読み込んで活用していますが、もっと直截的な方法が知りたいです。
回答を見る
  • ベストアンサー

JavaScript で実体参照を扱うには

JavaScript 上でたとえば XHTML 上の   を含む文字列を生成したい場合、どうコーディングすればよいのでしょうか。 数値参照の場合は String.fromCharCode() などを使用すればコード数値を文字化できるのですが、文字列 "nbsp" あるいは " " を一文字に変換する方法がわかりません。Document.createEntityReference 辺りかなとも思ったのですが、パラメータに何を指定してよいのかよくわかりません。 現在は XHTML 本文にこれを含むテキストを書いておいて、それを一旦 JavaScript で読み込んで連想配列等にして活用する形で使っているのですが、もう少し直截的に生成したいと思っています。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.4

>任意の外部 XML 文書 DOM オブジェクトの実体参照 XMLは詳しくないので、あまり自信はありませんが・・・ 外部XML文章を開くと言うことはパーサーを使うんですよね? JavaScriptのみで開けます? function conv(f,s) { var XMLdoc = new ActiveXObject('microsoft.XMLDOM'); XMLdoc.async = false; XMLdoc.load(f); var ref = XMLdoc.createEntityReference(s); return ref.text; } IE限定ですが、MSXML使って、こんな感じでどうでしょう? conv("foo.xml","hearts") // & と ; は不要

beubeu
質問者

お礼

ご回答ありがとうございます。 おお、まさにこれですね。なるほど createEntityReference はこういう使い方をするのですか。 実行してみたところ、XHTML 以外でも XHTML + MathML などで MathML 独自の entity でも上手く出力が得られました。ありがとうございます。 あとは FireFox 用に var doc = document.implementation.createDocument("", "", null); doc.load("foo.xml"); var ref = doc.createEntityReference("hearts"); と実行してみたのですが、ref は null でした。createDocument のパラメータを createDocumentType などを使用して埋めてもやはり null しか返されません。 https://bugzilla.mozilla.org/show_bug.cgi?id=9850 どうも昔からあるバグのようです (;_;)

beubeu
質問者

補足

「この回答へのお礼」の補足です。 とりあえず FireFox に関しては、動的に、対象となる XML 文書を作り出してそこから読み出す、くらいしか浮びませんでした。 たとえば、MathML という XML の entity の ExponentialE を取り出すとき、次のようにして取り出せました。 var doc = (new DOMParser()).parseFromString([ '<?xml version="1.0"?>', '<!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN" "dtd/mathml2.dtd">', '<math xmlns="http://www.w3.org/1998/Math/MathML">&ExponentialE; </math>' ].join("\n"), "text/xml"); var result = doc.documentElement.firstChild.nodeValue; 姑息というかなんというか (^^;

その他の回答 (3)

  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

#1、2です。連続で失礼します。 何とか変換する方法を探ってみました。 innerHTMLを利用することで、変換することは出来ました。しかし、スマートな方法ではないし、ブラウザによってはうまく動きません。 ・WindowsXP IE6で動作確認 ・Opera8、FireFox2 では &nbsp; が 0x20(通常のスペース)に変換される。 上記を応用した変換後の文字コードを調べるプログラムです。 <html><head> <script language="JavaScript"><!-- function change(){ inp1 = document.getElementById("input1"); spn1 = document.getElementById("span1"); inp3 = document.getElementById("input3"); spn1.innerHTML = "<input id='input2' type='text' value='" + inp1.value + "'>" inp2 = document.getElementById("input2"); inp3.value = inp2.value.charCodeAt(0).toString(16); } // --></script> </head><body> <form> <input id='input1' type='text'> データ(例:&amp;nbsp;)<br> <input type="button" value='変換' onClick='change()'><br> <span id='span1'> <input id='input2' type='text'> </span> 変換後<br> <input id="input3" type='text'> Unicode(16進数)<br> </form> </body></html>

beubeu
質問者

お礼

ご回答ありがとうございます。 なるほど、innerHTML を使うと変換可能ですね。これをヒントに次のような文字列変換関数を作ってみました。 function conv(s) { var span = document.createElement("span"); span.innerHTML = s; return span.firstChild.nodeValue; } これで conv("&hearts;") 等で期待通りの値が返るようになりました。IE7, FireFox2, Opera9 でも動作はするようです。 ただ、多分この innerHTML はメインの文書ファイルの DTD 等のエンティティ定義に従うのですよね? できれば任意の外部 XML 文書 DOM オブジェクトの実体参照が使えると嬉しいのですけれども。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.2

#1です。 >たとえば 質問のここを見落としていました。&nbsp;は一例ですね。汎用的に変換できる方法をお探しですね。失礼しました。 これに関しては分かりませんでした。 補足 >msg += String.fromCharCode(0xA0); msg += "\u00A0"; unicodeを入れるのは、単にこれだけで良かったです。

  • venzou
  • ベストアンサー率71% (311/435)
回答No.1

&nbsp;はunicodeで 0xA0 のようです。 以下のHTMLで検証しました。 <html><body> ↓通常のスペース<br> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<br><br> ↓&amp;nbsp;ウインドウサイズを狭くしても改行されません。<br> <script language="JavaScript"><!-- msg = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; msg += String.fromCharCode(0xA0); msg += "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; document.write(msg); // --></script> </body></html>

参考URL:
http://www.fileformat.info/info/unicode/char/00a0/index.htm

関連するQ&A

  • JavaScript値呼び出しと参照呼出し

    参考書籍はO'REILLY初めてのJavaScript第2版です <script type="text/javascript"> //<![CDATA[ function alterArgs(strLiteral, aryObject) { //渡された文字列の値を変更 strLiteral = '変更しました'; aryObject.push("three"); } function testParams() { var str = "オリジナルの文字列"; var ary = new Array("one","two"); document.writeln("<h3>呼び出し前の値</h3>"); document.writeln("strの値:" + str + "<br />" ); document.writeln("配列の各要素の値:" + ary + "<br />"); alterArgs(str,ary); document.writeln("<h3>呼び出し後の値</h3>"); document.writeln("strの値:" + str + "<br />"); document.writeln("配列の各要素の値:" + ary + "<br />"); } //]]> </script> /*----------実行結果-----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:オリジナルの文字列 配列の各要素の値:one,two,three /*----------以下、疑問です。----------*/ alterArgs(str,ary);の第1引数であるstrは「基本データ型(値呼び出し)」であるため 呼び出された側では、呼び出した側で使われていた変数の内容を変更することができません。 以下、基本データ型の引数に変更を加えたい場合は、 その変更後の値を戻り値として戻して変数に代入すれば、 呼び出し側でも変更を反映できるのですよね。 自分なりに幾度、打ち込んでみたものの以下のように 実行結果をかえることができません。 長くなりましたが回答の方、宜しくお願いします!!! /*----------実行結果 ----------*/ 呼び出し前の値 strの値:オリジナルの文字列 配列の各要素の値:one,two 呼び出し後の値 strの値:変更した 配列の各要素の値:one,two,three

  • javascriptでの文字列操作

    こんにちは。 javascriptでの文字列操作で躓いてしまったのでご教授ください。 例えば、 var str = "00000"; という文字列があったとして、これの2文字目を”1”に変更したいといった場合、javascriptではどのように操作するのが簡単でしょうか。 phpですと、 $str = "00000"; $str[1] = "1"; といった記述で操作できた記憶があるのですが、調べてみても同様の操作が見当たらず・・・。 文字列を分割して+で足すような感じの処理か、配列にして繰り返し処理といった感じになってしまうのでしょうか。 宜しくお願い申し上げます。

  • Javascriptのエレガントな書き方。

    javascriptで 次のような関数を作りたいのですが、エレガントに行う方法が知りたいです。 引数で数値0ならば、 0001という文字列 250なら 0250 12345なら 12345と文字列を返すものです。 また、皆さんのJavascript攻略方法も知りたいです。 最近プロトタイプとかいう言葉が出てきて、正直?状態です。

  • javaScriptで、テキストエリアのある文字列を見つけて、

    javaScriptで、テキストエリアのある文字列を見つけて、 その行から、1行目と2行目を消すという処理を行いたいのですが、 コーディングがわかりません。 教えて下さい。 (例) 下記のテキストエリアから、「<ターゲット文字列>」を見つけて、 その行から1行目と2行目、つまりは、「さしすせそ」と「たちつてと」を削除したいです。 -----textarea----- あいうえお かきくけこ <ターゲット文字列> さしすせそ たちつてと

  • 音量スライダーのJavaScriptが効かない?

    質問させていただきます。 動画を流すサイト作りに携わっています。 私はデザインとコーディングまでが仕事なのですが(動画の実装は他社担当) 音量を調節するスライダーをJavaScriptで付けてくれと 依頼され、あまり詳しくないものでつまづいてます。 下記のように実装してほしいという担当者からの リクエストがあったのでやってみたのですが、IEではスライダーがちゃんと横に動かせるのですが、 FirefoxやMacのsafariなどではダメでした。 http://www.hajimeteno.ne.jp/dhtml/dist/js64.html 調べたところ、上のサンプルと実際にコーディングしているhtmlの文書型宣言が違うことが 原因のようなのです。<!DOCTYPE ~を削除すると意図した通りに動きます…。 上記サンプルでは<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">で、 これならFirefoxでも問題なく動いてます。 コーディング中のhtmlは <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">です。 JavaScriptではそういうことがあるのでしょうか? このJavaScriptを諦めて、他のものを探したほうがいいでしょうか? どなたか、お力をお貸しください! よろしくお願いします。

  • Javascriptで コピー・参照の事例?

    値と参照の動作がわからないのですが、 func copy(mono) { var x = mono; } の時、xは monoのコピーでしょうか?参照でしょうか? monoは オブジェクト 配列 文字列 数値 ture, false null それぞれについても知りたいです。 このように、値と参照の区別しなければいけない問題は他にあるでしょうか?

  • DOMとjavascriptについて

    javascriptとperlを駆使して、動的なホームページを作っています。 javascriptで動的にタグを生成してそれを参照したりするような処理を、書いていくと時々新しく生成したタグを参照できなくなったりします。ここにスクリプトを掲載することは出来ないんですが、ajax通信でサーバーとデータをやり取りし、何度もhtmlを書き換えるホームページを作っています。するとなぜだか新しく生成したタグが参照できなくなったりします。 他にはjqueryのappendメソッドで、タグを文字列として直接書き込んだ場合、タグをタグとして認識してくれないということもありました。 javascriptに原因があるのか、domに原因があるのか、それともテスト用のブラウザに使っているfirefoxの処理の仕方に原因があるのかわかりません。どなたか原因を知っている方がいらしたら是非ご教授ください。

  • 配列で文字列の切り取り[JavaScript]

    配列で文字列の切り取りという言葉が正しいがどうかはわかりませんが、 以下のような配列があるとします。 var array1 = ["xx10","xx11","xx12","xx13"]; これを、下記のように"xx"だけを切り取って、新たな配列として生成できるでしょうか? var array2 = ["10","11","12","13"]; 宜しくお願いします。

  • 即回答希望です! javascriptについて。

    よろしくおねがいします。 1.配列var name["sato","suzuki",など]が宣言され、既に何らかの文字列が入っているとします。 この配列の要素のうち、”sato”と"suzuki"の数を計算し、 それぞれの変数sato,suzukiに入れるにはどうすればいいか教えてください。 javascriptでお願いします 補足 試験問題の直しを提出しなければいけないのですが、さっぱり過ぎて質問しました。

  • javascript引数

    文字列(a)を入れると、ある文字を返してくれるロジックを作成したのですが 1.jsの中身。 ************************************** function test(a){var i 省略 a.charAt(i);}return s;} ************************************** http <script type="text/javascript" src="1.js"></script> ~ ここで、引数のaに値を渡して、返してもらうのは、 この後、どのようにコーディングすれば宜しいですか。 すみませんが宜しくお願いします。

専門家に質問してみよう