Простыми словами:Если пользователь не авторизован (USER_ID = 0),
то скрипт находит все ссылки с классом link и вместо их текста пишет:[Ссылки могут видеть только зарегистрированные пользователи] А при клике по такой «ссылке» человека перекидывает на страницу /index/3 (это страница регистрации пользователя)
Код
<?if($USER_ID$='0')?>
<script>
e=document.getElementsByTagName('A');
for(k=0; k<e.length;k++) {
if(e[k].className=="link"){
e[k].innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';
e[k].href = '/index/3';
}
}
</script><?endif?>
<script>
e=document.getElementsByTagName('A');
for(k=0; k<e.length;k++) {
if(e[k].className=="link"){
e[k].innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';
e[k].href = '/index/3';
}
}
</script><?endif?>
Вот мой вариант
Вот более современный, быстрый и лаконичный вариант на чистом JavaScript (ES6+):
Современный вариант (Vanilla JS)
Этот код сразу выбирает только нужные элементы, не тратя ресурсы на остальные ссылки.
Код
<?if($USER_ID$='0')?>
<script>
document.addEventListener("DOMContentLoaded", () => {
// Выбираем только ссылки с классом 'link'
const guestLinks = document.querySelectorAll('a.link');
guestLinks.forEach(link => {
link.href = '/index/3';
link.innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';
// Дополнительно: можно убрать title, чтобы не всплывала старая ссылка
link.removeAttribute('title');
});
});
</script>
<?endif?>
<script>
document.addEventListener("DOMContentLoaded", () => {
// Выбираем только ссылки с классом 'link'
const guestLinks = document.querySelectorAll('a.link');
guestLinks.forEach(link => {
link.href = '/index/3';
link.innerHTML = '[<b>Ссылки могут видеть только зарегистрированные пользователи</b>]';
// Дополнительно: можно убрать title, чтобы не всплывала старая ссылка
link.removeAttribute('title');
});
});
</script>
<?endif?>
Что изменилось и почему это лучше:
* querySelectorAll('a.link'): Вместо того чтобы перебирать тысячи ссылок через getElementsByTagName и проверять каждую условием if, мы сразу просим браузер найти только те, у которых есть нужный класс. Это гораздо быстрее.
* DOMContentLoaded: Мы оборачиваем код в обработчик события. Это гарантирует, что скрипт сработает только тогда, когда весь текст страницы загрузился, и не «пропустит» ни одну ссылку.
* forEach: Более читаемый и современный способ перебора массива по сравнению с классическим циклом for.
Можно ли сделать еще лучше?
Если вы хотите, чтобы ссылки скрывались мгновенно (еще до того, как скрипт сработает), можно добавить небольшой CSS-код:
Код
<?if($USER_ID$='0')?>
<style>
/* Скрываем содержимое ссылок, пока JS их не обработает, чтобы не было «мигания» контента */
a.link { font-size: 0; }
a.link::before {
content: '[Загрузка...]';
font-size: 14px;
color: gray;
}
</style>
<?endif?>
<style>
/* Скрываем содержимое ссылок, пока JS их не обработает, чтобы не было «мигания» контента */
a.link { font-size: 0; }
a.link::before {
content: '[Загрузка...]';
font-size: 14px;
color: gray;
}
</style>
<?endif?>