Как создать возможные URL-адреса изображений и проверить, существуют ли они с помощью jQuery
Итак, короче говоря, наша компания приобрела веб-сайт у компании. У них есть свой собственный язык, похожий на Smarty. У них очень грубый набор функций, встроенных в их шаблон, который они "создали" для нас. Этот шаблон не предлагает функцию отображения изображений товаров в корзине. Итак, я должен "угадать", какие URL-адреса изображений.
Поскольку я не могу создавать в шаблоне какие-либо PHP-подобные функции, я должен использовать javascript/jQuery.
Что мне нужно сделать: создать несколько возможных URL, проверить, правильно ли я угадал URL. Если так, то мне нужно заменить <div>
фоновое изображение с действительным URL изображения.
HTML
<ul id="session-menu">
<li class="drop-down cart">
<a href="/store/go/basket/" class="icon-cart">
Shopping Cart
</a>
<div class="drop drop-right">
<ul>
<li data-name="Intel i7 4770K" data-code="intel-4770k" data-qty="1">
<div class="image">
<a href="/Intel-i7-4770K/"></a>
</div>
<div class="text">
<a href="/Intel-i7-4770K/">Intel 4770K</a>
<span class="qty">Quantity: 1</span>
<span class="price">Price: $275</span>
</div>
</li>
</ul>
</div>
</li>
</ul>
JS
var dirs = '/product_images/18/4301/';
var ext = '.jpg';
var element = $('#session-menu .cart li');
$('#session-menu .cart li').each(function(){
var data = $(this).data();
for (var i in data){
console.log(data[i]);
checkUrl(createUrl(data[i]));
}
});
function createUrl(val) {
var imgStr = dirs + val.replace(/ |\.|\//g, '-').replace(/"|'/g, '').toLowerCase().toString() + ext;
console.log(imgStr + ' has been made');
return imgStr;
}
function checkUrl(img) {
$.ajax({
url: img,
type: "HEAD",
success: function() { console.log(img + ' exists'); changeBgImg(img); },
error: function () { console.log(img + ' does not exist'); }
});
}
function changeBgImg(img) {
$('#session-menu .cart li .image').children('a').css('background-image', img);
}
Изображения (если они существуют) имеют вид '/product_images/18/4301/intel-i7-4770k', '/product_images/18/4301/intel-4770k' или '/product_images/18/4301/large-intel-4770k.
Я действительно предпочел бы сделать это в плагине jQuery, но это просто усложнило мне задачу при попытке заставить его работать (потому что я супер ржавый). Бонусные баллы для тех, кто может показать мне это в виде плагина LOL.
Любая помощь в выяснении этого будет принята с благодарностью. У меня был другой сценарий, делавший по сути то же самое ранее, но все проверки $.ajax вернулись успешно? Хотя изображение не существует. Даже с изменениями выше, проверки всегда возвращались успешно...
2 ответа
Может быть, попробовать использовать запрос get?
function checkUrl(img) {
$.ajax({
url: img,
type: "GET",
success: function() { console.log(img + ' exists'); changeBgImg(img); },
error: function () { console.log(img + ' does not exist'); }
});
}
Я только что проверил это на моем собственном сайте. При ссылке на существующее изображение оно вернулось успешно. При связывании с несуществующим изображением оно возвращалось с ошибкой.
Поэтому мне пришлось удалить data-qty
атрибут, потому что сценарий из-за ошибки с ним там... Я также должен был передать элемент "$(this)" через функции, чтобы я мог в конечном итоге изменить BG для этого конкретного элемента, когда я нашел правильное изображение... Кажется, что я мог бы структурировать этот скрипт по-другому, чтобы избежать необходимости передавать его через несколько функций... Может быть, просто установить переменную вне функций... Да:)
HTML
<ul id="session-menu">
<li class="drop-down cart">
<a href="/store/go/basket/" class="icon-cart">
Shopping Cart
</a>
<div class="drop drop-right">
<ul>
<li data-name="Intel i7 4770K" data-code="intel-4770k">
<div class="image">
<a href="/Intel-i7-4770K/"></a>
</div>
<div class="text">
<a href="/Intel-i7-4770K/">Intel 4770K</a>
<span class="qty">Quantity: 1</span>
<span class="price">Price: $275</span>
</div>
</li>
</ul>
</div>
</li>
</ul>
JS все еще очень неприятен для меня. Похоже, что это может быть составлено гораздо лучше. Как я уже сказал, мне нужно будет выполнить этот набор функций на некоторых других объектах нашего сайта. Было бы неплохо иметь как плагин, но аккуратнее...
ТАКЖЕ, похоже, что я предполагаю несколько действительных URL-адресов (я проверил, и он находит несколько изображений для каждого элемента). Так как я могу настроить ниже, чтобы перестать угадывать URL, когда он находит действительный. И должна ли быть какая-то система приоритетов на месте? Например, "если URL-адрес с именем данных И КОД данных действителен, ТОГДА использовать URL-адрес с данными"?
JS
var dirs = '/product_images/18/4301/';
var ext = '.jpg';
var element = $('#session-menu .cart li');
element.each(function(){
var data = $(this).data();
for (var i in data){
checkUrl(createUrl(data[i]), $(this));
}
});
function createUrl(val) {
var imgStr = dirs + val.replace(/ |\.|\//g, '-').replace(/"|'/g, '').toLowerCase().toString() + ext;
return imgStr;
}
function checkUrl(img, el) {
$.ajax({
url: img,
type: "HEAD",
success: function() { console.log(img + ' exists, changing background image...'); changeBgImg(img, el); },
error: function () { console.log(img + ' does not exist'); }
});
}
function changeBgImg(img, el) {
el.find('.image a').css('background-image', 'url(' + img + ')');
}