2011-06-27 20 views
2

入力をクリックするとimgが作成され、次に作成されたimgからhtmlまたはanyelseが取得されます。作成後にhtml要素を取得

しかし、なぜこれが機能していないのかわかりません!

は常に null

私のJSを返す:タイムアウト機能が異なる文脈フォームと呼ばれているので、

$("#click").click(function(){ 
    var $imgDone = $('<img/>').attr('src', 'someImage/insomewhere.jpg'); 
    $(this).after($imgDone); 
    setTimeout(function(){ 
      alert($(this).next().html()); 
    }, 1000); 
}); 

私はEXP:Demo

+0

他の人が説明していることに加えて、 'img'要素で' .html() 'を呼び出すと、とにかく何も返されません。これは単純なタグであり、内容はありません。 – kapa

+0

好奇心で、 '$ imgDone'を見つけたら、' $(this).next() 'で' 'を探す必要はありますか? –

+0

@Jonathan Lonowski:私には1つ以上の場所があります。 –

答えて

4

thissetIntervalで間違った場所を指しています。

以来thisあなたは外側のスコープを持っているが、あなたは通常window対象となり、コールバック、中に入ることthisと同じではありません。

setInterval(f, t) 

が実際に

window.setInterval(f, t); 
です

この問題を解決するには、

のコピーをに置きます。 0

効率のために、@ T.J。

$("#click").click(function(){ 
    var $this = $(this); 
    var $imgDone = $('<img/>') 
     .attr({src: 'someImage/insomewhere.jpg'}) 
     .insertAfter(this); // NB: not $this here 

    setTimeout(function(){ 
      alert($this.next().html()); 
    }, 1000); 
}); 

他の問題は.html()は、タグのインナー内容ではなく、タグ自身を示すことである:クラウダーはあなたが実際にjQueryのに少数の呼び出しを、そのコピーを取り、自分自身を保存するためにjQueryのコンストラクタを使用することができ、示唆します、imgタグには内容がありません。

要素の実際のHTML全体を返す組み込みjQueryメソッドはありません。これを行うには、エレメントを別のもの(たとえば<div>)に入れて、.html()にする必要があります。

ここで何かI found via Googleに触発され、これを実行し、私はちょうど作られたプラグインだ:「.htmlを()」メソッドを取得しますhttp://jsfiddle.net/alnitak/qaSmS/

+0

+1ですが、 'var $ this = $(this); 'で始まり、それを一貫して使用してください。これは、クロージャーの変数を作成している間に '$()'への不要な呼び出しを取り除き、同じものを2つではなく1つの方法で参照することによって透明性を高めます。三? –

+0

イェップ、忘れてしまった! tnks!作品perfet –

+0

@ T.J。ええ、良い点 - 私は編集しました。 – Alnitak

2

をマンデ、thisは適用されなくなりました。

$("#click").click(function(){ 
    var $imgDone = $('<img/>').attr('src', 'someImage/insomewhere.jpg'); 
    $(this).after($imgDone); 
    myImg = $(this); 
    setTimeout(function(){ 
      alert($(myImg).next().html()); 
    }, 1000); 
}); 
+2

再度 'myImg'に' $() 'を呼び出す必要はありません。 –

0

であなたの問題に

(function($) { 
    $.fn.outerhtml = function() { 
     return $('<div/>').append(this.clone()).html(); 
    }; 
})(jQuery); 

使用中のそれのデモ内容を含まず、コンテナ自体のマークアップ。

他の回答は、タイムアウトハンドラでthisの使用が正しいことを示しています。ただし、これを修正すると、アラートは空になります。

関連する問題