Почему кнопка "Добавить файлы" в Plupload не срабатывает в последнем Chrome или FF на OS X?
Это код, который используется для запуска Plupload в моем приложении Rails:
<% content_for :deferred_js do %>
$("#uploader").pluploadQueue({
runtimes : 'gears,html5,flash,browserplus,silverlight,html4',
url : '/uploads.js',
//browse_button : 'pickfiles',
max_file_size : '10mb',
chunk_size : '2mb',
unique_names : false,
container: 'uploader',
autostart: true,
//RoR - make sure form is multipart
//multipart: true,
// Specify what files to browse for
filters : [
{title : "Image files", extensions : "jpg,gif,png,bmp"}
],
// PreInit events, bound before any internal events
preinit : {
UploadFile: function(up, file) {
up.settings.multipart_params = {"upload[stage_id]" : compv.steps.selectedStage.getID(), "authenticity_token" : compv.tools.csrf_token()};
}
},
// Post init events, bound after the internal events
init : {
FilesAdded: function(up, files) {
// Called when files are added to queue
up.start();
},
FileUploaded: function(up, file, info) {
// Called when a file has finished uploading
console.log('[FileUploaded] File:', file, "Info:", info);
info.responseText = info.response;
compv.updateStepView('upload', info);
$('tr[data-upload] td.selectable-step').each(function(index){
compv.steps.selectedUpload.primeUploadDisplay($(this));
});
},
Error: function(up, args) {
// Called when an error has occured
up.stop();
compv.tools.clientError();
}
},
// Flash settings
flash_swf_url : '/plupload/js/plupload.flash.swf',
// Silverlight settings
silverlight_xap_url : '/plupload/js/plupload.silverlight.xap'
});
compv.steps.selectedUpload.uploader = $('div#uploader').pluploadQueue();
//compv.steps.selectedUpload.uploader.init();
// Client side form validation
$('form#new_upload').submit(function(e) {
var uploader = $('#uploader').pluploadQueue();
// Validate number of uploaded files
if (uploader.total.uploaded == 0) {
// Files in queue upload them first
if (uploader.files.length > 0) {
// When all files are uploaded submit form
uploader.bind('UploadProgress', function() {
if (uploader.total.uploaded == uploader.files.length)
$('form').submit();
});
uploader.start();
} else
$('div#upload-empty-dialog').dialog("open");
e.preventDefault();
}
});
$('div#upload-empty-dialog').dialog({modal:true, autoOpen: false, minWidth: 325, buttons: { "Ok": function() { $(this).dialog("close"); } }});
$('div#upload-cancel-dialog').dialog({modal:true, autoOpen: false, minWidth: 325});
<% end %>
<div class="dialog" id="upload-empty-dialog" title="No Files">
<p>You must select files to upload first.</p>
</div>
<div class="dialog" id="upload-cancel-dialog" title="Cancel Uploading?">
<p>Do you want to stop uploading these images? Any images which have not been uploaded will be lost.</p>
</div>
есть ли что-нибудь очевидное, что прыгает, что может быть причиной этого ?
Edit1: кстати, когда я пытаюсь загрузить эту форму -http://jsfiddle.net/Atpgu/1/ - кнопка добавления файлов срабатывает для меня на Chrome & FF-поэтому я подозреваю, что это имеет какое-то отношение к моему JS, я просто не знаю, что.
Edit2: это то, что определением compv
есть. Я знаю, это немного ... многословный, и я собирался его уменьшить - но решил не рисковать удалением чего-то важного.
var compv = {
exists: true,
tools: { exists: true,
csrf_param : null,
csrf_token : null},
comments: { exists: true,
updateView: null,
selectImage: null,
upvote:null,
downvote:null,
showVotes:null,
getUploadID: function(element){
return $(element).parents("li").attr("data-upload-id");
}},
steps: { exists: true,
selectFn:{},
selectedClass: "selected-step",
selectableClass: "selectable-step",
selectedClient: { element: null,
id: null,
stepType: "client",
ajaxSuccess: null },
selectedProject: { element: null,
id: null,
stepType: "project",
ajaxSuccess: null },
selectedStage: { element: null,
id: null,
stepType: "stage",
ajaxSuccess: null,
getID: function(){
return compv.steps.selectedStage.id;
},
displayCompare: function(){
window.open($(this).attr('data-url'), "_blank");
}},
selectedUpload: { element: null,
id: null,
stepType: "image",
primeUploadDisplay: null,
ajaxSuccess: null,
uploader: null,
noCloseDialog: false} }
};
4 ответов
Plupload неправильно отображает скрытые элементы, поэтому его следует обновить после показа. В данном примере после открытия диалога необходимо добавить несколько строк кода:
var uploader = $('#uploader').pluploadQueue();
uploader.refresh();
Я заметил, что в chrome есть проблемы с правильной установкой z-индекса для входного контейнера. Чтобы обойти это, просто добавьте еще одну строку после предыдущих двух:
$('#uploader > div.plupload').css('z-index','99999');
вы можете решить эту проблему с Chrome проще, установив css вашего browse_button (= Select Files Button) на более высокий Z-индекс (z-index:99999)!
Лукиан
Я знаю, что это старый вопрос, но кажется, что проблема z-index все еще существует в более поздних версиях plupload (1.5.2).
проблема вызвана кодом в plupload.html5.js
который изменяет z-индекс кнопки "Добавить файлы" специально для браузеров Webkit и при этом ломает вещи:
zIndex = parseInt(plupload.getStyle(browseButton, 'z-index'), 10);
if (isNaN(zIndex)) {
zIndex = 0;
}
plupload.extend(browseButton.style, {
zIndex : zIndex
});
plupload.extend(inputContainer.style, {
zIndex : zIndex - 1
});
если вы просмотрите DOM вы увидите, что style="z-index: 0;"
добавляется #uploader_browser
элемент привязки, а div, содержащий кнопку "Добавить файлы", получает Z-индекс -1, который эффективно скрывает его за страницей (в зависимости от вашего Z-индекса страниц, конечно).
чтобы исправить это, я установил значение zIndex в файле, упомянутом выше, на что-то выше страницы, на которой отображался plupload div.
решение Deele с css хорошо, но немного лучше сделать это таким образом:
$('#uploader > div.plupload input').css('z-index','99999');
таким образом, наведение кнопки не будет нарушено...