DOMへの追加方法について

このQ&Aのポイント
  • DOMへの追加方法を知りたい
  • 特定の要素にdtタグを追加する方法を教えてください
  • 英語の文字列を基準にdtタグを追加したい
回答を見る
  • ベストアンサー

DOMへの追加方法について

知識のある方に是非ともご教示いただきたいのですが、 以下の通りのリストがあるとしまして、 <dl id="hoge"> <dd>222</dd> <dd>333</dd> <dd>AAA</dd> <dd>AAB</dd> <dd>BBB</dd> <dd>BBC</dd> <dd>CCC</dd> <dd>CCD</dd> </dl> これらを以下のように数字から始まるなら「数字からはじまる」 Aから始まるなら「Aから始まる」と<dt>を入れたいと考えています。 且つそのdtにはlistという連番のIDをつけていきたいのですが、 どうjqueryで組めば良いか教えて頂けませんでしょうか。 実際どうしたいかというのは、以下のとおりとなります。 <dl id="hoge"> <dt id="list1">数字から始まる</dt> <dd>222</dd> <dd>333</dd> <dt id="list2">Aから始まる</dt> <dd>AAA</dd> <dd>AAB</dd> <dt id="list3">Bから始まる</dt> <dd>BBB</dd> <dd>BBC</dd> <dt id="list4">Cから始まる</dt> <dd>CCC</dd> <dd>CCD</dd> </dl> 英語に関しては、文字列の1番目を取得して、文字列の1番目 + 「から始まる」 といった形にしたいと考えています。 知識のある方、お力を貸して頂ければと思います。 宜しくお願い致します。

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

  • ベストアンサー
  • think49
  • ベストアンサー率59% (285/482)
回答No.5

#2, 3 です。 > Aから始まるの後に、AAA, AAB と並ぶようにしたいです AAA, AAB の順でソートされる実装になっていると思うのですが、期待通りに動かないHTMLを開示できるでしょうか。 ■JavaScriptの問題点 #2 で述べたように基本的には JavaScript で実装しない方が良い案件に思えましたが、この辺りはどうでしょうか。 Re: yukiponta さん

その他の回答 (4)

  • think49
  • ベストアンサー率59% (285/482)
回答No.4

#3 です。 id 初期化が漏れていたので修正しました。 https://jsfiddle.net/gohva2rm/1/ Re: yukiponta さん

yukiponta
質問者

補足

ご回答いただきありがとうございます。 順序保証はjsでソートできるので問題なかったのですが、対応していただきありがとうございます。 今AAAとAABの上にそれぞれAからはじまるというdtが記載されていますが、 Aから始まるの後に、 AAA AAB と並ぶようにしたいです。 こちら再度お願いできませんでしょうか。

  • think49
  • ベストアンサー率59% (285/482)
回答No.3

ASCIIコード順に並んでいますが、順序保証あるのでしょうか。 汎用性を踏まえると事前にソートするのが良さそうですが…。 https://jsfiddle.net/gohva2rm/ ```html <dl id="hoge">  <dd>222</dd>  <dd>AAA</dd>  <dd>BBB</dd>  <dd>CCD</dd>  <dd>333</dd>  <dd>BBC</dd>  <dd>AAB</dd>  <dd>CCC</dd> </dl> <script> 'use strict'; (function (sortfn) {  var doc = document,    dd = doc.querySelectorAll('#hoge>dd'),    dt = doc.createElement('dt'),    df = doc.createDocumentFragment(),    parentNode = dd[0].parentNode;  dd = Array.prototype.slice.call(dd).sort(sortfn); // 配列化してASCIIコード順にソートする  dt.appendChild(doc.createTextNode('dummy')); // dt 要素ノードの雛形  for (var i = 0, l = dd.length, target, firstChar, beforeChar; i < l; ++i) {   target = dd[i];   firstChar = target.firstChild.data[0];   if (/^\d$/.test(firstChar)) {    firstChar = '数字';   }   if (firstChar !== beforeChar) {    dt = dt.cloneNode(true);    dt.firstChild.data = firstChar + 'から始まる';    df.appendChild(dt);    df.appendChild(target);    beforeChar = firstChar;   } else {    df.appendChild(target);   }  }  parentNode.appendChild(df); }(function sortfn (a, b) { return a.firstChild.data > b.firstChild.data; })); </script> ``` 実際のところ、JavaScriptが無効化されれば実行されないので他の手段も検討する余地があるかもしれません。 - サーバサイドでdd要素を出力しているのならサーバサイドで <dt>***から始まる</dt> - 静的HTMLでdt要素を挿入する手間を惜しむのならJavaScriptで生成した後に静的HTMLとして貼り付ける Re: yukiponta さん

回答No.2

#1です。まちがえた return /\d+/.test (t) ? '数値': t; return /\d/.test (t) ? '数値': t; for (var idx, t = null, i = 0; c = cs[i]; i++) for (var idx=0, t = null, i = 0; c = cs[i]; i++) 癖は治らず

回答No.1

どうしてもjQueryが必要ですか? 必要ならば他の誰かにお任せします。 function firstCharType (e) {  var t = e.textContent.charAt (0);  return /\d+/.test (t) ? '数値': t; } function appendDT (e, c, i) {  var dt = e.ownerDocument.createElement ('dt');  dt.textContent = c + 'から始まる';  dt.id = 'list' + i;  e.parentNode.insertBefore (dt, e); } var dd = Array.prototype.slice.call (document.querySelectorAll ('#hoge dd')); var cs = dd.map (firstCharType); for (var idx, t = null, i = 0; c = cs[i]; i++)  if (c !== t)   appendDT (dd[i], c, idx++), t = c;

