質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

673閲覧

【IE】子が○○な親 (直下の子要素が a である div/th/td) をセレクトしたい。

BetterEveryday

総合スコア19

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2020/05/05 01:40

編集2020/05/05 01:43

前提・実現したいこと

リンク有無により hover 時に左罫線の色を変更する。
イメージ説明

|リンク|条件: 例|期待値: 例|イメージ|
|:--|:--:|--:|
|あり|<a> タグが続く <div> タグ|<div> の border-left-color を変更する (グレーにする)|イメージ説明|
|なし|<a> タグが続かない <div>|div> の border-left-color を変更しない (赤のまま)| |

発生している問題

JavaScript で選択要素にクラスを付与しているが、
IE に限り、子要素に <a> タグが続いても罫線の色が変わらない。(赤のまま)

子が○○な親を特定でき、かつ IE 不具合も回避できる実装方法を探しています。 (現状は JavaScript で実装していますが、実現可能なら CSS 単独への手段変更も OK です。)

該当のソースコード

JavaScript

1 window.addEventListener('DOMContentLoaded', ()=>{ 2 document.querySelectorAll('div').forEach(x=>{ 3 var flg=(x.querySelectorAll('a').length > 0); 4 x.classList.toggle('indexLink',flg); 5 }); 6 }); 7 window.addEventListener('DOMContentLoaded', ()=>{ 8 document.querySelectorAll('th').forEach(x=>{ 9 var flg=(x.querySelectorAll('a').length > 0); 10 x.classList.toggle('indexLink',flg); 11 }); 12 }); 13 window.addEventListener('DOMContentLoaded', ()=>{ 14 document.querySelectorAll('td').forEach(x=>{ 15 var flg=(x.querySelectorAll('a').length > 0); 16 x.classList.toggle('indexLink',flg); 17 }); 18 }); 19

CSS

1a:hover { color:crimson; } 2tr.indexLevel1 { 3 background-color: #dedede; 4} 5td.indexLevel1 { 6 border-width: 0px 0px 0px 10pt; 7 border-style: none none none solid; 8 border-color: black black black crimson; 9 border-radius: 1px; 10 vertical-align: middle; 11} 12td.indexLevel1 a { 13 vertical-align: middle; 14} 15.indexLink:hover { 16 border-color:black black black gray; 17} 18 19div.tableIndex { 20 width: 100%; 21 background-color: #dedede; 22 -webkit-box-sizing:border-box; 23 -moz-box-sizing:border-box; 24 box-sizing:border-box; 25 font-weight:bold; 26 box-shadow:none; 27 position:relative; 28 padding-left:.5em; 29 line-height:1.4; 30 font-size:1.1em; 31 border-width: 0px 0px 0px 10pt; 32 border-style: none none none solid; 33 border-color: black black black crimson; 34 border-radius: 1px; 35} 36div.indexLevel1 { 37 display: flex; 38 align-items: center; 39}

HTml

1<table width="100%" class="ms-rteTable-default " cellspacing="0"> 2 <tbody> 3 <tr class="ms-rteTableHeaderRow-default indexLevel1"> 4 <td valign="middle" class="ms-rteTableHeaderLastCol-default indexLevel1"> 5 <a href="#"> 6 <h3> 7 <span class="ms-rteThemeForeColor-1-5"><strong>■Link&#160;リンクあり【table タグ】</strong></span> 8 </h3> 9 </a> 10 </td> 11 </tr> 12 </tbody> 13</table> 14<br> 15<table width="100%" class="ms-rteTable-default " cellspacing="0"> 16 <tbody> 17 <tr class="ms-rteTableHeaderRow-default indexLevel1 indexLabel"> 18 <td class="ms-rteTableHeaderLastCol-default indexLevel1"> 19 <h3> 20 <span class="ms-rteThemeForeColor-1-5"><strong>■Link&#160;リンクなし【table タグ】</strong></span> 21 </h3> 22 </td> 23 </tr> 24 </tbody> 25</table> 26<br> 27<div class="tableIndex"> 28 <div class="indexLevel1"> 29 <a href="#"> 30 <h3> 31 <strong>■Link&#160;リンクあり【div タグ】</strong> 32 </h3> 33 </a> 34 </div> 35</div> 36<br> 37<div class="tableIndex"> 38 <div class="indexLevel1"> 39 <h3> 40 <strong>■Link&#160;リンクなし【div タグ】</strong> 41 </h3> 42 </div> 43</div>

試したこと

Google Chrome や Microsoft Edge では想定通りに動く。

補足情報(FW/ツールのバージョンなど)

ターゲット環境: Internet Explorer 11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

IEではアロー関数(=>)が使えません。トランスパイルを入れるか、functionに書き直すかをしましょう。

投稿2020/05/05 01:41

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/05 02:21

情報ありがとうございます。
BetterEveryday

2020/05/05 02:42 編集

maisumakun さん、AkitoshiManabe さん、 迅速に返信いただきましてありがとうございます。 以下に修正してみましたが、動きは変化しません。 window.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('div').forEach(function(x) { var flg=(x.querySelectorAll('a').length > 0); x.classList.toggle('indexLink',flg); }); }); IE11 では子要素を判断してクラスを追加できない、ということなのでしょうか? ターゲット環境が IE11 の場合、リンクの有無判断は諦め、あらかじめ 各要素に異なるクラス (リンクありとリンクなし) を定義するしかない、ということなのでしょうか?
AkitoshiManabe

