Проблемы с производительностью в обработчике javascript onclick - PullRequest
1 голос
/ 20 мая 2009

Я написал игру на java-скрипте, и пока она работает, она медленно реагирует на несколько кликов. Ниже приведена очень упрощенная версия кода, который я использую для обработки кликов, и он по-прежнему не отвечает на второй щелчок 2, если вы не подождете достаточно долго. Это то, что мне нужно просто принять, или есть более быстрый способ быть готовым к следующему клику?

Кстати, я присоединяю эту функцию, используя AddEvent из конкурса перекодирования quirksmode.

var selected = false;
var z = null;
function handleClicks(evt) {
    evt = (evt)?evt:((window.event)?window.event:null);
    if (selected) {
        z.innerHTML = '<div class="rowbox a">a</div>';
        selected = false;
    } else {
        z.innerHTML = '<div class="rowbox selecteda">a</div>';
        selected = true;
    }
}

Живой код можно увидеть по адресу http://www.omega -link.com / index.php? Content = testgame

Ответы [ 4 ]

3 голосов
/ 20 мая 2009

Вы можете попытаться изменить только имя класса вместо удаления / добавления div в DOM (что и делает свойство innerHTML).

Что-то вроде:

var selected = false;
var z = null;

function handleClicks(evt) 
{
    var tmp;

    if(z == null)
       return;

    evt = (evt)?evt:((window.event)?window.event:null);
    tmp = z.firstChild;
    while((tmp != null) && (tmp.tagName != 'DIV'))
        tmp = tmp.firstChild;
    if(tmp != null)
    {
      if (selected) 
      {
        tmp.className = "rowbox a";
        selected = false;
      } else 
      {
        tmp.className = "rowbox selecteda";
        selected = true;
      }
    }
}
2 голосов
/ 20 мая 2009

Я думаю, что ваша проблема в том, что второй щелчок регистрируется как событие dblclick, а не как событие click. Изменение происходит быстро, но 2-й щелчок игнорируется, если вы не подождете. Я бы предложил перейти к событию mousedown или mouseup.

1 голос
/ 20 мая 2009

Да, вы можете сравнить производительность innerHTML с document.createElement () или даже:

el.style.display = 'block' // turn off display: none.

Профилирование вашего кода может быть полезным при различных рефакторингах:

1 голос
/ 20 мая 2009

Я считаю, что ваша проблема - это изменение innerHTML, которое меняет DOM, что является огромной проблемой производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...