関連するQ&A

  • <dt>に隙間を入れる方法

    <DL class="goo"> <DT>あああ</DT> <DD>いいい</DD> <!-- この間 --> <DT>AAA</DT> <DD>BBB</DD> </DL> というHTMLを書きましたが、<DD>いいい</DD>と<DT>AAA</DT>の間を入れることがCSSでできません。どうしたら隙間をいれることができるのでしょいうか?

    • ベストアンサー
    • HTML
  • Perl ファイル一気読み後の正規表現について

    Perlで以下の通り、 htmlファイルを全て読み込んだ後に正規表現を当てたいのですが、うまくいきません。 恐縮ですが、原因をご存知の方いらっしゃいましたら教えて頂けませんでしょうか。 また、他に良い解決方法がありましたら教えて頂けると幸いです。 ※PC環境はwindows7, perl5.12です。情報に不足がございましたらご指摘下さい。 ----- #--test.html(左側の数字は行数) 000001 <dl> 000002 <dt>aaa</dt> 000003 <dd>12345</dd> 000004 </dl> (中略) 120001 <dl> 120002 <dt>bbb</dt> 120003 <dd>6789</dd> 120004 </dl> #--test.pl open IN , "test.html"; local $/ = undef; $data = <IN>; close IN; $data =~ s|<td>bbb</td>|<td>ccc</td>|; print "$data\n"; ----- ファイルの始めの方だと当たるのに、後半では当たりません。 正規表現の対象として大きすぎるんでしょうか・・・。 $data =~ s|<td>aaa</td>|<td>ccc</td>|; は、当たりますが $data =~ s|<td>bbb</td>|<td>ccc</td>|; だと当たりません。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • VBA オブジェクト追加

    現在VBAで既存のオブジェクトをカスタマイズする必要があります。 aaaというオブジェクトの下に、新たに自分で オブジェクトメンバを追加し、そこにオブジェクト、プロパティを 配置していきく必要があります。 (顧客配布時に、一貫したコーディングが出来るように) aaa.aab.aac と言うものに aaa.BBB.CCC aaa.BBB.QQQ といった形に、発展させて行きたいのですが こう言ったことが出来ますか? ちなみに、aaaオブジェクトの詳細はブラックボックスです。 そして、このこれらを、コーディング時の参照リストにも 追加したいです。 稚拙な質問で申し訳ないですが、よろしくお願いします。

  • データ整理のシェルスクリプト

    AAA AAA BBB BBB CCC CCC 上記のようなデータがテキストで1万行程度あります。このデータを AAA@hoge.com AAA BBB@hoge.com BBB CCC@hoge.com CCC 上記のような形にしたいのです、hoge.comとAAAの間はTabです。 スクリプト1発で可能でしょうか、それともテキストエディタ+エクセルでやらなければならないでしょうか? お分かりになる方、方法等教えてください。 よろしくお願いします。

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • cssのみで折りたたみまたはプルダウン

    javascriptを使わずに、IE6に対応させた 縦並びの「折りたたみ」または「プルダウン」メニューのようなものを、 いろいろやっても作れず、助けてください! ソースは以下です <dl> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> <dt id="Name"><a href="#">おなまえ</a></dt> <dd id="Profile">プロフィールプロフィールプロフィールプロフィールプロフィールプロフィール</dd> </dl>

  • 重複データを省いて集計する方法について

    お世話になります。 現在、重複データを省いて集計する方法を考えているのですが、実現できておりません。 実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。 # 私の使用しているのは、PostgreSQL8.3となります。 実現したい内容は、以下となります。  ・テーブルAからID単位で人数を集計。 ※但しファイル名が同じ場合は、1つとして集計する。   group by句でID,ファイルをグループ化してみたのですが、うまくいきません。    【テーブルA】    ID  ファイル  人数    0001 aaa.txt  3    0001 aaa.txt  3    0001 aaa.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0001 bbb.txt  3    0000 ccc.txt  3    0000 ccc.txt  3    0000 ccc.txt  3 欲しい結果は、以下となります。     ID  集計    0000 3    0001 6 お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

  • JavaScriptでオブジェクトを取得したい

    JavaScriptで特定の<dl>内の<dd>要素(複数)を取得したいと 思っています。<dd>要素の数はページにより変動しますので 不定です。 <dl id="myDL"> <dt>xxx</dt> <dd>@@@</dd> <dd>aaa</dd> </dl> どのようにすればよいでしょうか?

  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • エクセルVBAで重複する名前に(2)、(3)等をつける方法は?

    こんにちは。お世話になります。 以下のようなデータ(約1500件)があります。 データは分類と名称でソート済みです。 同じ分類のなかで同じ「名称」があった場合、B列の名称の直後に同一セル内で(2)や(3)を順に振っていくマクロを教えていただきたいのです。(1)は不要です。 下記の例では、ううう(2)、ううう(3)といった具合です。 よろしくお願いします。 A列 B列 C列 分類 名称 データ1 aaa あああ a aaa いいい b aaa ううう a aaa ううう a aaa ううう a aaa えええ b bbb かかか a bbb かかか a bbb ききき a bbb くくく b ccc さささ a ccc ししし b ccc すすす a ccc すすす a ccc すすす a ccc すすす a ccc せせせ a

専門家に質問してみよう