|
| 1 | + |
| 2 | +Сначала можно найти ссылки, например, при помощи `document.querySelectorAll('a')`, а затем выбрать из них нужные. |
| 3 | + |
| 4 | +Затем определимся -- что использовать для проверки адреса ссылки: свойство `href` или атрибут `getAttribute('href')`? |
| 5 | + |
| 6 | +Различие между ними заключается в том, что свойство будет содержать полный путь ссылки, а атрибут -- значение, указанное в HTML. |
| 7 | + |
| 8 | +Если открыть страницу локально, на диске, то для `<a href="/tutorial">` значения будут такими: |
| 9 | + |
| 10 | +- `a.getAttribute('href') == "/tutorial"`. |
| 11 | +- `a.href == "file:///tutorial"` (возможно, в пути будет также буква диска). |
| 12 | + |
| 13 | +Здесь нужен именно атрибут, хотя бы потому, что в свойстве все ссылки уже с хостом и протоколом, а нам надо понять, был ли протокол в `href` или нет. |
| 14 | + |
| 15 | +Правила определения: |
| 16 | + |
| 17 | +- Ссылки без `href` и без протокола `://` являются заведомо внутренними. |
| 18 | +- Там, где протокол есть -- проверяем, начинается ли адрес с `http://internal.com`. |
| 19 | + |
| 20 | +Итого, код может быть таким: |
| 21 | +```js |
| 22 | +var links = document.querySelectorAll('a'); |
| 23 | + |
| 24 | +for (var i = 0; i < links.length; i++) { |
| 25 | + |
| 26 | + var a = links[i]; |
| 27 | + |
| 28 | + var href = a.getAttribute('href'); |
| 29 | + |
| 30 | + if (!href) continue; // нет атрибута |
| 31 | + |
| 32 | + if (href.indexOf('://') == -1) continue; // без протокола |
| 33 | + |
| 34 | + if (href.indexOf('http://internal.com') === 0) continue; // внутренняя |
| 35 | + |
| 36 | + a.classList.add('external'); |
| 37 | +} |
| 38 | +``` |
| 39 | + |
| 40 | +...Но, как это часто бывает, знание CSS может упростить задачу. Удобнее и эффективнее здесь -- указать проверки для `href` прямо в CSS-селекторе: |
| 41 | + |
| 42 | +```js |
| 43 | +// ищем все ссылки, у которых в href есть протокол, |
| 44 | +// но адрес начинается не с http://internal.com |
| 45 | +var css = 'a[href*="://"]:not([href^="http://internal.com"])'; |
| 46 | +var links = document.querySelectorAll(css); |
| 47 | + |
| 48 | +for (var i = 0; i < links.length; i++) { |
| 49 | + links[i].classList.add('external'); |
| 50 | +} |
| 51 | +``` |
| 52 | + |
0 commit comments