Дело в том что когда прокручивается колесо мыши, то происходит сразу несколько alert'ов (событий), можете сами убедиться на этом примере:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var tempScrollTop,currentScrollTop = 0;
var way = "default"; // направление
$(window).scroll(function()
{
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop)
{
way= "down"; // крутнули вниз колесо
}
else if (tempScrollTop > currentScrollTop)
{
way= "up"; // крутнули вверх колесо
}
tempScrollTop = currentScrollTop;
alert(way);
});
});
</script>
</head>
<body>
<style>
body { height: 3000px; }
</style>
</body>
</html>
возможно ли как это отрегулировать, чтобы на 1-ну прокрутку срабатывало только 1-но событие, т.е. 1 alert?
Спустя 40 минут, 40 секунд (19.04.2012 - 17:37) SoMeOnE написал(а):
Когда срабатывает алерт, определи какую нибудь переменную как true допустим.
И до события прокрутки проверяй эту переменную. Т.е глобально определи ее как фалсе. И если фалсе тогда события срабатывает, если уже тру, то нет.
И до события прокрутки проверяй эту переменную. Т.е глобально определи ее как фалсе. И если фалсе тогда события срабатывает, если уже тру, то нет.
Спустя 2 минуты, 51 секунда (19.04.2012 - 17:39) redreem написал(а):
bingo = false;
$(document).ready(function(){
if (bingo) return; else bingo = true;
var tempScrollTop,currentScrollTop = 0;
var way = "default"; // направление
$(window).scroll(function()
{
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop)
{
way= "down"; // крутнули вниз колесо
}
else if (tempScrollTop > currentScrollTop)
{
way= "up"; // крутнули вверх колесо
}
tempScrollTop = currentScrollTop;
alert(way);
});
});
Спустя 12 минут, 4 секунды (19.04.2012 - 17:51) Stasonix написал(а):
redreem
так вообще alert не срабатывает. Имеется в виду что если 1 раз крутанули, 1 раз он и сработал, затем если еще раз крутанули, опять сработал alert, а не 1 раз крутанули и 30 раз он сработал.
так вообще alert не срабатывает. Имеется в виду что если 1 раз крутанули, 1 раз он и сработал, затем если еще раз крутанули, опять сработал alert, а не 1 раз крутанули и 30 раз он сработал.
Спустя 9 минут, 1 секунда (19.04.2012 - 18:00) Stasonix написал(а):
по возможности, если кто ни въехал или скрип работает правильно, попробуйте открыть в IE 8, поймете в чем дело.
Спустя 15 минут, 30 секунд (19.04.2012 - 18:16) Stasonix написал(а):
допустим, черт с ним с alert'ом, если там функция допустим анимации:
у меня alert('CALLBACK'); сработал 3 раза в chrome.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var tempScrollTop,currentScrollTop = 0;
var way = "default"; // направление
$(window).scroll(function()
{
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop)
{
way= "down"; // крутнули вниз колесо
}
else if (tempScrollTop > currentScrollTop)
{
way= "up"; // крутнули вверх колесо
}
tempScrollTop = currentScrollTop;
// alert(way); console.log('way: '+way);
$('#test').animate({top:"40px"},100,function(){ alert("CALLBACK"); });
});
});
</script>
</head>
<body>
<style>
body { height: 3000px; }
#test { border: 1px solid; width: 100px; height: 100px; }
</style>
<div id="test"></div>
</body>
</html>
у меня alert('CALLBACK'); сработал 3 раза в chrome.
Спустя 42 минуты, 49 секунд (19.04.2012 - 18:59) redreem написал(а):
$(document).ready(function(){
var tempScrollTop,currentScrollTop = 0;
var way = "default"; // направление
bingo = false;
$(window).scroll(function() {
if (bingo) return; else bingo = true;
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop) {
way= "down"; // крутнули вниз колесо
} else if (tempScrollTop > currentScrollTop) {
way= "up"; // крутнули вверх колесо
}
tempScrollTop = currentScrollTop;
window.setTimeout(function() {
bingo = false;
},200);
alert(way);
});
});
да ж проверил в IE8 :)
Спустя 5 часов, 34 минуты, 57 секунд (20.04.2012 - 00:34) Stasonix написал(а):
что-то я поспешил радоваться с этими bingo и т.п., так как это локальная задача была, лучше расскажу суть глобальной, потому что не получается у меня с вашими вариантами:
имеется слайдер, который работает по скроллу, скроллит к нужному якорю, все это относится к ИЕ, в частности к 8-й его версии, так как на других я ни тестил, сейчас это выглядит так:
увы, это нерабочий вариант, обычную анимацию без полосы прокрутки я не могу использовать, это обусловлено тем что в телефонах тогда не будет работать, идиотизм может быть, но других я не вижу вариантов.
имеется слайдер, который работает по скроллу, скроллит к нужному якорю, все это относится к ИЕ, в частности к 8-й его версии, так как на других я ни тестил, сейчас это выглядит так:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript" src="underscore-min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var tempScrollTop,currentScrollTop = 0;
var way = "default";
// array of the anchors
var jak = new Array("jak1","jak2","jak3","jak4");
i = 0;
// scroll to id
function goToByScroll(id)
{
$('html,body').animate({scrollTop: $("#"+id).offset().top},"fast");
}
$(window).scroll(function()
{
currentScrollTop = $(window).scrollTop();
if (tempScrollTop < currentScrollTop)
{
way= "down";
i++;
}
else if (tempScrollTop > currentScrollTop)
{
way= "up";
i--;
}
tempScrollTop = currentScrollTop;
if (i<0) { ++i; }
if (i>=4){ --i; }
// so, we go the current anchor
goToByScroll(jak[i]);
});
});
</script>
</head>
<body>
<style>
html,body { width: 100%; height: 100%;}
div { margin: 0 auto; border: 1px solid; width: 500px; height: 100%; text-align: center; }
</style>
<div id="jak1">1</div>
<div id="jak2">2</div>
<div id="jak3">3</div>
<div id="jak4">4</div>
</body>
</html>
увы, это нерабочий вариант, обычную анимацию без полосы прокрутки я не могу использовать, это обусловлено тем что в телефонах тогда не будет работать, идиотизм может быть, но других я не вижу вариантов.
Спустя 7 часов, 9 минут, 40 секунд (20.04.2012 - 07:43) redreem написал(а):
глянь код. из монитора увидишь, что проблема в определении направления скрола. дальше сам попробуй попили.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<style>
html,body { width: 100%; height: 100%;}
div { margin: 0 auto; border: 1px solid; width: 500px; height: 100%; text-align: center; }
</style>
<div id="monitor" style="position:fixed;width:500px;top:20px;left:0;border:1px solid #faa;height:50px">монитор</div>
<div id="jak1">1</div>
<div id="jak2">2</div>
<div id="jak3">3</div>
<div id="jak4">4</div>
<script type="text/javascript">
$$BS = bingoScroller = {
tempScrollTop:0,
currentScrollTop:0,
bingo:false,
way:'default',
jak:new Array("jak1","jak2","jak3","jak4"),
i:0,
monitor:function() {
$('#monitor').html(
'tempScrollTop: ' + $$BS.tempScrollTop +
' currentScrollTop: ' + $$BS.currentScrollTop +
' bingo: ' + $$BS.bingo +
' way: ' + $$BS.way +
' i: ' + $$BS.i
);
},
goToByScroll:function(id) {
var o = $("#"+id).offset().top;
$('html,body').animate({scrollTop: o},"fast", function() {
$$BS.monitor();
window.setTimeout(function() {
$$BS.bingo = false;
$$BS.monitor();
},400);
});
},
onScroll:function() {
this.monitor();
if (this.bingo) return; else this.bingo = true;
this.currentScrollTop = $(window).scrollTop();
if (this.tempScrollTop < this.currentScrollTop) {
this.way= "down";
this.i++;
} else if (this.tempScrollTop > this.currentScrollTop) {
this.way= "up";
this.i--;
}
this.tempScrollTop = this.currentScrollTop;
if (this.i<0) { i = 0; }
if (this.i>4) { i = this.jak.length - 1; }
// so, we go the current anchor
this.goToByScroll(this.jak[this.i]);
}
};
$(document).ready(function(){
$(window).scroll( function() { $$BS.onScroll(); } );
});
</script>
</body>
</html>