Ответ 1
В обоих браузерах это ошибка. Более подробно на обеих ссылках (также в комментариях):
http://code.google.com/p/chromium/issues/detail?id=26723
и
Я использую этот код jQuery, чтобы установить указатель мыши на его занятое состояние (песочные часы) во время вызова Ajax...
$('body').css('cursor', 'wait');
и этот соответствующий код, чтобы вернуть его в нормальное состояние...
$('body').css('cursor', 'auto');
Это отлично работает... на некоторых браузерах.
В Firefox и IE, как только я выполню команду, курсор мыши изменится. Это поведение, которое я хочу.
В Chrome и Safari курсор мыши заметно не меняется с "занят" на "авто", пока пользователь не переместит указатель.
Каков наилучший способ заставить неохотные браузеры переключать указатель мыши?
В обоих браузерах это ошибка. Более подробно на обеих ссылках (также в комментариях):
http://code.google.com/p/chromium/issues/detail?id=26723
и
Я предпочел бы сделать это более элегантно, например:
$(function(){
$("html").bind("ajaxStart", function(){
$(this).addClass('busy');
}).bind("ajaxStop", function(){
$(this).removeClass('busy');
});
});
CSS
html.busy, html.busy * {
cursor: wait !important;
}
Источник: http://postpostmodern.com/instructional/global-ajax-cursor-change/
Я считаю, что эта проблема (включая проблему mousedown) теперь исправлена в Chrome 50.
Но только если вы не используете инструменты разработчика!
Закройте инструменты, и курсор должен немедленно реагировать лучше.
Я получил вдохновение из решения Korayem.
JavaScript:
jQuery.ajaxSetup({
beforeSend: function() {
$('body').addClass('busy');
},
complete: function() {
$('body').removeClass('busy');
}
});
CSS
.busy * {
cursor: wait !important;
}
Протестировано в Chrome, Firefox и IE 10. Курсор изменяется без перемещения мыши. "Важно" необходимо для IE10.
Изменить: вам по-прежнему нужно перемещать курсор на IE 10 после завершения запроса AJAX (так что появляется нормальный курсор). Подождите, пока курсор не появится, не перемещая мышь.
Прежде всего, вы должны знать, что если у вас есть курсор, назначенный любому тегу внутри вашего тела, $('body').css('cursor', 'wait');
не изменит курсор этого тега (например, я использую cursor: pointer;
для всех своих якорных тегов). Вы можете сначала взглянуть на мое решение этой конкретной проблемы: курсор ждет вызова ajax
В связи с тем, что курсор обновляется только после того, как пользователь перемещает мышь в браузерах webkit, как говорят другие, нет реального решения.
При этом все еще существует обходное решение, если вы добавляете css spinner к текущему курсору динамически. Это не идеальное решение, потому что вы точно не знаете размер курсора, и если счетчик будет правильно установлен.
CSS spinner после курсора: DEMO
$.fn.extend(
{
reset_on : function(event_name, callback)
{ return this.off(event_name).on(event_name, callback); }
});
var g_loader = $('.loader');
function add_cursor_progress(evt)
{
function refresh_pos(e_)
{
g_loader.css({
display : "inline",
left : e_.pageX + 8,
top : e_.pageY - 8
});
}
refresh_pos(evt);
var id = ".addcursorprog"; // to avoid duplicate events
$('html').reset_on('mousemove' + id, refresh_pos);
$(window).
reset_on('mouseenter' + id, function(){ g_loader.css('display', 'inline'); }).
reset_on('mouseleave' + id, function(){ g_loader.css('display', 'none'); });
}
function remove_cursor_progress(evt)
{
var id = ".addcursorprog";
g_loader.css('display', 'none');
$('html').off('mousemove' + id);
$(window).off('mouseenter' + id).off('mouseleave' + id);
}
$('.action').click(add_cursor_progress);
$('.stop').click(remove_cursor_progress);
Вам нужно будет проверить, не является ли это сенсорным устройством var isTouchDevice = typeof window.ontouchstart !== 'undefined';
В заключение вы должны попытаться добавить на свою страницу статический счетчик или что-то еще, что показывает процесс загрузки, а не пытается сделать это с помощью курсора.
Я не думаю, что вы сможете это сделать.
Однако попробуйте изменить положение прокрутки; это может помочь.
Решение Korayem работает для меня в 100% случаях в современном Chrome, Safari, в 95% случаев в Firefox, но не работает в Opera и IE.
Я немного улучшил его:
$('html').bind('ajaxStart', function() {
$(this).removeClass('notbusy').addClass('busy');
}).bind('ajaxStop', function() {
$(this).removeClass('busy').addClass('notbusy');
});
CSS
html.busy, html.busy * {
cursor: wait !important;
}
html.notbusy, html.notbusy * {
cursor: default !important;
}
Теперь он работает в 100% случаях в Chrome, Safari, Firefox и Opera. Я не знаю, что делать с IE: (
Попробуйте использовать правильное значение css для свойства курсора:
$('body').css('cursor','wait');
Я не пробовал это, но как насчет создания прозрачного div, который абсолютно позиционируется и заполняет область просмотра непосредственно перед изменением CSS. Затем, когда css изменяется на теле, удалите div. Это может вызвать событие mouseover на теле, что может привести к обновлению курсора до последнего значения CSS.
Опять же, я не тестировал это, но это того стоит.
Привет, ребята, у меня есть ничтожное gritty решение, которое работает во всех браузерах. Предположена библиотека протойпе. Кто-то может написать это как простой Javascript. Решение состоит в том, чтобы иметь div поверх всего сразу после вас reset курсора и немного встряхнуть его, чтобы заставить курсор двигаться. Это опубликовано в моем блоге http://arunmobc.blogspot.com/2011/02/cursor-not-changing-issue.html.
ЗДЕСЬ мое решение:
function yourFunc(){
$('body').removeClass('wait'); // this is my wait class on body you can $('body').css('cursor','auto');
$('body').blur();
$('body').focus(function(e){
$('body')
.mouseXPos(e.pageX + 1)
.mouseYPos(e.pageX - 1);
});
}
С jquery 1.9 вы должны ajaxStart и ajaxStop документировать. Они отлично работают для меня в firefox. Не тестировались в других браузерах.
В CSS:
html.busy *
{
cursor: wait !important;
}
В javaScript:
// Makes the mousecursor show busy during ajax
//
$( document )
.ajaxStart( function startBusy() { $( 'html' ).addClass ( 'busy' ) } )
.ajaxStop ( function stopBusy () { $( 'html' ).removeClass( 'busy' ) } )
Вероятно, это ошибка в WebKit; вы должны сообщить об этом.
$( '*') CSS ( 'курсор', 'ждать'); будет работать везде на странице, включая ссылки