Ich versuche benutzerdefinierte Ereignisse in JQuery zu erstellen, die erkennen sollen, wenn auf eine Bildlaufleiste geklickt wird .
Ich weiß, dass es viele Texte gibt, aber alle meine Fragen sind fettgedruckt und es gibt eine JSFiddle example, an der Sie sofort arbeiten können.Ermitteln, ob Benutzer auf Bildlaufleiste oder Inhalt klicken (Onclick für native Bildlaufleiste)
Weil ich nicht in der Funktionalität für diese gebaut gefunden,
Ich hatte eine hasScroll
Funktion zu erstellen, zu überprüfen, ob das Element eine Scrollbar hat,
$.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;
};
und eine inScrollRange
Funktion, zu überprüfen, ob die Klicken durchgeführt wurde innerhalb der Scroll-Bereich.
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;
}
Sind alle Scrollbar einheitliche Größen? ZB in Firefox und IE ist es 18px.
Angenommen, es gibt keine benutzerdefinierten Bildlaufleisten, gibt es in einigen Browsern zusätzliche Abstände oder Größen?
Diese Funktionen funktionieren alle (was ich erkennen kann).
Die Erstellung von benutzerdefinierten Ereignissen war ein bisschen schwieriger, aber ich habe es etwas funktionieren. Das einzige Problem ist, dass wenn das angeklickte Element ein mousedown/up-Ereignis hat, das ebenfalls ausgelöst wird.
Ich kann nicht scheinen zu stoppen die anderen Ereignisse auslösen, während gleichzeitig auszulösen, was ich anrufe, die mousedownScroll/mouseupScroll Ereignisse.
$.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.");
});
Wie kann ich die anderen „klicken Sie auf“ Ereignisse stoppen auslöst?
Während ich frage, bitte zögern Sie nicht, den Code so viel wie möglich zu optimieren.
Here's a JSFiddle to mess around with.
Der Grund, warum ich mache das, weil eines größeren Plugin Ich entwickle. Es hat ein benutzerdefiniertes Kontextmenü, das angezeigt wird, wenn ich mit der rechten Maustaste auf einen der Scroller klicke. Ich will das nicht. Also dachte ich mir, ich sollte ein Event machen, das nach Scroll-Klicks (Mouse Up/Downs) sucht und dann verhindert, dass das Kontextmenü angezeigt wird. Um das zu erreichen, muss der Scroll-Klick vor dem normalen Klick stehen und, wenn möglich, die normalen Klicks vom Feuern stoppen.
Ich denke nur laut hier, aber vielleicht ist es eine Möglichkeit, alle Funktionen zu erhalten, die an das Element gebunden sind, und schalten Sie dann die Reihenfolge, in der sie hinzugefügt wurden? Ich weiß, dass Funktionen in der Reihenfolge ausgeführt werden, in der sie hinzugefügt wurden (1. hinzugefügt 1. aufgerufen), also könnte, wenn ich diesen Prozess anzapfen könnte, vielleicht die ganze "Registrierung" des Ereignisses zu JQuery einfach vor den Klickereignissen eingefügt werden.
nur/mouseup verwenden mousedown- können, weil Sie auf eine Scrollbar nicht ausgelöst werden, wenn klicken. Wenn dies falsch ist, geben Sie bitte ein funktionierendes Beispiel/Code
Bildlaufleistengrößen sind nicht einheitlich. In Webkit können Sie sie ziemlich stark anpassen. http://css-tricks.com/examples/WebKitScrollbars/ – mrtsherman
Was ist dein Ziel mit diesem Plugin? – mrtsherman
@mrtsherman Dies ist nur ein kleiner Teil eines größeren Plugins, aber die Idee besteht darin, ein Element in einer Liste abzuwählen, wenn der Benutzer die Maus irgendwo im Inhalt bewegt, aber nicht, wenn der Benutzer auf den Scroller klickt. Das Listenelement enthält bereits eine Menge von Klickereignissen, aber ich möchte nicht, dass sie ausgelöst werden, wenn auf den Mauszeiger geklickt wird. – ShadowScripter