Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Как вырезать часть из src (https://javascript.ru/forum/jquery/59968-kak-vyrezat-chast-iz-src.html)

AnnushkaV 04.12.2015 22:45

Как вырезать часть из src
 
Всем привет) Ломаю голову над такой задачей: если src="http://img04.deviantart.net/2357/i/2011/201/c/8/vitrage.jpg" , то в переменную сохранить vitrage, если src="image/vitrage.jpg", то в переменную сохранить тоже vitrage. Подскажите, пожалуйста)

laimas 05.12.2015 06:32

var a = src.split('/').pop()


Либо substr с последней позиции "/". Если только имя без расширения, то удалить расширение.

AnnushkaV 05.12.2015 18:07

Цитата:

Сообщение от laimas (Сообщение 398780)
var a = src.split('/').pop()


Либо substr с последней позиции "/". Если только имя без расширения, то удалить расширение.

Спасибо, все сработало)

AnnushkaV 06.12.2015 13:21

Решаю задачу дальше
 
Дальше по ходу решения своей задачи столкнулась со следующим http://codepen.io/AnnushkaV/pen/ZQELmL . Вырезала часть src. Эта часть src - это ID описания для соответствующей картинки. т.е. при клике на маленькую картинку рядом открывается большая ее версия. При наведении на большую картинку(блок справа), появляется описание для большой картинки. Описание появляется, но оно накапливается после каждого клика по маленькой картинке и наведения на большую. Как сделать что бы выводилось каждый раз только описание для выбранной картинки? Спасибо.

Mess4me 06.12.2015 13:30

AnnushkaV,
а что означает накапливается?
Я попробывал - вроде всё ок.

laimas 06.12.2015 13:31

mouseover заменить на mouseenter. Только зачем же так писать:

var bigImg = $(".films-descr");
bigImg.on('mouseover', function(){
var $this = $(bigImg); //а ведь уже кеширован объект в bigImg, причем $this далее не используется
var str = $(this).closest('div#img-container').find('img').attr('src'); //и здесь тоже самое $(this) и есть bigImg
var res = str.split("/").pop();
var res1 = res.split(".").shift();
$(this).find("#" + res1).show(); //опять ...

AnnushkaV 06.12.2015 13:33

Цитата:

Сообщение от laimas (Сообщение 398913)
mouseover заменить на mouseenter. Только зачем же так писать:

var bigImg = $(".films-descr");
bigImg.on('mouseover', function(){
var $this = $(bigImg); //а ведь уже кеширован объект в bigImg, причем $this далее не используется
var str = $(this).closest('div#img-container').find('img').attr('src'); //и здесь тоже самое $(this) и есть bigImg
var res = str.split("/").pop();
var res1 = res.split(".").shift();
$(this).find("#" + res1).show(); //опять ...

третий день пишу на jQuery) пишу пока так что бы не потеряла логику

laimas 06.12.2015 13:41

Цитата:

Сообщение от AnnushkaV
пишу пока так что бы не потеряла логику

Так тут как раз и нет логики :)

AnnushkaV 06.12.2015 13:46

Цитата:

Сообщение от laimas (Сообщение 398917)
Так тут как раз и нет логики :)

пока учусь) поменяла mouseover на mouseenter. не сработало(

AnnushkaV 06.12.2015 13:48

Цитата:

Сообщение от Mess4me (Сообщение 398912)
AnnushkaV,
а что означает накапливается?
Я попробывал - вроде всё ок.

когда первый раз наводите, то нормально, а если потом кликаете на маленькой, а потом hover на большую, то описание и текущей картинки и предыдущей

AnnushkaV 06.12.2015 19:10

не знаю правильно ли... http://codepen.io/AnnushkaV/pen/ZQELmL
получается что раньше я только показывала каждое описание, но не прятала. теперь пытаюсь спрятать после того как убрался курсор. не срабатывает(

AnnushkaV 06.12.2015 20:39

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

laimas 07.12.2015 00:50

Цитата:

Сообщение от AnnushkaV
поменяла mouseover на mouseenter. не сработало

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

Можно конечно прятать/показывать нечто, то есть проверили создан ли объект с описанием, и если да, то показать, иначе сперва создать. Но ведь не факт, что пользователь будет кататься по элементам просматривая их описания по несколько раз, а значит и плодить объекты забивая ими документ не лучшее решение.

.mouseenter() - создали объект с описанием и отобразили его.
.mouseleave() - удалили созданный объект с описанием.

И ничего плодится не будет.

как теперь навести порядок в коде?

var name, bigImg = $(".films-descr").on('mouseenter', function(){  
        var im   =  bigImg.closest('div#img-container')
                          .find('img');
        name =  im.attr('src')
                  .split("/")
                  .pop()
                  .split(".")
                  .shift();   
        //здесь создавалась переменная mess- зачем, если не видно ее использования?
        //это создали объект и показали
        $("<h2>"+im.attr('title')+"</h2>").prependTo(bigImg.find("#" + name)).show();    
    }).on('mouseleave', function(){
       //это сокращение, ибо name определили при заходе мышью на объект
       //но с учетом выше сказанного, здесь нужен не .hide()
       //а удаление ранее созданного объекта - remove() со всеми его потомками. 
       bigImg.find("h2").empty()
       bigImg.find("#" + name).hide();    
    });


JQ всегда возвращает объект-источник, поэтому можно писать сразу:

var name_var = $(selector).on(event, function() {...}) - и name_var = $(selector), или установить объекту обработчик, а кешировать его первый дочерний элемент, тогда:
var name_var = $(selector).on(event, function() {...}).children().first() и $(selector) получит обработчик, а name_var = первый дочерний элемент $(selector).

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

AnnushkaV 09.12.2015 17:35

Цитата:

Сообщение от laimas (Сообщение 398955)
Эти события отличаются друг от друга ...

Спасибо Вам огромнейшее за помощь и подробное объяснение) Буду разбираться)


Часовой пояс GMT +3, время: 07:06.