teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

javascriptでHTMLの構造を変更する方法

2015/09/14 03:22

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

answer CHANGED
@@ -13,6 +13,38 @@
13
13
 
14
14
  参考: [HTML aタグの中にaタグを入れると崩れる](http://chaika.hatenablog.com/entry/2014/04/24/234351)
15
15
 
16
- ---
16
+ ---
17
17
 
18
- 或いは、(2)の<img>を別の<a>タグで囲み、(1)のリンクはそのままにしておき、javascriptで<li>クリック時に(2)のエリアでなければ、`a.hoge3`をクリックしたことにするイベントを付けてしまう方法でも実現できそうにかと思います。
18
+ 或いは、(2)の<img>を別の<a>タグで囲み、(1)のリンクはそのままにしておき、javascriptで<li>クリック時に(2)のエリアでなければ、`a.hoge3`をクリックしたことにするイベントを付けてしまう方法でも実現できそうにかと思います。
19
+
20
+ ---
21
+
22
+ 追記: jQueryでHTML構造を変更する方法
23
+ `a.hoge3`をcloneして使えばclassやdata-kz-track-on-clickなど丸っと持って行くことができます。
24
+ まだリファクタリング出来ると思いますが、ざっくり処理を書いてみます。
25
+ (1)
26
+ ```javascript
27
+ jQuery('#hogeid1').find('li').each(function(i, elm) {
28
+ var $li = jQuery(elm),
29
+ $content = jQuery($li.html()), // 構造変更の度にレンダリングしないように外に取り出して使う
30
+ $a = $li.find('a.hoge3').clone(),
31
+ $linkArea = $content.find('.hoge2');
32
+ // aタグをspanに置き換える
33
+ $linkArea.html( '<span class="hoge3">' + $linkArea.text() + '</span>' );
34
+ // aタグでラップしたものでliの中身を置き換える。
35
+ $li.html( $a.html( $content ) );
36
+ });
37
+ ```
38
+
39
+ (2)
40
+ ```javascript
41
+ jQuery('#hogeid1').find('li').each(function(i, elm) {
42
+ var $li = jQuery(elm),
43
+ $a = $li.find('a.hoge3').clone(),
44
+ $img = $li.find('img');
45
+ // imgタグをaタグでラップしてliの先頭に追加
46
+ $li.prepend( $a.html($img) );
47
+ });
48
+ ```
49
+ 'a.hoge3'は`.hoge3`でも大丈夫です。jQueryのclassセレクタはタグ名があった方が高速な場合もあるようです。
50
+ 参考: [jQueryのclassセレクタに要素名を付ける](http://blog.webcreativepark.net/2014/12/02-013527.html)

1

javacriptでの実現方法案の追記

2015/09/14 03:22

投稿

KiKiKi_KiKi
KiKiKi_KiKi

スコア596

answer CHANGED
@@ -11,4 +11,8 @@
11
11
  0. (2)のz-indxを(1)より上にしてpositionを使って(1)のエリアの上に重ねる
12
12
  ただ、全体がリンクっぽいのにクリックする場所で遷移先が違うとUI的には少しキモチワルイかもしれません。
13
13
 
14
- 参考: [HTML aタグの中にaタグを入れると崩れる](http://chaika.hatenablog.com/entry/2014/04/24/234351)
14
+ 参考: [HTML aタグの中にaタグを入れると崩れる](http://chaika.hatenablog.com/entry/2014/04/24/234351)
15
+
16
+ ---
17
+
18
+ 或いは、(2)の<img>を別の<a>タグで囲み、(1)のリンクはそのままにしておき、javascriptで<li>クリック時に(2)のエリアでなければ、`a.hoge3`をクリックしたことにするイベントを付けてしまう方法でも実現できそうにかと思います。