2012-03-12 4 views
0

イベントを.on()メソッドでフックしたい。問題は、イベントが発生する要素のオブジェクト参照を取得する方法がわかりません。たぶんそれは方法が実際に働く方法の中間理解です...しかし、私はあなたが助けることを願っています。ここでJonathanで.on()を使ってイベントをフックする

は私が何をしたいです:ファイルが選択されている場合

、私はパスがdiv要素で

<div class="wrapper"> 
    <input type="file" class="finput" /> 
    <div class="fpath">No file!</div> 
</div> 

を表示させたいここに私のスクリプトは

$(document).ready(function() { 
    $this = $(this); 

    $this.on("change", ".finput", {}, function() { 
     var path = $(this).val() 
     $(this).parents().children(".fpath").html(path.split("\\").pop()); 
    }); 
}); 

のようなものですそれだけでは機能しません。この

$(document).ready(function() { 
    $('.finput').on("change", function() { 
      var path = $(this).val() 
      $(this).parents().children(".fpath").html(path.split("\\").pop()); 
     }); 
}); 
+0

をお使いの{​​}は何をするのでしょうか?私はあなたがそれを取り除くことができるので必要ではないと思う! –

+0

正確には動作しません。 'on'コールバックの中で、' this'はクラス 'finput'を持つ要素を参照します。 **あなたのコードはうまく動作します**:http://jsfiddle.net/JjnmE/厳密なモードで動作している場合、 '$(this)'はおそらく動作しません。代わりに '$(window)'を使用してください。 –

+0

http://jsfiddle.net/g4k5d/ < - 私の作品、あなたの最後の行に問題がなければなりません。 –

答えて

0

あなたは()で使用する必要がありますか?あなたが何を正確にしようとしているのか分かりません。

$("#wrapper").on("change", ".finput", function(event){ 
    var path = $(this).val() 
    $(this).parents().children(".fpath").html(path.split("\\").pop()); 

}); 

私はあなたのコードをテストしていませんが、on()をラッパーに付ける必要があります。

change()を使用できますか?

$('.finput').change(function() { 
var path = $(this).val() 
     $(this).parents().children(".fpath").html(path.split("\\").pop()); 
}); 
0

同様

+0

メソッド 'on'はイベントを処理するデフォルトのメソッドです。これはjquery.comからです: .on()メソッドは、jQueryオブジェクト内の現在選択されている要素のセットにイベントハンドラを添付します。 jQuery 1.7以降、.on()メソッドはイベントハンドラをアタッチするために必要なすべての機能を提供します。古いjQueryイベントメソッドからの変換については、.bind()、.delegate()、.live()を参照してください。 – Drachenfels

+0

ソースコードをチェックしていないので間違っているかもしれませんが、とにかく '.change()'、 '.click()'などはバックエンドで '.on()'を呼び出します。 –

0

これが役立ちます。あなたは、ファイル入力の変更は、それにイベントをバインドするときに表示したい場合は

$("input[type='file']").on("change", function(e){ 
     var path = $(this).val(); 
    }) 
+0

しかし、問題はDOMがロードされた後に新しいfinputを追加することです。イベントにバインドされません。live()関数 – maniak

+0

あなたのスクリプトを修正してその入力をbodyタグに動的に追加しましたが、それはまだ私のために働いています。 私のスニペットを確認することができます: http://dl.dropbox.com/u/196245/index19.html – Drachenfels

0

試してみてください。これは.finput要素を意味委任イベントハンドラは、挿入されたされた

$(document).ready(function() { 


    $('body').on('change','input.finput', function() { 
     var path = $(this).val() 
     $(this).parent().children(".fpath").html(path.split("\\").pop()); 
    }); 
}); 
+0

問題は、ページが完全に読み込まれた後に新しいFinputを追加するときです。問題は、このイベントに添付されていないことです。だからこそ私はドキュメント上で.on()を使い、パラメータとしてselector .finputを使ったのです。私が理解したところでは、セレクタ ".input"をパラメータとして渡すことで、イベントがトリガされた瞬間にセレクタが評価されます。 .live()を使用した場合、うまく動作しますが、それは減っています... – maniak

+0

@maniakわかりました。委任を使用するようにコードを更新しました。私はそれをテストしていないし、 'ボディ'の変更イベントが理にかなっているかどうかはわかりません。 –

+0

@maniak最後のコメントをバックアップするために作成したこのシンプルな[fiddle](http://jsfiddle.net/M6NcP/)をチェックしてください。入力を動的に追加すると、そのハンドラは引き続き動作するはずです。 –

0
$(document).on("change", ".finput", function() { 
    $(".fpath").html(this.value.split("\\").pop()); 
}); 

動的に、親要素にリスニングを委譲する必要があります。

.finput要素がアヤックスに挿入され、ページのロード時に存在しているされていない場合は、代わりにこのようなものを使用する必要があります。

$(".finput").on("change", function() { 
    $(".fpath").html(this.value.split("\\").pop()); 
}); 
関連する問題