jQuery — как отменить добавление

#jquery #hover #prepend

#jquery #наведите #добавление

Вопрос:

Я использую функцию prepend() для воспроизведения изображения при наведении курсора на div. Как мне удалить изображение — т. е. что является противоположностью prepend()

Вот код:

 $("#hover-div").hover(
        function() { $("#image-div").prepend("<img src='images/arrow_redo.png' width='16' height='16' />"); },
        function() { $("#image-div").someFunction("<img src='images/arrow_redo.png' width='16' height='16' />"); }
        );
  

someFunction — это просто фиктивная функция — я действительно не ожидаю, что она что-нибудь сделает.

Комментарии:

1. Можете ли вы предоставить код, который вы используете в данный момент для создания изображения / прикрепления события наведения?

2. Добавляйте, а не скрывайте / показывайте изображение вместо добавления к нему.

Ответ №1:

Если у вас есть идентификатор элемента image, вы можете просто использовать метод remove.

 $("#imgID").remove();
  

Комментарии:

1. это сработает, но неэффективно, потому что вы используете другой селектор вместо сохранения переменной со ссылкой на объект image. Конечно, в редких случаях это будет удобно, но попробуйте проделать это сотни / тысячи раз, и вы начнете замечать разницу

Ответ №2:

вместо использования prepend попробуйте использовать prependTo — позвольте мне продемонстрировать:

 var img;
$("#hover-div").hover(
    function() { 
        img = $("<img src='images/arrow_redo.png' width='16' height='16' />").prependTo("#image-div"); 
    },
    function() { 
        img.remove();
    }
);
  

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

Надеюсь, это поможет

Ответ №3:

Что, если вы сохраните содержимое узла в переменной перед применением функции prepend()?

Комментарии:

1. Это верно. Хорошо, итак, если он добавляет тег <img> в начале, это означает, что это первый дочерний элемент этого узла, и его можно легко удалить.

Ответ №4:

Вероятно, это лучший способ справиться с этим — плюс, я думаю, что он все равно предварительно загрузит изображение для вас в качестве дополнительного бонуса (хотя и не положительного)

 var $img = $("<img src='images/arrow_redo.png' width='16' height='16' />");
$('#hover-div').hover(function() { 
  $('#image-div').prepend($img);
}, function() {
  $img.remove(); 
});
  

В противном случае:

 $(this).children().eq(0).remove(); 
  

нашел бы первый дочерний элемент и удалил его. Однако будьте осторожны, если событие произойдет дважды — оно может удалить не только ваше изображение.

Комментарии:

1. 1 $ (this).children().eq(0).remove(); работает для меня, и мне не пришлось создавать глобальный. =) спасибо, сэр

Ответ №5:

Действительно ли добавление изначально является лучшим вариантом? Имейте в виду, что манипулирование DOM может быть дорогостоящим, поэтому все, что вы можете сделать, чтобы смягчить это, было бы хорошо

Похоже, было бы лучше, если бы изображение находилось в фоновом режиме и переключалось при наведении курсора мыши на div.

Что-то вроде:

 $("#MyDiv").mouseover(function(){
   $(this).find("img").toggle();
});

$("#MyDiv").mouseout(function(){
   $(this).find("img").toggle();
});
  

Или, в качестве альтернативы, используйте .наведите

Это непроверенное решение, которое может быть переработано, чтобы быть лучше, но, надеюсь, дает представление о том, к чему я клоню!

Ответ №6:

Вы можете добавить атрибут к добавленным элементам и найти их позже для получения дополнительных…

 $("#hover-div").hover(
  function() {
    $("<img src='image.png' />").prependTo("#image-div").attr('prepended','yes');
  },
  function() {
    $("[prepended=yes]", "#image-div").remove();
  }
 );
  

Ответ №7:

 $("#image-div").prev().remove();
  

Это позволило бы выделить предыдущий элемент и удалить его.

Комментарии:

1. -1 это неверно, потому что prev выбирает предыдущий аналог. то, что он хочет выбрать, является дочерним элементом image-div

2. Написал это до того, как у него появился какой-либо код. Не знал, откуда будет запускаться функция remove().