Обновить изображение с внешнего URL при клике
У меня есть Dashboard, встроенный в Ruby on Rails, который выбирает изображения с веб-камер и передает их в формате jpg.
У меня есть кнопка обновления на каждом изображении, и я хотел бы иметь возможность обновлять каждое изображение отдельно, не обновляя всю страницу.
<% @shares.each do |camera| %>
<div class="col-md-4 col-sm-6 col-xs-12 cam-box">
<a href="/cameras/<%= camera['id'] %>">
<div id="cam-name"><h5><%= camera['name'] %></h5></div>
<img src="<%= camera['jpg'] %>" alt="">
<a href="#" id="cam-refresh" class="refresh"><span class="glyphicon glyphicon-refresh"></span></a>
</div>
</a>
</div>
<% end %>
Кто-нибудь знает, как я могу добиться этого с Jquery?
Ценю любые предложения.
2 ответа
Так как вы можете просто обновить изображение без необходимости нового src url, вы можете сделать следующее...
$("a.refresh").on("click", function(e) {
e.stopPropagation();
var $img = $(this).closest("img");
var src = $img[0].src;
src = src.substr(0, src.search("?")) + "?" + new Date().getTime();
$img[0].src = src;
});
Это возьмет текущее изображение src и добавит метку времени в конец его, вызывая перезагрузку (вместо того, чтобы просто использовать тот же самый URL и возможно не загружать или загружать из кэша).
Кроме того, в настоящее время он применяет один и тот же идентификатор ко всем ссылкам обновления. Вы должны применить уникальный идентификатор к каждому из них (просто добавьте увеличивающееся значение к каждому идентификатору).
Наконец я добавил e.stopPropagation()
чтобы внешняя ссылка не реагировала на то, что вы щелкаете ссылку обновления, в противном случае щелчок просто всплывает, и вы в конечном итоге меняете страницу.
Что вы хотите сделать, это обновить изображение асинхронно. Вы можете сделать это с помощью jQuery's .ajax()
Вот как вы это делаете:
// Set up an onClick listener for the refresh button
// Make sure each refresh button has a class "cam-refresh"
$(".cam-refresh").click(function() {
var $img = $(this).closest("img"), // Find the closest image
url = "filename.extension"; // The script that will return new image url
// Make a request to that URL to obtain a new src parameter
$.get(url, function() {
alert('Request has been submitted');
})
.done(function(data) {
alert( "second success" );
$img.attr("src", data.src);
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "finished" );
});
});