2010-02-02 3 views
1

Я пытаюсь сгладить производительность приложения карты, которое я создавал с помощью javascript. Первоначально я реализовал тащит сковороду с использованиемIE, сглаживающий панорамирование карты при перетаскивании

  • OnMouseDown
  • OnMouseMove
  • OnMouseUp

Однако в IE он чувствует себя очень вяло и, кажется, что при перемещении курсора очень быстро карта Безразлично» t обновите позицию до тех пор, пока не перестанете двигаться.

я преобразовал свой код, чтобы использовать собственные события IE

  • ondragstart
  • ondrag
  • ondragend

Спектакль был гораздо лучше при использовании этих событий, но, кажется, что я могу 'установите курсор мыши, используя стандартные свойства css. Я могу только установить курсор на несколько предопределенных, которые не то, что я хочу.

Так что мой вопрос. Как я могу либо сгладить перетаскивание в IE с помощью первого набора событий, либо как настроить пользовательский курсор, используя собственные события.

EDIT: Пример кода

Код очень простой. Даже когда я удаляю логику для загрузки новых фрагментов (т. Е. Только контейнер перемещается), он все еще чувствует себя неуклюжим. Ниже приведена функция панорамирования:

// the "this" object refers to the div containing all the tile layers. 
function movemap(e) 
{ 
    e = e || window.event; 
    var dx = this.mouseX - e.clientX; 
    var dy = this.mouseY - e.clientY; 

    if (dx !== 0 || dy !== 0) { 
     this.style.left = parseInt(this.style.left) + dx + 'px'; 
     this.style.top = parseInt(this.style.top) + dy + 'px'; 
     this.mouseX = e.clientX; 
     this.mouseY = e.clientY; 
    } 
} 
+0

Точный дубликат: http://stackoverflow.com/questions/2181482/ie-ondrag-event-setting-mouse-cursor-to-no-drop – jvenema

+0

Я удалил свой старый вопрос, поскольку, по-моему, этот лучшее объяснение проблемы. Спасибо. – Alex

ответ

1

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

Вялый эффект может быть вызван некоторыми тяжелыми операциями, которые вы выполняете внутри выполнения события. Система событий в браузере действительно интересна. Это синхронно. Это означает, что событие не будет запускаться снова, пока текущее выполнение не будет завершено.

Это означает, что у вас есть две возможности: 1. оптимизировать свой код внутри события, чтобы он занимал меньше процессорного времени или 2. делал ваше событие асинхронным и реализовывал собственную логику мьютекса/семафора.

Второе, что вы можете сделать, используя функцию setTimeout. Если вы выполняете setTimeout, ((код), 1) ваше событие будет продолжаться асинхронно, поэтому следующее событие будет отправлено, не ожидая завершения вашего кода. Ну, заранее, чтобы в этом случае вы должны начать думать о блокировке и очередности. В порядке очереди я имею в виду, чтобы поставить в очередь все отправленные события для будущего использования.

Давным-давно, я также получил асинхронную диспетчерскую обработку событий из-за какого-то тяжелого выполнения кода. Это сработало для меня. Возможно, это сработает и для вас.

Смежные вопросы