Не уверен, как адаптировать древний код переключателя изображений, используя name = "foo" для id = "foo" - PullRequest
1 голос
/ 10 июля 2019

Около 19 лет назад мне нужен был скрипт, который меняет изображения с помощью события onmouseover.Используемый сценарий name="foo", который, конечно, больше не может поддерживаться тегом <img>.Я буквально забыл, как работает скрипт, и мне нужна помощь, чтобы приспособить его для использования id="foo".

. Этот скрипт живет в моем <head>:

<script>
function newImage(arg) {
  if (document.images) {
    rslt = new Image();
    rslt.src = arg;
    return rslt;
  }
}

function changeImages() {
  if (document.images && (preloadFlag == true)) {
    for (var i=0; i<changeImages.arguments.length; i+=2) {
      document[changeImages.arguments[i]].src = changeImages.arguments[i+1];
    }
  }
}

var preloadFlag = false;

function preloadImages() {
  if (document.images) {
    archives_over = newImage("/images/index/menu/archives_over.jpg");
    bio_over = newImage("/images/index/menu/bio_over.jpg");
    poetry_over = newImage("/images/index/menu/poetry_over.jpg");
    preloadFlag = true;
  }
}
</script>

...и это HTML, который живет в моем <body>:

<a href='https://www.foo.com/index.php?page=news'
   onmouseover='changeImages("poetry", "/images/index/menu/poetry_over_static.jpg"); return true;'
   onmouseout='changeImages("poetry", "/images/index/menu/poetry_over_static.jpg"); return true;'
   onmousedown='changeImages("poetry", "/images/index/menu/poetry_over_static.jpg"); return true;'
   onmouseup='changeImages("poetry", "/images/index/menu/poetry_over_static.jpg"); return true;'>
  <img name="poetry" src="/images/index/menu/poetry_over_static.jpg">
</a>

Если я изменю <img name="poetry" на <img id="poetry", все это перестает работать.

1 Ответ

3 голосов
/ 10 июля 2019

Ваш

document[changeImages.arguments[i]]

когда первый аргумент poetry, доступ document.poetry. Вместо этого используйте getElementById, чтобы выбрать элемент с определенным идентификатором:

function changeImages(id, newSrc) {
  document.getElementById(id).src = newSrc;
}

Вы также можете рассмотреть возможность правильного подключения слушателей, используя addEventListener, а не встроенные обработчики:

const a = <select your <a> tag here>
const img = document.getElementById('poetry');
const fn = () => {
  img.src = '/images/index/menu/poetry_over_static.jpg';
}
['mouseover', 'mouseout', 'mousedown', 'mouseup'].forEach((eventType) => {
  a.addEventListener(eventType, fn);
});

Если вы делаете такие вещи для нескольких изображений на странице, то вы можете сделать код еще лучше, динамически выбирая <a> nextElementSibling, что позволяет полностью избежать идентификаторов:

const fn = ({ target }) => {
  const img = target.nextElementSibling;
  img.src = '/images/index/menu/poetry_over_static.jpg';
}
['mouseover', 'mouseout', 'mousedown', 'mouseup'].forEach((eventType) => {
  a.addEventListener(eventType, fn);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...