jQuery-File-Upload обнаружение резервного iframe

Использование jQuery-File-Upload от blueimp по адресу https://github.com/blueimp/jQuery-File-Upload

Мое приложение работает во многих старых браузерах. Загрузка файлов имеет длинный список ограничений совместимости. Я хотел бы просто определить, когда загрузчик файлов изящно вернулся к использованию транспорта iframe. Я хотел бы обнаружить это в jQuery, где используется загрузка файла, как в этом примере:

var using_iframe_transport = false;

this_file_input.fileupload({
  dataType: 'json',
  url: "http://api.cloudinary.com/v1_1/my_account/image/upload",

  //as we send the file upload, record whether it is using iframe
  send: function (e, data) {
    if (e.iframe_fallback){ //is there a variable like this that exists in the plugin?
      using_iframe_transport = true;
    }
  }
});//end fileupload

if (using_iframe_transport){
  //do something
}

Этот код можно использовать в обратном вызове «прогресс», «готово» или «всегда»:

...
  progress: function(e){ //or 'done' or 'always'
    if($('iframe').length){
      using_iframe_transport = true;
    }
  }
...

Однако эти обратные вызовы не всегда выполняются, как сообщается на https://github.com/blueimp/jQuery-File-Upload/issues/461#issuecomment-9299307

Больше всего меня беспокоит поддержка браузера по умолчанию IE6 и Android 2.3. Спасибо!


person tomcounsell    schedule 30.05.2013    source источник


Ответы (2)


Похоже, что метод, который контролирует, используется ли iframe или нет, — это _initDataSettings, который использует _isXHRUpload, чтобы определить, использовать его или нет. Поскольку это закрытый метод и его нельзя вызывать извне, вы можете использовать следующее:

options = this_file_input.fileupload('option');
use_xhr = !options.forceIframeTransport &&
            ((!options.multipart && $.support.xhrFileUpload) ||
            $.support.xhrFormDataFileUpload);

Если use_xhr имеет значение false, используется транспорт iframe.

В качестве альтернативы, если вы согласны с ожиданием отправки события, вы можете посмотреть data.dataType, если он начинается с «iframe», вы используете резервный вариант iframe.

person Tal Lev-Ami    schedule 30.05.2013
comment
использование if(data.dataType.indexOf('iframe') >= 0) в событии отправки работает отлично. Спасибо! - person tomcounsell; 31.05.2013

  1. Это возможно. Однако это должно быть сделано в асинхронном контексте плагина загрузки файлов. Если вы хотите использовать свою логическую переменную using_iframe_transport, ее необходимо использовать в контексте обратного вызова в плагине. Используйте console.log в каждом блоке, чтобы увидеть, какой из них выполняется первым.

  2. Я бы попробовал использовать обратный вызов add, так как он вызывается сразу после добавления файла.

    var using_iframe_transport = false;
    
    this_file_input.fileupload({
      dataType: 'json',
      url: "http://api.cloudinary.com/v1_1/my_account/image/upload",
    
      //as we send the file upload, record whether it is using iframe
      send: function (e, data) {
        if (e.iframe_fallback){ //is there a variable like this that exists in the plugin?
          /*
            This is being set within the asynchronous context of the plugin.
          */
          using_iframe_transport = true;
        }
      }
    });//end fileupload
    
    /*
      This is a synchronous process and is being evaluated prior 
      to the plugin callbacks being executed. This logic needs to be
      used within a callback function.
    */
    if (using_iframe_transport){
      //do something
    }
    
person CITguy    schedule 30.05.2013
comment
Это важный момент. Мой пример кода является плохим примером как есть. - person tomcounsell; 30.05.2013