自動生成されたHTMLドキュメントで次の要素を非表示にしようとしています。
<p id="sitspagedesc" class="sitspagedesc">
</p>
一部のページでは、<p>
タグには内部値が含まれますが、他の例では、例に示すようにスペースのみを含めることができます。 HTMLの変更はオプションではないため、CSSのみを使用して非表示にする方法を見つける必要があります。
私はそれを使ってそれを隠そうとしました
.sitspagedesc:empty
{
display:none;
}
しかし、おそらく要素に含まれるスペースのため、これは機能しません。
誰か良いアイデアはありますか?
ありがとう:)
純粋なCSSではそれができないと思います。
しかし、少しのJavaScriptでそれを行うことができます。
var allParas = document.getElementsByTagName('p');
//filter by class name if desired...
for(var i=0;i<allParas.length;i++){
if(allParas[i].getElementsByTagName('*').length == 0){
allParas[i].style.display = 'none';
}
}
JQueryにアクセスできる場合は、組み込みのセレクターを使用してフィルタリングを行う方が少し簡単です。
$('p.sitspagedesc').each(function(){
if($(this).children().length == 0){
$(this).hide();
}
});
空白が無視されることを除いて、:empty
セレクターの機能を模倣したい場合、受け入れられた回答( scunliffe )はうまく機能しません。子要素のみをチェックし、これは選択した要素内の直接のテキストを考慮しません。たとえば、<p>Hello World!</p>
には空白以外のテキストが含まれていても子要素がないため、空として扱われます。
私のソリューションは jQuery.trim() 関数を使用して、選択した要素とその子孫の結合されたテキストコンテンツを含む 。text() 値から先頭と末尾の空白を削除します。したがって、空白以外のテキストと子要素が含まれていない場合、選択した要素は非表示になります。 :emptyセレクターと同様に、HTMLコメントは.text()または.children()値のいずれにも反映されないため、コンテンツとしてカウントされません。
$('p.sitspagedesc').each(function(){
if($.trim($(this).text()) == '' && $(this).children().length == 0){
$(this).hide();
}
});
Fiddle at https://jsfiddle.net/TNTitan89/crejkbxq/ を参照してください。
回答:まだではありませんが、下書きです
https://drafts.csswg.org/selectors-4/#the-blank-pseudo
...そして、少なくともMozillaの場合、すでに接頭辞付きの実装があります... :-moz-only-whitespace
:
:empty
セレクターは確かに非常に厳密です。スペースを含む要素は空とは見なされません。だから2つの解決策があります
たぶん両方を組み合わせることができます。 :empty
セレクターはCSS3セレクターであり、IE8以前ではまだサポートされていないため、これらのブラウザーでは、空の要素がまったくレンダリングされないようにサーバー側のスクリプトを修正できない限り、JavaScriptフォールバックが適切な場合があります。レンダリング中に特別なクラスが与えられるため、JavaScriptは必要ありません。
標準ではありませんが、Firefoxには " :-moz-only-whitespace "があります。
また、いくつかの「将来の校正」について、 css-tricks は、CSSセレクターレベル4ドラフトの一部となる:blank
セレクターについて言及しています。現在のブラウザではサポートされていませんが、可能性はあります。
純粋なCSSで空の要素を検出する方法はまだありません(まだ)。 JavaScriptがオプションでない場合、ブラウザに到達する前にサーバーサイドでHTMLを操作するためにできることはありますか?
これが、jQuery 1.5.xを使用してクライアントに実装したソリューションです。//skip empty tags but which are valid
正規表現文字列を調整する必要がある場合があります。
$('*:only-child:empty').each(
function(index) {
var currentElement = $(this);
// skip singleton tags
if(/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i.test(currentElement.get(0).tagName) == true) {
return
}
// skip empty tags but which are valid
if(/^(?:textarea)$/i.test(currentElement.get(0).tagName) == true) {
return
}
while (currentElement.parent().children().length == 1) {
currentElement = currentElement.parent();
}
// so 0 or more children for the parent then we hide it
// we will never have more then 0 children though the :empty takes care of that
console.log('hidding: ' + currentElement);
currentElement.hide()
}
);