Как я могу уточнить этот код Javascript, чтобы он игнорировал ссылки из изображений

Это вариант существующего вопроса

{Обратите внимание - этот вопрос является противоположным / обратным существующему вопросу Stackru, который слишком сложен, чтобы отвечать на него}

С самого начала

Я хочу внести некоторые изменения в некоторый код из этой задачи:

// the new base url
var base = ' https://www.example.co.uk/gp/wine/order?ie=UTF8&asin=';
var links  = document.getElementsByTagName('a');

for(var i = 0;i < links.length;i++){
    // check each link for the 'asin' value
    var result = /asin=([\d\w]+)/.exec(links[i].getAttribute('href'));
    if(result){
        // make a new url using the 'base' and the 'asin' value
        links[i].setAttribute('href', base+result[1]);
    }
}

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

Вот фрагмент кода HTML, чтобы показать, что я имею в виду:

<a href="/shop/product?ie=UTF8&amp;asin=Z00FDLN878&amp;tab=UK_Default" target="_blank"><img width="125" height="125" border="0" src="http://ecx.images-amazon.com/images/I/01W9a7gwosL.jpg" alt="43453"></a>

Это ссылка на изображение - я не хочу, чтобы это влияло на это.

2 ответа

Решение

В прямом javascript / DOM проверяйте ссылки во время их циклического просмотра:

var base        = 'https://www.example.co.uk/gp/wine/order?ie=UTF8&asin=';
var linksNoImg  = document.querySelectorAll ("a[href*='asin']");

for (var J = linksNoImg.length - 1;  J >= 0;  --J) {
    var imgLink = linksNoImg[J];

    //--- Make sure it's not an image link:
    if ( ! imgLink.querySelector ('img') ) {
        //--- Check each link for the 'asin' value
        var result  = /asin=([\d\w]+)/.exec (imgLink.getAttribute ('href') );
        if (result) {
            // make a new url using the 'base' and the 'asin' value
            imgLink.setAttribute ('href', base+result[1]);
        }
    }
}


jQuery позволяет предварительно выбрать только правильные ссылки:

//--- The new base URL
var base        = ' https://www.example.co.uk/gp/wine/order?ie=UTF8&asin=';
var linksNoImg  = $("a[href*='asin']:not(:has(img))");

linksNoImg.each ( function () {
    // check each link for the 'asin' value
    var result = /asin=([\d\w]+)/.exec(links[i].getAttribute('href'));
    if(result){
        // make a new url using the 'base' and the 'asin' value
        links[i].setAttribute('href', base+result[1]);
    }
} );


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

if (links[i].querySelector('img')) {
    // Link has an <img>! Oh no!
}

Для поддержки старых браузеров звоните getElementsByTagName() вместо этого (и проверьте наличие пустого массива).

Другие вопросы по тегам