Как я изменяю цвет Cocos2d MenuItem?

Это верно - this внутри обработчика относится к элементу, который вызвал событие. Если вы хотите использовать методы jQuery, вам нужно обернуть его в $, чтобы сначала получить объект jQuery.

Если вы хотите избежать этого, если вы просто пытаетесь установить определенный атрибут данных, смело используйте вместо него .dataset, например:

jQuery('.selector').on('click', function(event) {
  this.dataset.attribute = 'foo';
});
[data-attribute="foo"] {
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="selector">click</div>

Это поведение идентично обработчикам событий в vanilla JS: this относится к элементу, который вызвал событие, что соответствует принцип наименьшего удивления:

document.querySelector('.selector').addEventListener('click', function(event) {
  this.dataset.attribute = 'foo';
});
[data-attribute="foo"] {
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="selector">click</div>

Было бы возможно создать функция on, которая сначала оборачивает this в jQuery, хотя это будет немного странно:

const on = (selector, event, handler) => {
  $(selector).on(event, function(...args) {
    handler.apply($(this), args);
  });
};
on('.selector', 'click', function(event) {
  this.attr('data-attribute', 'foo');
});
[data-attribute="foo"] {
  background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="selector">click</div>

6
задан Rob Sawyer 18 February 2009 в 02:15
поделиться

1 ответ

MenuItemFont *start =  [MenuItemFont itemFromString:@"Start Game" 
                                             target:self 
                                           selector:@selector(startGame:)];

[start.label setRGB:0 :0 :0]; // Black menu item

Маркировка является свойством MenuItemFont, подклассом MenuItem, таким образом, Вы теряете его во время неявного броска к MenuItem.

С другой стороны, Вы могли сделать:

[((MenuItemFont *)start).label setRGB:0 :0 :0] 

(но это ужасно, и startMenu возьмет MenuItemFont без жалоб).

Следует иметь в виду, что цвета по большей части hardcoded в MenuItemFont, таким образом звонить 'setIsEnabled' задержит цвета к серому или белому цвету. Это происходит вокруг строки 239 из MenuItem.m, если необходимо настроить ее. Если я найду время для создания патча для представления этой функциональности на MenuItemFont (предполагающий, что это уже не находится в этих пред.7.1 источниках), то я обновлю свое сообщение.

5
ответ дан 9 December 2019 в 20:49
поделиться