Почему кнопка "добавить файлы" в 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: Btw, когда я пробую эту форму загрузки - 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} }
};

Ответ 1

Plupload неправильно отображает скрытые элементы, поэтому он должен быть обновлен после показа. В данном примере, после открытия DIALOG, должно быть добавлено несколько строк кода:

var uploader = $('#uploader').pluploadQueue();
uploader.refresh();

Я заметил, что в chrome у него есть проблемы с правильной установкой z-index для контейнера ввода. Чтобы обойти это, просто добавьте еще одну строку после двух предыдущих:

$('#uploader > div.plupload').css('z-index','99999');

Ответ 2

Вы можете решить эту проблему с помощью Chrome проще, установив css вашего browse_button (= Выбрать файлы) в более высокий z-index (z-index: 99999)!

Лусиан

Ответ 3

Я знаю, что это старый вопрос, но кажется, что проблема 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-index ваших страниц, конечно).

Чтобы исправить это, я установил значение zIndex в упомянутом выше файле на что-то большее, чем страница, на которой отображался div plupload.

Ответ 4

Решение Deele с css является хорошим, но немного лучше сделать это следующим образом:

$('#uploader > div.plupload input').css('z-index','99999');

Таким образом, наведение кнопки не будет нарушено...