2010-11-18 3 views
3

私はJQueryでGreaseMonkeyスクリプトを書いています。これJquery:存在する場合は要素Aを選択するための慣用方法、そうでない場合は要素B?

<center><table><tr><td> 
Something interesting here.</td></tr>....</table></center> 

時にはそれがPタグ(またはいくつか)で物事を表示するのに対し、同じテーブル構造内の、::
時々私は、このように、TDに表示情報を変更するサイト

<center><table><tr><td> 
<p>Other text about the same interesting thing. 
<p>and maybe some more stuff too.</td></tr>...</table></center> 

今は<td>に対して<p>を選択するには2つの異なるセレクタを使用していますが、Pタグが存在する場合はそれを選択し、そうでない場合は1つのJqueryセレクタでTDを選択すると便利ですか?私が追加したいものはどちらの場合も同じです。単一のjQueryで

(私は関係なく、TDに追加する場合は、私のほかの変更の場所はPタグの存在/不在に基づいて、私は配置の一貫性のために行くよ。)

+1

あなたが投稿した内容は有効なマークアップではありません、あなたは完全な例を挙げられますか? –

+0

'td'要素は' p'要素だけを含んでいるか、要素を含んでいませんか? –

+0

@Nick Craver:それは有効ではないかもしれませんが、正確にはページ上のものかもしれません。閉じられていない 'p'タグがあるにもかかわらず、その意図は十分明確です。 –

答えて

1

をはい、あなたはjQueryのを拡張することにより、これを行うことができます。あなたのGMのファイルの先頭付近にこれを入れて

X = $("center > table > tbody > tr > td").substituteIfPresent ('p'); 

//-- Note that X is a standard jQuery object, the following works: 
X.css ('border', '1px solid green'); 


のみ最初psubstituteIfPresent()リターンのこのバージョンは:

$.fn.substituteIfPresent = function (tagName) 
{ 
    return this.map (function() 
    { 
     var childArray = $(this).children (tagName); 

     if (childArray.length) 
      return childArray[0]; 
     else 
      return this; 
    }); 
} 


を次にあなたが目的の要素を取得することができますタグ(存在する場合)。

+0

提案されているすべてのソリューションは本質的に 'if $( 'p')。length'を使って同じことをしていますが、これはJQuery-ishを私に見せてくれます。 :-) – Hellion

1

ない可能性一つだけ選択操作で良い方法がこれです

var $elem = $('p').length > 0 ? $('p') : $('table'); 

$elem.append(...); 
+0

var $ elem = $( 'p')。length? $( 'p'):$( 'table'); – mkoryak

0

var $el = (function(){ 
    var $td = $('td'), // you probably want a more precise selector here 
     $p = $td.find('p:last'); 

    return $p.length ? $p : $td; 
})(); 

これはを設定するステートメントが、あなたはこのような何かを行うことができます10から最後のp要素がある場合はそれに、それ以外の場合はtd要素になります。ページに複数のtd要素がある場合、これは予期しない結果になるので、より正確なセレクタを$('td')より使用する必要があります。

自己実行機能の理由は、余分な変数でスコープを汚染しないようにするためです。

1

私はこのために.map(または.each)を使用します。

$("center > table > tbody > tr > td").map(function() { 
    if($(this).find("p").length) { 
     $(this).find("p").css("border", "1px solid red"); 
    } else { 
     $(this).css("border", "1px solid green"); 
    } 
}); 

デモ:http://jsfiddle.net/tBWhH/3/

+1

値を返さないので、おそらく '.each()'を使うほうが少し意味があります。 :o) – user113716

+0

@パトリック - 良い点だが、その効果はどちらかと同じだと思う。私は最初にコレクションを返すことで遊んでいましたが、その後は少し混乱しました。 – karim79

+0

OPがどちらか一方を望んでいると思われるので、戻り値を使用してください。 http://jsfiddle.net/tBWhH/4/ – user113716

関連する問題