Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery Scroll(), проблема в Опере (https://javascript.ru/forum/jquery/31043-jquery-scroll-problema-v-opere.html)

JEEN 24.08.2012 14:18

jQuery Scroll(), проблема в Опере
 
$(window).scroll(function () { 
      $("span").slideToggle(); 
      alert('dsf');
});

span выполнит 3 действия, вместо 1
а alert будет выскакивать 6 раз. В Google Chrome такой проблемы нет.

Это только у меня такой баг или это проблема оперы? в интернете не нашел ничего по этому багу.

P.S. и еще, дайте пожалуйста ссылку на онлайн интерпретатор JS, Jquery, html. Чтобы можно было тестировать код.

В документации есть пример с $("span").css("display", "inline").fadeOut("slow");
он и у меня работает нормально, но с другими функциями происходит многократный вызов

Deff 24.08.2012 14:43

JEEN,
Пробуйте так:
var TimeId;
$(window).scroll(function () {
      clearTimeout(TimeId);
      TimeId=setTimeout(function () {
      $("span").slideToggle(); 
      alert('dsf');
      },10)
});

Интересна версия Оперы - у мну в 11.5 - нет подобного

Deff 24.08.2012 14:45

Цитата:

Сообщение от JEEN
а alert будет выскакивать 6 раз. В Google Chrome такой проблемы нет.

Зы - ксать траблы cо Scroll могут быть из-за алерта - выводите сообщение в
div с position:fixed;

Allert прерывает события - и они могут возникать снова и снова

LittlePony 24.08.2012 14:51

Цитата:

Сообщение от Deff (Сообщение 200252)
Зы - ксать траблы cо Scroll могут быть из-за алерта - выводите сообщение в
div с position:fixed;

Allert прерывает события - и они могут возникать снова и снова

похоже, что алерт здесь только для отладки. Если так, то и вовсе лучше console.log()

JEEN 24.08.2012 14:52

Опера 12-я

$(window).scroll(function(){ 
      $("span").append('<b>текст</b><br/>'); 
    });

вот этот код вставляет "текст" 17 раз, вместо 1ого

JEEN 24.08.2012 15:02

http://demo.lovetcms.ru/
вот пример сделал. У вас нормально?

Deff 24.08.2012 15:04

Ну дык на сколько прокрутили - событий то несколько
Вы что думаете что скроллите непрерывно - ?

var TimeId;
$(window).scroll(function () {
      clearTimeout(TimeId);
      TimeId=setTimeout(function () {
       $("span").append('<b>текст</b><br/>');  
      },100)
});


Вы текст не .append а div.html('<b>текст</b><br/>') Всовывайте - иначе при каждой прокрутке/дерге добавки

JEEN 24.08.2012 15:12

Deff, мне нужно, чтобы текст добавлялся, а не обновлялся, поэтому html не катит.

за 2 косания колесика мыши у меня должно быть так (скриншот с гугл хрома)


а в опере у меня так

LittlePony 24.08.2012 15:18

В конце концов, всегда можно сделать так:
var text = ""
$(window).scroll(function(){
      text = "<b>текст</b><br/>"
})
$("span").append(text)

JEEN 24.08.2012 15:25

Цитата:

Сообщение от LittlePony (Сообщение 200266)
В конце концов, всегда можно сделать так:

не работает вообще

LittlePony 24.08.2012 15:30

конечно не работает :) простите
но читать надо вдумчиво, а не просто копировать.
Основная идея, надеюсь, понятна?

JEEN 24.08.2012 15:38

1. не нужно всех считать идиотами, я ваш код "обдумывал".
2. идея понятна, но и то она "не рабочая" даже на простом примере, а у меня в результате гораздо сложней будет конструкция, там этот "обход" не прокатит
3. Ваша идея заключалась в том, чтобы функция scroll выполнила 17 раз операцию text = 'текст', а потом один раз вставила ее на страницу. Меня такой костыль вряд ли устроит.

вот рабочий пример того что мне нужно
http://www.jstoolbox.com/demo/endless/
используется scroll(), но без бага и без костылей.

JEEN 24.08.2012 16:00

в FireFox тоже все нормально. Только опера выполняет команду больше 1 раза..

LittlePony 24.08.2012 16:03

здесь правильнее поступить так: .scroll() должен только менять состояние — пусть это будет переменная, флаг.
А функция подгрузки дополнительных сообщений должна быть подписана на событие изменения состояния этого флага.
И тогда вы не зависите от багов различных своеобразных браузеров.

melky 24.08.2012 16:07

Цитата:

Сообщение от JEEN (Сообщение 200276)
в FireFox тоже все нормально. Только опера выполняет команду больше 1 раза..

Вы пробовали как-либо ограничивать скорость вызовов* обработчика ?

* отношение количества вызовов к прошедшему времени. или частота вызова, напр. раз в 1 мс.

var last = 0;

$(window).scroll(function()
    var now = +new Date;
    if (now - last > 1) {
        last = now;
        // code ...
        $("span").append('<b>текст</b><br/>'); 
    }
}

JEEN 24.08.2012 16:23

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

очень много где используется scroll(), но везде работает без багов. Такое ощущение, что только у меня такой косяк. В любом случае, всем спасибо за помощь.

melky 24.08.2012 16:24

Цитата:

Сообщение от JEEN
Но это костыль

это один из путей увеличения производительности - ибо это событие при прокрутке вызывается очень часто, и если в обработчике что-то отрисовывается на странице (имитация position:fixed сюда же), то будет нехило тормозить.

тем более, если Вы работаете с DOM - будьте готовы к костылям на каждой строке.

LittlePony 24.08.2012 16:33

Цитата:

Сообщение от JEEN (Сообщение 200286)
Но это костыль

нет, это не костыль. Это разграничение сущностей.

JEEN 24.08.2012 16:40

melky, вы меня убедили, спасибо за объяснение.

сделал так
var scrollTimer = null;
$(window).scroll(function () {
    if (scrollTimer) {
        clearTimeout(scrollTimer);
    }
    scrollTimer = setTimeout(handleScroll, 500);
});


});
function handleScroll() {
    scrollTimer = null;
    $("span").append('<b>текст</b><br/>');  
}


и наконец-то нашел этот сервис http://jsfiddle.net/akaAU/10/

всем спасибо!


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