2016-12-14 2 views
0

При зависании div .f_bb он должен просто показать .f_bloc и добавить к нему класс. Когда зависание заканчивается (когда курсор выходит из него), он должен исчезать и скрываться. Но по какой-то причине я не могу заставить его работать.Onmouseenter/Onmouseleave fadeOut не работает

HTML

<div id="fc3"><div class="f_bb">test 
<div class="f_bloc">roat</div></div></div> 

CSS

.test {color: red} 
.f_bloc {display: none} 

JS

$(document).ready(function() { 
    $("#fc3 .f_bb").onmouseenter(function() { 
     $(this).closest(".f_bloc").show(); 
     $(this).closest(".f_bloc").addClass("test"); 
    }); 
}); 

$(document).ready(function() { 
    $("#fc3 .f_bb").onmouseleave(function() { 
     $(this).closest(".f_bloc").fadeOut(1000, function() { 
      $(this).closest(".f_bloc").hide(); 
     }); 
    }); 
}); 

Jsfiddle: https://jsfiddle.net/ebcm08tL/ ОБНОВЛЕНОhttps://jsfiddle.net/ebcm08tL/2/

+0

Откройте свой инструменты разработчика браузера и посмотреть на ошибки в консоли – j08691

+0

@ j08691 Ничего не говорит:/ – mSyx

+0

Это абсолютно так. – j08691

ответ

0

Проблема в том, что вы использовали метод .closest(). С .children() метод работает отлично для меня, и вы также должны включить jquery, если вы этого не сделали.

$(document).ready(function() { 
 
$("#fc3 .f_bb").mouseover(function() { 
 
    $(this).children(".f_bloc").show(); 
 
    $(this).children(".f_bloc").addClass("test"); 
 
}); 
 
}); 
 

 
$(document).ready(function() { 
 
$("#fc3 .f_bb").mouseleave(function() { 
 
    $(this).children(".f_bloc").fadeOut(1000, function() { 
 
    $(this).children(".f_bloc").hide(); 
 
    }); 
 
}); 
 
});
.test {color: red} 
 
.f_bloc {display: none}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="fc3"><div class="f_bb">test 
 
<div class="f_bloc">roat</div></div></div>

+0

Thankju, он отлично работает. – mSyx

0

jQuery использует .mouseenter() и .mouseleave(), а не .onmouseenter() и .onmouseleave().

+0

Спасибо за ваш ответ. По-прежнему не работает, или я что-то упускаю. Обновлен JSfiddle: https://jsfiddle.net/ebcm08tL/2/ – mSyx

+0

Вам также нужно заменить '.closest'' .children', потому что '.closest' пытается сопоставить родителей элемента, но div, который вы хотите отобразить является дочерним элементом div, который вы наводите, а не родителем. –

+0

Большое спасибо, он работает. – mSyx

1

Хороший способ сделать это состоит в отвязать любые существующие события (можно присваивать имена) первым, чтобы избежать дублирования:

$("#fc3 .f_bb").unbind('mouseenter.fc3').on('mouseenter.fc3', function (event) { 
     // mouseenter actions 
    }); 

    $("#fc3 .f_bb").unbind('mouseleave.fc3').bind('mouseleave.fc3', function (event) { 
     // mouseleave actions 
    }); 
+0

Спасибо, друг! ^^ – mSyx

0

Try добавляя id к вашему div который содержит roat текст и попробуйте использовать children() вместо closest() как div Вы пытаетесь найти на самом деле детей ,

Рабочая демо

$(document).ready(function() { 
 
    $("#fc3 .f_bb").mouseenter(function() { 
 

 
    $(this).children("#block").show(); 
 
    $(this).children("#block").addClass("test"); 
 
    }); 
 

 
    $("#fc3 .f_bb").mouseleave(function() { 
 
    $(this).children("#block").fadeOut(1000, function() { 
 
     $(this).children("#block").hide(); 
 
    }); 
 
    }); 
 
});
.test { 
 
    color: red 
 
} 
 
.f_bloc { 
 
    display: none 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="fc3"> 
 
    <div class="f_bb">test 
 
    <div id="block" class="f_bloc">roat</div> 
 
    </div> 
 
</div>

+0

Работает с классами, я собираюсь использовать класс, так как будет несколько f_bloc: p Спасибо! – mSyx

0

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

$(document).ready(function() { 
 
    $("#fc3 .f_bb").mouseenter(function() { 
 
    var f_bloc = $(this).children(".f_bloc"); 
 
    f_bloc.show(); 
 
    f_bloc.addClass('test'); 
 

 

 
    }); 
 
    $("#fc3 .f_bb").mouseleave(function() { 
 
    var f_bloc = $(this).children(".f_bloc"); 
 
    f_bloc.fadeOut(1000, function() { 
 
     f_bloc.hide(); 
 
    }); 
 
    });     
 
});
.test {color: red} 
 
.f_bloc {display: none }
<div id="fc3"> 
 
    <div class="f_bb"> 
 
    test 
 

 
    <div class="f_bloc"> roat </div> 
 
    </div> 
 
</div> 
 
<script src="https://code.jquery.com/jquery.js"></script>

+0

Спасибо! Но если предположить, что в коде будет несколько .f_bloc, это вызовет их всех, не так ли? – mSyx

+0

@mSyx в этом cas вы должны использовать 'children()', я отредактировал свой ответ –

+0

Спасибо, помощник! :> – mSyx