Jump to content
  • 0

Чего я не понимаю


rash
 Share

Question

Минимальный код для иллюстрации вопроса:

$(document).ready(
function () {
var state = {flag: false};
$('.boundary').mousedown(function () {
state.flag = true;
console.log(state);
});
$('.boundary').mouseup(function () {
state.flag = false;
console.log(state);
});
}
)

Как я представляю себе работу этого кода:

1. когда загрузился DOM, выполняется этот код, и мы имеем переменную-объект с полем flag = false, в этот момент назначаются, но не выполняются обработчики;

2. когда мы кликаеем на элемент, сначала запускается обработчик mousedown, который записывает в поле flag значение true, и выводит объект state в консоль (в этот момент flag=true);

3. затем происходит событие mouseup, и в поле flag записывается значение false, затем в консоль выводится объект state с полем flag = false.

В чем мои рассуждения неверны? Почему в обоих случаях в консоли flag = false? Причем если глобально использовать не объект, а просто переменную-примитив, то все работает так, как я предполагаю.

Что я упускаю из виду, какую тему мне надо перечитать еще 20 раз? :)

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

Гм, ну я у себя написал код, который не работал, потом примерно локализовал ошибку и выкинул лишнее, чтобы осталась только сама проблема. На JSFiddle не смотрел :)

Гм, посмотрел, оказывается все работает так, как я рассчитываю, только в фаерфоксе. В Сафари и Опере всегда получаю false. Интересно, чей это баг :) В принципе, с этим можно мириться, поскольку именно этот код можно заточить под определенный браузер, задача позволяет, но, блин, интеречно, что за фигня.

Link to comment
Share on other sites

  • 0

Если на JSfiddle, то надо было выбирать слева "no wrap (head)", иначе оно в еще один $(window).load(function(){ ... } оборачивает, что сильно меняет момент инциализации...

Но вот теперь объясните мне, полному тупице: почему для обработчиков мышки этот state действительно становится глобальным? Потому что у них общий activation object и этот state живет в его контексте?

Link to comment
Share on other sites

  • 0

По ходу дела, баг в консоли Хрома (в Опере пока не смотрел, в IE9 вроде адекватно). Хром, видимо, фигачит в консоль честную ссылку на объект — и естественно, после отпускания мышки (а иначе запись в консоли не раскрыть) там уже обновленное значение с false. Вот в таком варианте если раскрыть object сразу — таким он и останется, а если сначала кликнуть другой див и раскрыть оба object-а — они будут одинаковыми...

Link to comment
Share on other sites

  • 0

Но вот теперь объясните мне, полному тупице: почему для обработчиков мышки этот state действительно становится глобальным? Потому что у них общий activation object и этот state живет в его контексте?

Он не становится глобальным. Он болтается где-то в замыканиях или недрах объектов jQuery

Link to comment
Share on other sites

  • 0

Ну по крайней мере одно радует — фактической ошибки в моем коде нет :) Было бы стыдно заблудиться в трех соснах.

Да, похоже особенность консоли — показывает поля объекта в момент раскрытия, причем их состояние на момент раскрытия.

Если выводить console.log(state.flag); — все OK.

Ну и если обратиться к полю между этими событиями — по mousemove, например, то все ведет себя предсказуемо.

Вроде, теперь ясно.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy