У меня есть этот код, которые позволяют мне преобразовывать из 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);
}
Обратите внимание на плагин hoverIntent для jQuery. Он дает вам новый обработчик событий, который срабатывает только в том случае, если вы зависаете над элементом в течение определенного времени. Изменив его параметры, вы сможете заставить его делать именно то, что вы хотите.
Кажется, это работает ( 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'));
});
Просто используйте флаг, чтобы сообщить вам, если мышь находится над ним.
var mouseover = false;
$('.thing').mouseenter(function(){
mouseover = true;
}).mouseleave(function(){
mouseover = false;
});
Вот один способ:
Когда вы устанавливаете .hover () для элемента, вы можете передать ему 2 функции. Первая срабатывает, когда указатель мыши находится над элементом, вторая срабатывает, когда мышь перемещается.
Первая функция может установить currentElementId
(или какой-либо другой флаг), а вторая функция очистит это . Таким образом, единственное, что вам нужно сделать, это проверить, является ли currentElementId
пустым.
Вы можете использовать setTimeout ('sleep', sleep_time)
для вызова функции по истечении заданного времени.
Назначьте обработчики событий для onmouseover и onmouseout.
Эти обработчики изменяют флаг, чтобы проверить, находится ли мышь по-прежнему на элементе.
Внутри функции сна вы можете проверить флаг и просто вернуть его.