2020/05/05 03:31

think49 さん、情報ありがとうございます
BetterEveryday

2020/05/05 05:40

think49 さん、AkitoshiManabe さん、 ご検討ありがとうございます。 みなさんの会話に catch up できていません。 自分で確認/理解できたことは以下のみの状態です。 1. コンソールでエラーが出力されること 2. 対応方法は 3 種類ある。(1.「トランスパイル」2. Prototype.js 3. Polyfill) 具体的にどうすればよいのか、が理解できていないのですが、 以下を試してみたら - アロー関数を function に変更 - AkitoshiManabe さんが示していただいた dom.js を参照してみた - think49 さんが示していただいた Polyfill のコードを内包してみた 以下のエラーになりました。 「オブジェクトは 'forEach' プロパティまたはメソッドをサポートしていません。」 「トランスパイル」でなければ対応できない、ということなのでしょうか? 「トランスパイル」をキーワード検索してみましたが、 「トランスパイルを入れる、介する」とは、なにをすべきなのか、に辿り着けていません。 砕いた説明を探したいのですが、なにかヒントはありませんか? お手数をお掛けしまして申し訳ございません。 どうぞよろしくお願いいたします。
think49

2020/05/05 05:56 編集

そこまで切り分け出来たのなら、forEachのPolyfillを探したり、 https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach#Polyfill forEach以外の手段で列挙させるなり、 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for 考えを昇華できませんか。 トランスパイルでなければ対応できないのは「アロー関数」のような新しい構文に対応する事です。 旧来の構文で書く分には問題ありませんし、新しいメソッド(classList.toggle)がないなら古いメソッド/プロパティ(className)で対応しても良いはずです。
BetterEveryday

2020/05/05 11:02

think49 さん、 ガイドどうもありがとうございます。 (forEach についても探すべきなのか、どのように探せるものなのか、を自分では明確に判断できませんでした。) forEach を NodeList の対象 element 分インクリメントする for 文に変更することで実現できました。 <script type='text/javascript' src='https://github.com/eligrey/classList.js/blob/master/classList.js'></script> <script> window.addEventListener('DOMContentLoaded', function (){ const cIndex = document.querySelectorAll('div'); for (let i = 0; i < cIndex.length; i++) { if (cIndex[i].querySelectorAll('a').length > 0) { cIndex[i].className = "indexLink " + cIndex[i].className; } } }); window.addEventListener('DOMContentLoaded', function (){ const cIndex = document.querySelectorAll('th'); for (let i = 0; i < cIndex.length; i++) { if (cIndex[i].querySelectorAll('a').length > 0) { cIndex[i].className = "indexLink " + cIndex[i].className; } } }); window.addEventListener('DOMContentLoaded', function (){ const cIndex = document.querySelectorAll('td'); for (let i = 0; i < cIndex.length; i++) { if (cIndex[i].querySelectorAll('a').length > 0) { cIndex[i].className = "indexLink " + cIndex[i].className; } } }); </script> また、構文とメソッドの新旧に関するご説明もどうもありがとうございます。 解説いただいたことにより、私にも通訳のように以下が理解できました。 構文: 記号での記述と function で括ることの違い メソッド: classList.toggle から className へ変更可能であること 今回も私の理解のためにお時間とお気持ちを、 助けていただきましてどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問