#jquery #ruby-on-rails #ajax #file-upload #turbolinks
#jquery #ruby-on-rails #ajax #загрузка файлов #turbolinks
Вопрос:
Я использую Turbolinks в своем проекте rails. Когда я нажал кнопку загрузки (вызов ajax), произошел сбой, и в разделе ошибок отображается неперехваченный TypeError: не удается прочитать свойство ‘length’ значения undefined. Та же проблема возникает с обычной ссылкой (без ajax), которая, я думаю, вызвана turbolinks, потому что turbolinks использует ajax в фоновом режиме.
javascript моей страницы загрузки:
<html>
..... html code ...
<%= javascript_include_tag 'js/vendor/jquery.ui.widget.js' %>
<%= javascript_include_tag "js/jquery.iframe-transport" %>
<%= javascript_include_tag "js/jquery.fileupload.js" %>
<script>
$(function () {
'use strict';
var filestoupload = 0;
$('#fileupload').fileupload({
dataType: 'json',
add: function(e, data) {
if(data.files[0]['size'] > 20000000) {
$('#errors_append').html('maximum size for file allowed is 20 mb');
} else {
data.submit();
}
},
done: function (e, data) {
$.each(data.result.files, function (index, file) {
filestoupload ;
$('').text(file.name ' ' 'uploaded successfully').appendTo('#files_append');
if (filestoupload > 2) {
$('#file_button').attr("disabled","disabled");
}
});
$("#btn_text").html('Add more files');
},
start: function (e, data) {
$('#progress .progress-bar').css(
'width',
0 '%'
);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress '%'
);
},
success: function(xhr){
$('#progress .progress-bar').attr('class', 'progress-bar progress-bar-success');
$('#errors_append').empty();
},
error: function(xhr){
var errors = $.parseJSON(xhr.responseText).error
$('#errors_append').html(errors);
$('#progress .progress-bar').attr('class', 'progress-bar progress-bar-danger');
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
Комментарии:
1. где находится ваш
js/jquery.fileupload.js
файл в вашем каталоге? и почему вы используете js в вашем представлении?2. в / app /assets/javascripts /js /jquery. fileupload.js
3. можете ли вы опубликовать точную ошибку, которую вы получаете в своей консоли разработчика
4. Я добавил скриншоты, но у меня недостаточно репутации: ( ,
5. Нет, но когда я удаляю turbolinks, это работает нормально, или когда я включил js в application.js (требуется) он также отлично работает даже с turbolinks. Но в настоящее время я точно не знаю, почему.
Ответ №1:
Мы jquery-file-upload
работаем с ajax
здесь (зарегистрируйтесь в учетной записи, затем попробуйте обновить фотографию своего профиля). Модель — Вероника Креспо:
—
Turbolinks
Основная проблема с Turbolinks заключается в том, что это не позволит вашему JS на странице загружать требуемые элементы DOM.
Поскольку Turbolinks просто обновляет <body>
элемент вашей страницы (не <head>
), JS по-прежнему считает, что он находится в «старом» состоянии, не позволяя ему использовать какие-либо из вновь загруженных элементов.
Это исправлено либо delegating
вашим JS из постоянного элемента (обычно document
), либо с помощью Turbolinks event
хуков для исправления:
var load = function() {
...
};
$(document).on("page:load ready", load);
—
Исправить
Что касается работы с Turbolinks, вот код, который мы использовали для функциональности аватара в одном из наших демонстрационных приложений:
#app/assets/javascripts/application.js
$('#avatar').fileupload({
url: '/profile/' $(this).attr('data_id'),
dataType: 'json',
type: 'post',
add: function (e, data) {
//$(".items .avatar .avatar").prepend('<div class="loading" id="avatar_loading"><img src="<%= asset_path("profile/avatar_loading.gif") %>"></div>');
//$('#avatar_loading').fadeIn('100');
$(this).avatar_loading('avatar_loading');
data.submit();
},
success: function (data, status) {;
$("#avatar_img").fadeOut('fast', function() {
$(this).attr("src", data.avatar_url).fadeIn('fast', function(){
$(this).avatar_loading('avatar_loading');
});
});
}
});
Это соответствует jquery-fileupload
драгоценному камню:
#Gemfile
gem "jquery-fileupload-rails", "~> 0.4.1"
#app/assets/javascripts/application.js
//= require jquery-fileupload/basic