私はこのhtml5ファイルアップローダープラグインに取り組んでいますが、Google Chromeにバグがあり、理解して修正することができません。 Firefoxでは正常に動作します。
問題は、デスクトップからcannot同じファイルをtwiceアップロードすることです。
最初にクリックして選択し、[OK]をクリックしてデスクトップからファイルをアップロードすると、メッセージが表示されます。たとえば、「。button-1」は、クリックしたアップロードボタンによって異なります。
次に、同じファイルを再度アップロードしようとすると、このコード行は実行されなくなります。
$(".upload-file",object_parent).change(function() {
...
...
alert($cm.selector);
});
このプラグインで何がうまくいかないのですか?
(function($){
// Attach this new method to jQuery
$.fn.extend({
// This is where you write your plugin's name
upload_file_html5: function(options) {
// Set the default values, use comma to separate the settings, example:
var defaults = {
objectSuperparent: '.media'
}
var options = $.extend(defaults, options);
var o = options;
var $cm = this.click(function(e){
// <a> button is the object in this case.
var object = $(this);
// Get other info from the element belong to this object group.
var object_href = object.attr('href');
var object_parent = object.parent();
alert($cm.selector);
// Trigger the click event on the element.
// Due to security policies triggering click on the input type=file is not allowed/supported in some browsers and Opera is one of them.
//$('input[type=file]').trigger('click'); // or:
$(".upload-file",object_parent).click();
return false;
});
// Trigger ajax post when ever the file is changed by the user.
var $cm_2 = $(".upload-file").change(function(){
// <input> is the object in this case.
var object = $(this);
var object_form = object.parent();
var object_superparent = object.parents(o.objectSuperparent);
var path_config = $($cm.selector,object_superparent).attr('href');
var path_post = object_form.attr('action');
alert($cm.selector);
//alert(path_config);
....
....
});
}
});
})(jQuery);
Chromeで正常に動作していましたが、最近失敗しました。おそらくChromeが私のマシンの最新バージョンを更新し、この更新によってバグが発生しましたか?
はい。私のChromeはFirefoxとは動作が異なりますが、Chromeは正しいと思います。
W3Cのドキュメント によると:
onchangeイベントは、コントロールが入力フォーカスを失い、フォーカスを取得してからその値が変更された場合に発生します。
同じファイルをアップロードしようとしても、ファイル入力の値は変わりません。印刷してみてください:
$('.button-2').click(function(){
console.log($(".list .upload-file").val())
return false;
});
入力が再レンダリングされている可能性があります。どういうわけか、これは私にとっては無関係です。 $ .on( 'change'、callback)機能は失われます。
私が絶対に大好きな.delegate関数を使ってみてください! http://api.jquery.com/delegate/
さて、デリゲートはまったく同じです。特定のハンドルで画面にレンダリングされた要素があるかどうかをjqueryに通知し、それに機能をアタッチします。
したがって、要素が再レンダリングされても、機能し続けます。
$(document).delegate('.file_upload_btn', 'change', function(){});
これは使い捨て機能だと思うかもしれませんが、違いは何ですか。これにより、プロジェクトにかかる時間を大幅に節約できました。