Я пытаюсь создать пользовательские события в JQuery, которые должны быть обнаружены при нажатии кнопки прокрутки 1.
Я знаю, что есть много текста, но все мои вопросы выделены жирным шрифтом и есть пример JSFiddle, на котором вы можете работать сразу.
Потому что я не нашел встроенных функций для этого,
Мне пришлось создать функцию hasScroll
, проверяя, имеет ли элемент полосу прокрутки,
$.fn.hasScroll = function(axis){
var overflow = this.css("overflow"),
overflowAxis;
if(typeof axis == "undefined" || axis == "y") overflowAxis = this.css("overflow-y");
else overflowAxis = this.css("overflow-x");
var bShouldScroll = this.get(0).scrollHeight > this.innerHeight();
var bAllowedScroll = (overflow == "auto" || overflow == "visible") ||
(overflowAxis == "auto" || overflowAxis == "visible");
var bOverrideScroll = overflow == "scroll" || overflowAxis == "scroll";
return (bShouldScroll && bAllowedScroll) || bOverrideScroll;
};
и inScrollRange
, проверяя, был ли нажатый клик в диапазоне прокрутки.
var scrollSize = 18;
function inScrollRange(event){
var x = event.pageX,
y = event.pageY,
e = $(event.target),
hasY = e.hasScroll(),
hasX = e.hasScroll("x"),
rX = null,
rY = null,
bInX = false,
bInY = false
if(hasY){
rY = new RECT();
rY.top = e.offset().top;
rY.right = e.offset().left + e.width();
rY.bottom = rY.top +e.height();
rY.left = rY.right - scrollSize;
//if(hasX) rY.bottom -= scrollSize;
bInY = inRect(rY, x, y);
}
if(hasX){
rX = new RECT();
rX.bottom = e.offset().top + e.height();
rX.left = e.offset().left;
rX.top = rX.bottom - scrollSize;
rX.right = rX.left + e.width();
//if(hasY) rX.right -= scrollSize;
bInX = inRect(rX, x, y);
}
return bInX || bInY;
}
Являются ли все полосы прокрутки одинаковыми? Например, в Firefox и IE это 18px.
Предполагая, что нет настроенных полос прокрутки, есть ли дополнительные дополнения или размеры в некоторых браузерах?
Все эти функции выполняются по назначению (из того, что я могу различить).
Создание пользовательских событий было немного сложнее, но я получил его для работы. Единственная проблема заключается в том, что если элемент, нажатый, имеет прикрепленное к нему событие mousedown/up, оно также будет запущено.
Я не могу остановить запуск других событий при одновременном запуске, что я называю, события mousedownScroll/mouseupScroll.
$.fn.mousedownScroll = function(fn, data){
if(typeof fn == "undefined" && typeof data == "undefined"){
$(this).trigger("mousedownScroll");
return;
}
$(this).on("mousedownScroll", data, fn);
};
$.fn.mouseupScroll = function(fn, data){
if(typeof fn == "undefined" && typeof data == "undefined"){
$(this).trigger("mouseupScroll");
return;
}
$(this).on("mouseupScroll", data, fn);
};
$(document).on("mousedown", function(e){
if(inScrollRange(e)){
$(e.target).trigger("mousedownScroll");
}
});
$(document).on("mouseup", function(e){
if(inScrollRange(e)){
$(e.target).trigger("mouseupScroll");
}
});
$("selector").mousedown(function(e){
console.log("Clicked content."); //Fired when clicking scroller as well
});
$("selector").mousedownScroll(function(e){
console.log("Clicked scroller.");
});
Как остановить другие события "click" от запуска?
Пока я спрашиваю, пожалуйста, не стесняйтесь оптимизировать код как можно больше.
Здесь JSFiddle, чтобы возиться с.
Причина, по которой я делаю это, - это расширение плагина, который я разрабатываю. Он получил настраиваемое контекстное меню, которое появляется, когда я нажимаю правой кнопкой мыши на один из скроллеров. Я не хочу этого. Поэтому я подумал, что должен сделать событие, которое проверяет наличие прокрутки (mouseup/downs), а затем предотвращает отображение контекстного меню. Для этого, однако, мне нужен щелчок прокрутки, чтобы перейти до обычного щелчка, а также, если это возможно, остановить обычные щелчки при стрельбе.
Я просто вслушиваюсь вслух здесь, но может быть, есть способ получить все функции, привязанные к элементу, а затем переключить порядок, в котором они были добавлены? Я знаю, что функции выполняются в том порядке, в котором они были добавлены (1-й добавлен 1-й вызов), поэтому, если бы я мог использовать этот процесс, возможно, вся "регистрация" события в JQuery могла бы быть вставлена перед событиями щелчка.
1 может использовать только mousedown/mouseup, потому что клик не запускается при нажатии на полосу прокрутки. Если это неверно, укажите рабочий пример/код