私はjQueryをシンプルでエレガントなAPIで100%受け入れようとしていますが、APIとストレートHTMLの間に矛盾があり、それを理解することはできません。
ファイル入力値が変更されるたびに実行するAJAXファイルアップローダースクリプト(正しく機能する)があります。私の作業コードは次のとおりです。
<input type="file" size="45" name="imageFile" id="imageFile" onchange="uploadFile()">
onchange
イベントをjQuery実装に変換すると:
$('#imageFile').change(function(){ uploadFile(); });
結果は同じではありません。 onchange
属性を使用すると、期待どおりに値が変更されるたびにuploadFile()
関数が呼び出されます。ただし、jQuery API .change()
イベントハンドラーでは、イベントは値が最初に変更されたときにのみ発生します。その後の値の変更は無視されます。これは私には間違っているように思えますが、確かにこれはjQueryによる監視ではありませんよね?
他の誰かが同じ問題に遭遇しましたか?また、上記で説明した以外の問題の回避策または解決策はありますか?
ajaxアップローダーは入力要素を更新しますか?その場合は、.live()メソッドの使用を検討する必要があります。
$('#imageFile').live('change', function(){ uploadFile(); });
更新:
jQuery 1.7以降では、今すぐ使用する必要があります.on()
$(parent_element_selector_here or document ).on('change','#imageFile' , function(){ uploadFile(); });
JQuery 1.7以降、.live()メソッドは非推奨になりました。 .on()を使用して、イベントハンドラーをアタッチします。 jQueryの古いバージョンのユーザーは、.live()よりも.delegate()を使用する必要があります。参照: http://api.jquery.com/on/
$('#imageFile').on("change", function(){ uploadFile(); });
ファイル入力タイプにjQueryイベントハンドラーを追加しても、IE8 +を動作させることができませんでした。古い学校に行って、onchange=""
属性をinputタグに追加する必要がありました。
<input type='file' onchange='getFilename(this)'/>
function getFileName(Elm) {
var fn = $(Elm).val();
....
}
編集:
function getFileName(Elm) {
var fn = $(Elm).val();
var filename = fn.match(/[^\\/]*$/)[0]; // remove C:\fakename
alert(filename);
}