0

(DOM をトラバースすることによって) jQuery セレクターの結果が実際に DOM 要素を見つけたかどうかを判断しようとしていますが、いくつか問題があります。変数がこのインスタンスと等しいundefinedか、または機能するかどうかを確認することで考えましたが、そうではありませんでした。nullここで基本的な何かが欠けているように感じます。どんな助けでも大歓迎です。

これが私の例です。

jsフィドル

HTML

<ul>
    <li>

    </li>
</ul>

<div id="results"></div>

JavaScript/jQuery

var
    $element = $("ul li"),
    $parent = $element.parent().closest("li"),//this is the selector that is giving me the issue
    $r = $("#results")//just used to append the results of the if statement below
    ;

$r.append("<br />$parent = " + $parent);
$r.append("<br />typeof $parent = " + typeof $parent);
$r.append("<br />$parent.length = " + $parent.length);
$r.append("<br />$parent[0] = " + $parent[0] + "<br />");//for Chrome

if ($parent === "null") { $r.append("<br />$parent === 'null'") }//not expected to work, just testing
if ($parent === null) { $r.append("<br />$parent === null") }//not expected to work, just testing
if ($parent == null) { $r.append("<br />$parent == null") }//not expected to work, just testing

if ($parent === "undefined") { $r.append("<br />$parent === 'undefined'") }
if ($parent === undefined) { $r.append("<br />$parent === undefined") }
if ($parent == undefined) { $r.append("<br />$parent == undefined") }

if ($parent[0] === "undefined") { $r.append("<br />$parent[0] === 'undefined'") }
if ($parent[0] === undefined) { $r.append("<br />$parent[0] === undefined") }
if ($parent[0] == undefined) { $r.append("<br />$parent[0] == undefined") }

if (typeof $parent === "undefined") { $r.append("<br />typeof $parent === 'undefined'") }
if (typeof $parent === undefined) { $r.append("<br />typeof $parent === undefined") }
if (typeof $parent == undefined) { $r.append("<br />typeof $parent == undefined") }


if (typeof $parent[0] === "undefined") { $r.append("<br />typeof $parent[0] === 'undefined'") }
if (typeof $parent[0] === undefined) { $r.append("<br />typeof $parent[0] === undefined") }
if (typeof $parent[0] == undefined) { $r.append("<br />typeof $parent[0] == undefined") }

if ($parent.length == 0) { $r.append("<br />$parent.length == 0") }

jsフィドル

これらが返されtrueました。$parent[0] === undefinedそして$parent[0] == undefinedそしてtypeof $parent[0] === 'undefined';

jQuery セレクターが DOM オブジェクトを見つけられず、 element がないため、これは理にかなっています[0]console.logChromeのオブジェクトで使用するにはこれが必要なため、これを試しただけです。しかし、私はこれが正しいとは思いません。

$parent.length == 0期待どおりに動作します。しかし、これは!== undefined' and!== null` で必要ですか?

前もって感謝します!

4

1 に答える 1

1

セレクターまたはトラバーサルの結果、一致する要素がゼロの場合length、jQueryオブジェクトのプロパティはに等しくなり0ます。要素が一致するかどうかをチェックする標準の(そして必要なだけの)方法は次のとおりです。

jQueryObject.length === 0

null要素を選択するすべてのjQuery関数は、それ自体がjQueryオブジェクト(一致する要素を含む)を返すため、その結果がまたはになることは不可能ですundefined。常にオブジェクトを返し、そのオブジェクトには常にlengthプロパティがあります。

あなたの特定の例を見てください:

var $element = $("ul li"),
    $parent = $element.parent().closest("li")

そのコードの実行時に<li>要素内に要素がない場合は、空のjQueryオブジェクト(に等しいプロパティを持つjQueryオブジェクト)になります。呼び出すと空のjQueryオブジェクトが返され、次に呼び出すと空のjQueryオブジェクトも返されます。<ul>$elementlength0$element.parent().closest('li')

ここで、コードの実行時に<li>要素内に要素があると仮定します。<ul>この場合、$elementは空ではないjQueryオブジェクトになります。それらはすべて親を持っているので、呼び出す$parentといくつかの要素を含むjQueryオブジェクトが返されます。ただし、これらの要素のいずれにも要素<li>とドキュメントの間に要素がない場合は.closest('li')、空のjQueryオブジェクトが返されます。

于 2013-02-01T16:19:21.760 に答える