
HTMLの制御にjQueryを使用しています。
作業の流れで、#contents以外の要素に存在する特定のクラスを削除したいと思っています。
対象ソースをコンパクトに書くと
<body>
<div id="contents">
<p class="test">moji</p>
</div>
<div id="etc">
<p class="test">moji</p>
</div>
<div id="etc2">
<p class="test">moji</p>
</div>
</body>
というもので、contents以外のetc,etc2にあるclass="test"をremoveしたいのです。
※cotents以外はidがイロイロ変わるので、「contents以外」でやろうとしています。
jQueryのマニュアルを見ながら、次のようなコードを書きました。
jQuery("*").not("#contents").hasClass("test").removeClass("test");
しかし、実行がうまくいきません。
FireFoxのFireBugで動作を見てみると「functionがない」というメッセージなっています。
jQuery("*").not("#contents").each( function() {
jQuery(this).hasClass("test").each( function() {
jQuery(this).removeClass("test");
});
});
でも同じ結果でした。
何か良い方法はないでしょうか。
No.4ベストアンサー
- 回答日時:
id="contents"の上層にもdivがあるからでしょうか?
その辺を考慮すると今までの考え方だとソースが少し煩雑になるので、
一度全てのclass="test"要素を取得してからid="contents"下の要素を
除外するのが良いかと思います。
jQuery('.test:not(#contents .test)').removeClass('test');
notメソッドを使う場合は、
jQuery('.test').not('#contents .test').removeClass('test');
余談ですが、
タグが固定できる場合は固定した方が実行速度が速いです。jQueryは特に。
jQuery('p.test').not('div#contents p.test').removeClass('test');
できました!
ありがごうとざいます。
御返事が遅くなって申し訳ありません。
質問のソースが端折りすぎたためにお手数をおかけしました。
思い通りの動作です。
ずっと悩んでいたので、とても感激です。
ありがとうございました。
No.3
- 回答日時:
補足です。
回答2に書いたものはdiv階層にかかわらず除外するようにできています。
2つめのnotの中にある'#contents div'は、
id="contents"の子孫要素のdivという意味です。
この辺はjQueryというよりCSS Selectorの範疇です。
この回答への補足
昨晩戻ってきました。
早速試してみましたが、旨くいきませんでした。
旨く排除できずでいます。
試しに下記のようなコードで反応を見てみました。
jQuery('div').not('#contents').not('#contents div').find('.test').css("border","1px solid red");
jQuery('div').not('#contents').find('.test').css("border","1px solid red");
jQuery('div').not('#contents div').find('.test').css("border","1px solid red");
なぜか全てのクラスに反応してしまいます。
notの動作が思っているような動きではないのかな?
と思ったりもします。
失礼しました。
目的id以下のdivの数だけ、排除処理が必要だと勘違いしていました。
今、モバイルからのアクセスなので、パソコンが使える環境になりましたら、改めてご報告いたします。
No.2
- 回答日時:
質問にあるコンパクト化したソースなら動くはずですが、
div#contentsの中に更にdivがワンクッション入っていると↓
<body>
<div id="contents">
<div>
<p class="test">moji</p>
</div>
</div>
…
</body>
中間のdivは除外されないので、想定した動きにならないです。
中間のdivも除外するなら
$('div').not('#contents').not('#contents div').find('.test').removeClass('test');
としてみてください。
この回答への補足
ソースに一部誤りがありました。
jQuery("#contents").find(".test").addClass("escape");
jQuery(".test").each( function(){
if( jQuery(this).hasClass("escape") == false ){
jQuery(this).removeClass("test");
}
});
jQuery("#contents").find(".test").removeClass("escape");
回答ありがとうございます。
#contentsの下のDIV階層は固定できないので、別な方法を考えました。
jQuery("#contents").find(".test").addClass("escape");
jQuery(".test").each( function(){
if( jQuery(this).hasClass("_escape") == false ){
jQuery(this).removeClass("test");
}
});
jQuery("#contents").find(".test").removeClass("escape");
あまり綺麗なやり方ではないかも知れません。
とりあえず目的は達することはできました。
もっとシンプルな方法をもう少し考えてみます。
No.1
- 回答日時:
hasClassの戻り値はjQueryオブジェクトではなく真偽値なので、
その後にメソッド・チェーンを続けることができません。
子孫要素を指定にはfindメソッドを使います。
あと、全要素指定の"*"はnotと組み合わせると想定した動きにならないので、
divを指定した方がいいです。
$('div').not('#contents').find('.test').removeClass('test');
jQueryの場合CSS3が使えるので、こういう記述もできます。
$('div:not(#contents) .test').removeClass('test');
ちなみに1つのjQueryオブジェクトにまとめられた全ての要素に対して
同じjQueryメソッドを適用する場合、わざわざeachメソッドを使う必要はないです。
この回答への補足
回答ありがとうございます。
hasClassは真偽値だったんですね。
確認不足でした。
コードを試してみましたが、残念ながら旨くいきませんでした。
$('div').not('#contents').find('.test').css("border","1px solid red");
$('div:not(#contents) ._test').css("border","1px solid red");
上記で試してみたところcontentsの下のクラスもborderが適用されます。
さらに
jQuery('div').not('#contents').css("border","1px solid green");
というののも試してみたのですが、これでも全ての要素のborderが適用されます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- JavaScript vertical sliderをautoplayしたい 2 2022/08/25 14:47
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- JavaScript javascriptで移動ボタンを押した際に遷移するボタンを追記したい 1 2022/11/29 03:02
- Visual Basic(VBA) Selenium Basicの件 5 2023/04/10 20:55
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS PCサイズで赤い画像2つと、青い画像2つがそれぞれ横に2つずつ並んでいるのですが、これをスマホサイズ 5 2022/04/11 12:01
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jQueryで特定id以外の下にある...
-
折りたたみタグ 他を閉じる(...
-
ラジオボタンの切替で表示する...
-
xmlの同一要素名を配列に入れる...
-
JQueryタブの切替 タブからタ...
-
innerHTMLに入れたリンクが反応...
-
displayの状態を取得したい
-
document.all.id1.innerText="ok";
-
JavaScript オンマウスで画像...
-
複数のリンク画像を一定時間で...
-
10秒後に1秒ごとに1行づつ表示...
-
[急ぎ] videoタグで埋め込んだm...
-
読み込んだQRコードをフォーム...
-
クリックすると隠れたテキスト...
-
jqueryを使って無駄なspanタグ...
-
JavascriptでDIV~DIVをリロードで
-
クリックで特定のdiv要素が表示...
-
MAX関数を使ってからLEFT JOIN...
-
classList で、class名が付かな...
-
lightbox 誤作動 JAVA
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MAX関数を使ってからLEFT JOIN...
-
javascriptテキストBOX色を元に...
-
読み込んだQRコードをフォーム...
-
指定したパスが現URLに含まれて...
-
removeEventListenerについて
-
iframe内のリンクが飛ばないの...
-
createElementで作成した要素を...
-
IFRAMEの表示/非表示を切り替え...
-
jQueryで同じ要素の先頭へ親要...
-
ページ読み込み完了の3秒後にリ...
-
jQueryで特定id以外の下にある...
-
jQueryで同じid属性が複数あっ...
-
表示・非表示のスクリプトで、...
-
jQueryでシンプルドラッグドロ...
-
Gif画像のアニメーションが再生...
-
【HP作成】クリックすると下...
-
クリックすると下に説明文が出...
-
背景色を透明化
-
プルダウンとチェックボックス...
-
javascriptでpostした値が取得...
おすすめ情報