2

フィドル

私は何かばかげたことをしているに違いありませんが、これを理解することはできません。なぜこのスクリプトは、<p>タグからのテキストを console.log(ing) しないのですか?

HTML:

<div>
    <label>Display Name:</label>
    <div>
        <p>The room that its in.</p>
        <span class="edit"></span>
    </div>
</div>

jQuery:

if ($('span.edit').length > 0) {
    $(this).click(function(){
        var elem = $(this).prev();
        var text = elem.text();
        console.log(text);
        elem.html('<input type="text">' + text + '</input>');
    });
}
4

4 に答える 4

4

JavaScript はブロック スコープではありません。あなたは何thisになると思いますか?

修理済み:

if ($('span.edit').length > 0) {
    $('span.edit').click(function(){
        var elem = $(this).prev();
        var text = elem.text();
        console.log(text);
        elem.html('<input type="text" value="' + text + '" />');
    });
}

編集:html()入力ミスを修正するためにコンテンツを更新しました

于 2013-03-28T17:29:26.067 に答える
1

ここでの私の推測では、セレクターthisを参照する必要があります。span.edit

これはそうではありません。

長さがあるかどうかを確認する必要はありませんspan.edit。一致するものがない場合、クリック イベントはどの要素にもバインドされません。

したがって、コードは次のように簡略化できます。

$("span.edit").click(function(){
     var elem = $(this).prev();
     var text = elem.text();
     console.log(text);
     elem.html('<input type="text">' + text + '</input>');
});
于 2013-03-28T17:30:47.303 に答える
0

これはスパンを参照していないためです。ただし、以下のコードでは、スパンにバインドされます。

更新されたフィドル

$('.edit').click(function(){
    var elem = $(this).prev('p');
    var text = elem.text();
    elem.html('<input type="text">' + text + '</input>');
});

また、スパンは常にページに存在するため、長さを確認する必要はありません (少なくともフィドルでは)。さらに、それが存在しない場合、イベントはバインドされません。

于 2013-03-28T17:32:17.020 に答える
0

このifステートメントは不要です。そのような要素がない場合、クリック ハンドラーは何もしません。ハンドラーを の中に入れても、その要素に一致するようifに のスコープは変更されません。直接thisターゲットにするだけです:<span>

$('span.edit').click(function(){
    var elem = $(this).prev();
    var text = elem.text();
    console.log(text);
    elem.contents().unwrap().wrap('<input type="text">');
});
于 2013-03-28T17:33:48.107 に答える