А можно ли остановить загрузку конкретной каритинки Javascript
Из области фантастики конечно, но вдруг…
Понятно что можно остановить загрузку всей страницы stop() и тогда все загрузки тоже отвалятся,
но это не то что нужно, нужно сказать стоп конкретной картинке если она слишком долго грузится.
Решение найдено.
Вот его автор paaashka
Реально помог довести наш скрипт до идеала.
Потратил на меня кучу времени но добил таки его, на чистом JS
1) XMLHttpRequest не подходит, он не кроссдоменный.
2) Что-то сделать с самой картинкой (img), изменить атрибут src, преобразовать в другой тег, это не работает.
3) execCommand(«Stop», false); не подходит, если и будет работать то только в IE.
4) img.fireEvent(«abort»); не подходит, если и будет работать то только в IE.
5) Скрипт стоит на разных сайтах/доменах отличных от сервера на котором расположена картинка.
А если для картинки динамически создавать iframe с ней, и если не пришло событие из айфрейма о том, что картинка загрузилась, то удалять айфрейм вместе с картинкой? Сейчас попробовал — при удалении айфрейма, загрузка картинки останавливается.
У меня даже была мысль грузить картинку в iframe и потом там уже говорить stop() но я не уверен что это сработало бы, а проверить не получилось, что то я не так делал там.
IE всё-таки не так прост оказался. Пока не смог для него нормальное решение сделать, он продолжает грузить iframe. Завтра ещё попробую, если что, напишу в личку.
Кажется получилось :) Непричёсанные исходники на смеси jQ и чистого js можно взять здесь. Закинуть на сервер и запустить index.php. Увеличив sleep в img.php до 4-5 секунд, можно увидеть, что загрузка файла отменяется.
Ещё есть куда дорабатывать, но идея кажется правильной.
Огоо! Это мне на двое суток разбиратся, но действительно вроде работает. Теперь буду думать как из этого сделать чистый js…
Я думал код будет слегка прощее :-))
Первый, очевидный, что-то сделать с самой картинкой (img), изменить атрибут src, преобразовать в другой тег. Но скорее всего это не работает, поэтому вы и спрашиваете.
Второй, теоретически возможный вариант. Это сделать ajax запрос к нужной картинке и в нужный момент вызвать метод abort объекта XMLHttpRequest (например, функция jQuery $.ajax возвращает подобный объект). Таким образом, если предположить, что браузер кеширует запросы, картинка может оказаться в кеше в случае успешного выполнения. Это нужно проверить.
Первый очевидный и мною проверенный, и он не работает (ну разве что фаерфокс вроде понимает это).
XMLHttpRequest не подходит, он не кроссдоменный, я не упомянул что это важно.
Чувствую что двое суток потеряны впустую и решения просто нет.
Вы можете транслировать изображения через свой сервер, вроде: www.yourserver.com/load=path_to_image
Причем можете делать замену ссылок на изображения как до выдачи страницы, так и через javascript после загрузки страницы.
Не понял как мне это поможет, мне нужно отстрелить картинку если сервер или канал упали дабы у клиентов сайты не ждали ответа от сервера.
Можно сделать stop() но для всей страницы и если там видео грузилось к примеру то ему будет хана как и всему что не успело.
1. Создаете php-скрипт (к примеру), который загружает картинку по переданному адресу url_to_load и отдает клиенту: www.yourserver.com/url_to_load=http://www.yandex.ru/logo.jpg
То есть если переходить по этой ссылке, должны отображаться картинка по указанному адресу.
3. Если запрос выполнился без выпадения таймаута, значит картинка загрузилась в кеш. В противном случае картинка недоступна.
4. Если все в порядке можете менять атрибут src у img на: www.yourserver.com/url_to_load=http://www.yandex.ru/logo.jpg
Так как она должна быть в кеше, изображение мгновенно появиться.
Зачем вас делать запрос с другого сайта? Ваша страница images.html (предположим) лежит на том же сервере что и скрипт подгружающий изображения. Скорее всего вы не понимаете, я вам говорю о действительно рабочем варианте, если браузеры кешируют так как я предполагаю.
Я не очень понял причему тут кэширование.
У меня там вообще уникальные префиксы генерятся гетзапросом.
Я говорю что вижу, если браузер запросил картинку то он сволочь будет её грузить и плевать ему на мои действия.
Если сервер на который мы обращаемся упал или медленно отвечает, то браузер будет ждать этот файл.
Функцию loadedImg удаляет загруженный img из массива еще незагруженных.
Через полминуты, всем незагруженным изображениям меняется src, тем самым прекращая загрузку
var notLoadedImgs = $('img');
$('img').load(function() {loadedImg(this);}); // loadedImg excludes img from notLoadedImgs
setTimeout(function() {
$(notLoadedImgs).attr('src', '404');
}, 30000);
Я вообще удалил элемент img и толку ноль.
Если он начал, то единственное что его останавливает это stop() но проблема в том что останавливается при этом всё.