私は持ってい<div>
ます; が含まれてい<span>
ます。をクリックすると、スパンが削除され、とを含む<div>
に置き換えられます。これはすべて順調です。<div>
<input>
<button>
をクリックすると、その<button>
親<div>
(追加されたもの) が削除され、再び に置き換えられるはず<span>
ですが、何かが間違っています。親<div>
は DOM の一部ではないようです!
とにかく、ここに簡単な例があります:
<div id="myPage">
<div id="clickMe" class="selectedField editMe">
<span>Click Me</span>
</div>
</div>
いくつかの HTML ですが、派手すぎません。ただし、DOM は変化し続けるため.on
、イベントを委任していました。JavaScript は次のとおりです。
$(function(){
$('#myPage').on('click', '.selectedField', function () {
if($(this).hasClass('editMe')){
var $this = $(this).toggleClass('editMe editing'),
$input = $('<input/>', {
placeholder: 'type something...'
}),
$cancel = $('<button></button>', {
class: 'cancel',
type: 'button',
html: 'x'
})
$this.children('span').replaceWith($('<div></div>').append($input, $cancel));
}
});
$('#myPage').on('click', '.selectedField .cancel', function () {
var $this = $(this).closest('.selectedField').toggleClass('editMe editing');
console.log($this.children('div')[0]);
$this.children('div').replaceWith('<span>Click Me</span>');
});
});
デモ: http://jsfiddle.net/Z8abW/
これは簡単に見えますよね?<span>
ボックスをクリックするとが に置き換わり、<div>
(新しく追加された)<button>
をクリックすると が元に<span>
戻ります。
しかし、これはうまくいきません。最初のイベントが機能します。<input>
をクリックしてとを追加できますが<button>
、 をクリックして<button>
も機能しません。
説明の仕方がわかりませんが、<div>
削除したいのは DOM の一部ではないようです! をクリックして<button>
も、ページで何も起こりません。console.log
イベントが実行されていることを確認するために を追加しました。確かにそうでしたが、何かがおかしいです。
Chrome 27 を使用していますが、そのコンソールには優れた機能があります。要素を DOMする場合console.log
、ログでそれらの上にカーソルを置くと、ページで強調表示されます。console.log($this[0])
すると、期待どおりに要素が強調表示されました。しかし、私がやったときconsole.log($this.children('div')[0]);
、要素はページで強調表示されませんでした! なぜだめですか?なんらかの理由で、要素がDOMにないと思います。コンソールにログ<div>
を記録しますが、実際の DOM のものではないようです。
このため、$this.children('div').replaceWith
ラインは何もしません!
どうしたの!を に置き換えることができるのに、その逆はできないのはなぜ<span>
ですか<div>
?