
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ランキング
-
読み込んだQRコードをフォーム...
-
MAX関数を使ってからLEFT JOIN...
-
同一ページ内リンクで、クロス...
-
getElementByIdの戻り値がnull...
-
テキストエリア内の一部の文字...
-
IFRAMEの表示/非表示を切り替え...
-
createElementで作成した要素を...
-
jspでcssが読み込めない
-
画面の表示位置を指定させて表...
-
ページ読込中に表示が崩れるの...
-
MFCで画像を表示させているので...
-
【CSS】floatで左右に並べた...
-
「画像の上を流れる文字列」を...
-
jQueryで特定のURLの時のみ表示
-
Gifアニメ、最後のコマに行った...
-
Javascript で共通の処理をどこ...
-
JSPでの画像ファイル表示
-
pythonで、tkinterとpillowの組...
-
一定時間で入れ替わるバナー画...
-
多階層ドロップダウンのスマホ...
マンスリーランキングこのカテゴリの人気マンスリー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を利用した伸縮メニュー...
-
背景色を一定時間ごとにランダ...
おすすめ情報