2016-02-06 2 views
0

I'm attempting to write a script that will take the 'img src' and copy it to an 'a href'. The trick is that this page I'm working on is a photo gallery, with multiple images on the page that this script needs to work on. This needs to happen as soon as the page is loaded. Here's my HTML:Javascript: Change <a href> to match <img src> multiple times on a page

<!-- Album row 1 --> 
<div class="col-md-6 col-sm-6 album"> 
    <a class = "img-container-alt" href="**this_is_where_the_imgsrc_below/will_end_up.jpg**" data-gallery> 
    <div class="photo-overlay"></div> 
    <figure> 
    <img class="img-responsive album-img" src="**this_is_what_/i_would_like_copied_above.jpg**" alt=""> 
    </figure> 
    </a> 
</div> 

The trick is, like I said, getting it to run through multiple divs that are identical to this one and dynamically grabbing each img src and copying it to the a href above it within the div. Here's what JS I've done so far:

<!-- Script --> 
<script type="text/javascript"> 
window.onload = function abc() { 
    console.log('hello') 
    var copyto = document.querySelectorAll('.img-container-alt'); 
    var copy = document.querySelectorAll('album-img'); 
    for (var i = 0; i < copyto.length; i++) { 
     var url = copy[i].src; 
     copyto[i].href = url; 
    } 
} 
</script> 

When I run that, I get this error: Uncaught TypeError: Cannot read property 'src' of undefined, which is referring to the var url = copy[i].src;. I'm not sure if my script is the best option for what I'm trying to do, but I'm stumped now. I'm relatively new to JS, so any help would be appreciated. Thanks in advance. If I need to clarify anything, please let me know.

ответ

0

Как было отмечено @Ian Девлин и @ t.niese, у меня было две проблемы, которые необходимо быть фиксированным. Во-первых, мой var url = copy[i].src; не был определен. Зачем? Потому что я отсутствовал . в моем var copy = document.querySelectorAll('.album-img');, где album-img был. Во-вторых, я не мог захватить src в var url = copy[i].src;, поэтому мы переключили его на copy[i].getAttribute("src"), и он отлично работал.

Вот рабочий сценарий в настоящее время ....

<!-- Script --> 
    <script type="text/javascript"> 
    window.onload = function abc() { 

    var copyto = document.querySelectorAll('.img-container-alt'); 
    var copy = document.querySelectorAll('.album-img'); 
    for (var i = 0; i < copyto.length; i++) { 

     var url = copy[i].getAttribute("src"); 
     copyto[i].href = url; 
    } 
} 

Спасибо за помощь, ребята.

1

getQuerySelector возвращает Nodelist из element objects, поэтому я подозреваю, что вам нужно вместо этого использовать .getAttribute("src").

+0

Итак, вместо 'var copy = document.queryselectorall ('album-img')', вы предлагаете 'var copy = document.getAttribute (" src ")', правильно? Кажется, что это не работает, поскольку '.getAttribute' не является функцией. – tman091

+0

Нет, я имею в виду try 'copy [i] .getAttribute (" src ")' в вашем цикле. Но то, что t.niese говорит ниже, также является правильным. Всегда отлаживайте свой код и смотрите, где значение равно null. –

+0

Ваш 'copy [i] .getAttribut (" src ")' был именно тем, что мне нужно. ТАКЖЕ, @ t.niese решил мою другую проблему, что у меня было (отсутствует «.» В моем альбоме-img ... gosh.) Двое из вас помогли мне, и вместе ваши ответы решили мою проблему. Спасибо, тонны парней. Я буду ссылаться на это в будущем. – tman091

1

Вы должны использовать document.querySelectorAll('.album-img') (вам не хватает . перед album-img) в противном случае вы будете искать для элементов с именем тега album-img.

Ваш document.querySelectorAll('album-img') возвращает пустой список узлов, потому что нет ни одного элемента с именем тега album-img в вашем HTML коде и из-за того, что каждый доступ к copy[i] вернется undefined.

Но я все равно использовал бы другой подход. Я искал бы для всех изображений, а затем для каждого изображения проверить, если он находится внутри от a элемента, и если это так, то изменить href этого элемента:

function find_closest_a(el) { 
    while (el) { 
    if (el.tagName === 'A') return el; 
    el = el.parentNode; 
    } 
} 

var images = document.querySelectorAll('.album-img'); 
for (var i = 0; i < images.length; i++) { 
    var aElment = find_closest_a(images[i]); 
    if (aElment) { 
    aElment.href = images[i].src; 
    } 
} 
+0

Спасибо, что указали мой недостающий '.'. Иногда это просто занимает вторую пару глаз ..... Ваши предложения и @Ian Devlin вместе были тем, что мне было нужно. Спасибо за ваше время! – tman091

+0

@ tman091 проверить изменение (добавление другого подхода) Я сделал прямо в тот момент, когда вы написали комментарий –

+0

Очень интригующе. Мне нравится это. Поскольку то, что мне нужно, работает, и страница не будет часто меняться, я буду придерживаться исходного цикла, но не ошибаюсь, я закладок на этой странице! ха-ха. Еще раз спасибо. – tman091

1

Вы бы лучше использовать данные атрибутов, так что вы можете настроить таргетинг только изображения, участвующих в процессе, поэтому пропуская ничего подобного иконки и т.д.

Итак, ваш IMG тег изменится на:

<img class="img-responsive album-img" src="" alt="" data-copy-target="id_of_relevant_a_tag"> 

затем в ЯШ:

(function() { 
    var imgs = document.querySelectorAll('img[data-copy-target]'); 
    for (var i = 0, len = imgs.length; i < len; ++i) { 
     document.getElementById(imgs[i].dataset.copyTarget).href = imgs[i].src; 
    } 
})(); 

Стик сценарий в нижней части страницы (до закрытия тела тега), чтобы убедиться, что это выполняется только тогда, когда остальная часть DOM загружен

я не правильно проверил код выше, но принцип правилен

метод я использовал для JS, чтобы обернуть его в прямоприменяемых закрытия

+0

Я обязательно свяжусь с этим скриптом на другой странице своего сайта, потому что это делает его намного проще, чем то, что я делал раньше. Имеет смысл. Спасибо за ваше время! Однако другие ответы решили мою проблему. – tman091

+0

Нет проблем. Хотя, я по-прежнему предлагаю хотя бы использовать атрибут data и не полагаться на селектор запросов, возвращая ваши изображения и ссылки в правильном порядке. Если есть динамический контент, который может содержать ссылки или изображения на вашей странице, тогда ваш скрипт может выйти из строя. – Ryuu

+0

Dully отметил. Я буду играть с этим решением на другой странице, над которой я буду работать позже, потому что эта страница более динамична по сравнению с тем, на котором я сейчас работаю. Еще раз спасибо! – tman091

Смежные вопросы