
現在のURLに/aaa/bbb/または/ddd/というパスが含まれていた場合、特定の要素(class)を非表示にする、というJSのコードを教えてほしいです。
いろいろ調べて自分なりに以下のコードを書いてみたのですが
上手く動作せずに困っています。初心者です。
if (location.pathname.includes('/aaa/bbb/') || location.pathname.includes('/ddd/')) {
const elements = document.querySelectorAll('.btn active');
for (let i = 0; i < elements.length; i++) {
elements[i].style.display = 'none';
}
}
特定の要素という部分というのは、
以下のようなボタンに付与されているクラスを消したいという意図になります。
<div class="btn">●●●</div>
↓ 一定の距離をスクロールするとactiveが付与されてボタンが表示される
<div class="btn active">●●●</div>
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
こんにちは
すでに適切な回答がされていますが・・
>上手く動作せずに困っています。初心者です。
とのことですので。
一番の原因は、既に指摘にある通りセレクタの指定と思われます。
ご提示のスクリプトの「 .btn active 」は「btnクラスを持つ要素の子要素でactiveという名称の要素」を意味することになります。(多分、そのような要素は存在しないでしょう)
「両方のクラスを持っている要素」を指定したければ「 .btn.active 」とすることが必要です。
ただし、この場合は「スクリプトを実行した際に、両方のクラスを有する要素」だけが対象になります。
>一定の距離をスクロールするとactiveが付与されて~
とありますが、その後に、他の要素や当該要素に再度activeクラスが付されることを防止するものではありません。
ですので、もしかすると質問者様の意図するところとは違っているかもしれません。
もしも、「btnクラスの要素は表示させないようにする」のであれば、対象は「 .btn 」ということになりそうです。
また、スクリプトを実行しているタイミングが不明ですけれど、ブラウザがHTMLの解釈を終えた時点で実行していないと、そもそも要素の取得ができません。
具体的には、当該<script>タグを</body>の直前に置いておくか、あるいはaddEventListener()などでDOM解釈終了後に実行するように指定しておくなどです。
他にも方法はありますが、bodyの閉じタグの直前に置くのが簡単と思います。
一方で、
>以下のようなボタンに付与されているクラスを消したい~
ご提示のスクリプトの
>elements[i].style.display = 'none';
は、クラスを削除するのではなく、要素のスタイル属性で「非表示」に設定するものです。
文言通り、「クラスを削除」したいのであれば、
elements[i].classList.remove('active');
などとする必要があります。
あるいは、「非表示」設定ではなく、要素そのものをDOMから削除してしまうのであれば、
elements[i].remove();
で可能です。
このあたりについて、質問者様の意図に合うように修正なされば、ご希望のようになるものと思います。
以下は、直接ご質問とは関係ありませんが、ついでながら・・・
・要素リストではforEachを使えますので、全部の要素をループするのなら、forループで改め行わなくても直接ループすることも可能です。
document.querySelectorAll(~~).forEach(
// 個々の要素の処理
);
のような要領です。
・includesで文字列の有無を判定していますが、対象が複数になると面倒ですよね。
(ご例示の場合は、ふたつなので、たいしたことはありませんが・・)
No1様が配列に設定しておいて繰り返す方法を示していらっしゃいますが、正規表現を利用する方法も考えられるでしょう。
if( /\/(aaa\/bbb|ddd)\//.test(location.pathname))
とすることで、ご提示の条件判断と同様の判定が可能です。
(「/」のエスケープで「¥/」となっている関係で少々視認性が悪いですが、強力な手段として利用できると思います)
仮に「条件に合致したら、.btn要素を全部非表示設定にする」ので良ければ、上記を反映して記述すると
if( /\/(aaa\/bbb|ddd)\//.test(location.pathname))
document.querySelectorAll('.btn').forEach( e => {
e.style.display = 'none';
});
のようなスクリプトでも動作すると思います。
(</body>の直前に記述することに関しては同様です)
ご丁寧にありがとうございます。
早速、ご提案いただいたコードで試してみたのですが、
全ページのボタンが非表示になってしまいまして、まだ解決できておりません。度々で申し訳ありませんがご教授いただけないでしょうか。
実際に記述したコード
if( /\/(campaign_page\/seminar|forms)\//.test(location.pathname))
document.querySelectorAll('.bottom_btn').forEach( e => {
e.style.display = 'none';
});
デベロッパーツールのconsoleで確認したところ、
Uncaught SyntaxError: Invalid or unexpected tokenというエラーが表示されており、下記の記述に誤りがあるような指摘が返ってきました。
/\/(campaign_page\/seminar|forms)\//.test(location.pathname)
どこか間違っている部分があるのでしょうか?
また.testという部分はlocation.pathnameで取得した値を格納する変数という理解であってますでしょうか。
No.1
- 回答日時:
querySelectorAll で使用するセレクター文法には、
特有の癖が有るのでお気を付けください。
誤: '.btn active' ← 空白は "子孫コンビネーター" と見なされる
正: '.btn.active'
参考)
https://developer.mozilla.org/ja/docs/Learn/CSS/ …
ご質問にある「~するとactiveが付与されて」ならば、
'.btn.active' だけを対象にしても中途半端になりますので、
もうすこし一般化して以下のように処理しては如何でしょうか。
<style>
/* .btn.active より優先されるルールを定義 */
.btn.active.inact { display: none; }
</style>
<script>
var ボタン消去 = elem => elem.classList.toggle("inact", true);
var 候補 = ["/aaa/bbb/", "/ddd/"];
var 削除条件 = 候補.some(x => location.pathname.includes(x));
if (削除条件) document.querySelectorAll('.btn').forEach(ボタン消去);
</script>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript JavaScript|特定URLだった時、特定の要素を変更するコードの書き方を教えてほしいです 2 2023/08/25 21:43
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- その他(プログラミング・Web制作) pythonでのカーソル移動がずれる 2 2023/07/30 08:51
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
指定字数以降隠す
-
プルダウンメニュ 展開時にずら...
-
ホームページ(デフォルトペー...
-
VBAのことについて教えてくださ...
-
特定のものにだけスクリプトを...
-
jQueryで指定した要素自身のHTML
-
チェックボックスでCSSを表示切...
-
隣のフレームの中のスタイルを...
-
ランダムにメッセージを表示さ...
-
Dragdealer JSの二つ以上の設置
-
ラジオボタンの選択後に詳細記...
-
アコーディオン
-
javascriptで指定するdivを読み...
-
javascriptのCSSクラス追加...
-
onkeyupなどで自動でフォームに...
-
MAX関数を使ってからLEFT JOIN...
-
プルダウンメニューでページ内...
-
document.write以外の方法での...
-
パララックスが出来ない。
-
POSTについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
IFRAMEの表示/非表示を切り替え...
-
removeEventListenerについて
-
背景色を透明化
-
createElementで作成した要素を...
-
javascriptでpostした値が取得...
-
読み込んだQRコードをフォーム...
-
iframe内のリンクが飛ばないの...
-
jQueryでクリックされた要素のi...
-
ダブルクォーテーションが消え...
-
<div ~ </div> で囲まれたテキ...
-
【HP作成】クリックすると下...
-
<Div>の中の要素の数を調べる
-
jQueryで特定id以外の下にある...
-
VBScript+IEのチェックボック...
-
removeAttribute()メソッドで削...
-
折りたたみ部分にアンカーでリ...
-
onclickを利用した伸縮メニュー...
-
背景色を一定時間ごとにランダ...
おすすめ情報