jQuery: мышь все еще по элементу?

У меня есть этот код, которые позволяют мне преобразовывать из HOST_ENDIAN_ORDER (независимо от того, что это) к LITTLE_ENDIAN_ORDER или BIG_ENDIAN_ORDER. Я использую шаблон, поэтому если я попытаюсь преобразовать от HOST_ENDIAN_ORDER до LITTLE_ENDIAN_ORDER, и они, оказывается, то же для машины, для которой я компилирую, никакой код не будет сгенерирован.

Вот код с некоторыми комментариями:

// We define some constant for little, big and host endianess. Here I use 
// BOOST_LITTLE_ENDIAN/BOOST_BIG_ENDIAN to check the host indianess. If you
// don't want to use boost you will have to modify this part a bit.
enum EEndian
{
  LITTLE_ENDIAN_ORDER,
  BIG_ENDIAN_ORDER,
#if defined(BOOST_LITTLE_ENDIAN)
  HOST_ENDIAN_ORDER = LITTLE_ENDIAN_ORDER
#elif defined(BOOST_BIG_ENDIAN)
  HOST_ENDIAN_ORDER = BIG_ENDIAN_ORDER
#else
#error "Impossible de determiner l'indianness du systeme cible."
#endif
};

// this function swap the bytes of values given it's size as a template
// parameter (could sizeof be used?).
template <class T, unsigned int size>
inline T SwapBytes(T value)
{
  union
  {
     T value;
     char bytes[size];
  } in, out;

  in.value = value;

  for (unsigned int i = 0; i < size / 2; ++i)
  {
     out.bytes[i] = in.bytes[size - 1 - i];
     out.bytes[size - 1 - i] = in.bytes[i];
  }

  return out.value;
}

// Here is the function you will use. Again there is two compile-time assertion
// that use the boost librarie. You could probably comment them out, but if you
// do be cautious not to use this function for anything else than integers
// types. This function need to be calles like this :
//
//     int x = someValue;
//     int i = EndianSwapBytes<HOST_ENDIAN_ORDER, BIG_ENDIAN_ORDER>(x);
//
template<EEndian from, EEndian to, class T>
inline T EndianSwapBytes(T value)
{
  // A : La donnée à swapper à une taille de 2, 4 ou 8 octets
  BOOST_STATIC_ASSERT(sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8);

  // A : La donnée à swapper est d'un type arithmetic
  BOOST_STATIC_ASSERT(boost::is_arithmetic<T>::value);

  // Si from et to sont du même type on ne swap pas.
  if (from == to)
     return value;

  return SwapBytes<T, sizeof(T)>(value);
}
11
задан thedp 7 December 2009 в 10:02
поделиться

5 ответов

Обратите внимание на плагин hoverIntent для jQuery. Он дает вам новый обработчик событий, который срабатывает только в том случае, если вы зависаете над элементом в течение определенного времени. Изменив его параметры, вы сможете заставить его делать именно то, что вы хотите.

15
ответ дан 3 December 2019 в 00:44
поделиться

Кажется, это работает ( http://jsbin.com/uvoqe )

$("#hello").hover( function () {
  $(this).data('timeout', setTimeout( function () {

    alert('You have been hovering this element for 1000ms');

  }, 1000));
}, function () {

  clearTimeout($(this).data('timeout'));

});
37
ответ дан 3 December 2019 в 00:44
поделиться

Просто используйте флаг, чтобы сообщить вам, если мышь находится над ним.

var mouseover = false;
$('.thing').mouseenter(function(){
    mouseover = true;
}).mouseleave(function(){
    mouseover = false;
});
10
ответ дан 3 December 2019 в 00:44
поделиться

Вот один способ:

Когда вы устанавливаете .hover () для элемента, вы можете передать ему 2 функции. Первая срабатывает, когда указатель мыши находится над элементом, вторая срабатывает, когда мышь перемещается.

Первая функция может установить currentElementId (или какой-либо другой флаг), а вторая функция очистит это . Таким образом, единственное, что вам нужно сделать, это проверить, является ли currentElementId пустым.

2
ответ дан 3 December 2019 в 00:44
поделиться

Вы можете использовать setTimeout ('sleep', sleep_time) для вызова функции по истечении заданного времени.

Назначьте обработчики событий для onmouseover и onmouseout.

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

Внутри функции сна вы можете проверить флаг и просто вернуть его.

1
ответ дан 3 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: