Was ist die beste Cross-Browser-Methode zum Erkennen der ScrollTop des Browser-Fensters? Ich bevorzuge es, keine vorgefertigten Codebibliotheken zu verwenden, da dies ein sehr einfaches Skript ist und ich nicht all diese Nachteile brauche.Cross-Browser-Methode zum Erkennen der ScrollTop des Browser-Fensters
Antwort
function getScrollTop(){
if(typeof pageYOffset!= 'undefined'){
//most browsers except IE before #9
return pageYOffset;
}
else{
var B= document.body; //IE 'quirks'
var D= document.documentElement; //IE with doctype
D= (D.clientHeight)? D: B;
return D.scrollTop;
}
}
alert(getScrollTop())
Sie alle Mühe verwenden, um ein Framework wie jQuery oder Mootools zu speichern , die alle diese Werte in einer Zeile (Cross-Browser) in Mootools seine $ ('Element') GetTop() berechnet. in jquery benötigen Sie ein Plugin namens Dimensionen, wenn ich mich richtig erinnere obwohl die meiste Zeit auch ohne ein Framework können Sie tatsächlich verwenden element.getScrollTop(); um zu bekommen, was Sie brauchen das einzige Problem ist auf IE7 und unter dieser Berechnung ist etwas fehlerhaft, wie es nicht den Positionswert des Elements berücksichtigt zum Beispiel, wenn Sie eine Position: absolute CSS-Attribut für dieses Element Die Berechnung wird für das übergeordnete Element dieses Elements ausgeführt
FYI - Die Frage lautet "Ich bevorzuge es, keine vorgefertigten Code-Bibliotheken zu verwenden". Du wurdest markiert, da mooTools immer noch eine vordefinierte Codebibliothek ist. Vielen Dank, dass Sie sich die Zeit genommen haben, um etwas beizutragen, bitte lesen Sie die Frage ein wenig gründlicher oder Ihr Rep wird einen Treffer machen. – iancrowther
Auch ein weiteres Problem mit diesem Ansatz, wenn Sie versuchen, es für das Hauptfenster Scrollbar, Nicht-IE-Browser zu erkennen Scrollen wird das Element
und IE scrollt . Also müssen Sie herausfinden, was "Element" zuerst ist. –Wenn Sie keine vollständige JavaScript-Bibliothek einschließen möchten, können Sie häufig die gewünschten Bits aus einem extrahieren.
Zum Beispiel ist dies im Wesentlichen wie jQuery implements ein Cross-Browser blättern (Top | links):
function getScroll(method, element) {
// The passed in `method` value should be 'Top' or 'Left'
method = 'scroll' + method;
return (element == window || element == document) ? (
self[(method == 'scrollTop') ? 'pageYOffset' : 'pageXOffset'] ||
(browserSupportsBoxModel && document.documentElement[method]) ||
document.body[method]
) : element[method];
}
getScroll('Top', element);
getScroll('Left', element);
Hinweis: Sie werden bemerken, dass der obige Code enthält eine browserSupportsBoxModel
Variable, die nicht definiert ist. jQuery defines this indem Sie vorübergehend ein div zu der Seite hinzufügen und dann einige Attribute messen, um festzustellen, ob der Browser das Box-Modell korrekt implementiert. Wie Sie sich vorstellen können, sucht dieses Flag nach IE. Insbesondere wird nach IE 6 or 7 in quirks mode gesucht. Da die Erkennung ziemlich komplex ist, habe ich es als Übung für Sie gelassen; vorausgesetzt, Sie haben bereits browserfeaturedetection an anderer Stelle in Ihrem Code verwendet.
Edit: Wenn Sie nicht bereits erraten haben, empfehle ich Ihnen dringend eine Bibliothek für diese Art von Dingen zu verwenden. Der Overhead ist ein geringer Preis für robusten und zukunftssicheren Code und jeder wäre mit einem browserübergreifenden Framework viel produktiver. (Im Gegensatz zu unzähligen Stunden mit dem Kopf gegen IE).
YUI 2.8.1 Code tut dies:
function getDocumentScrollTop(doc)
{
doc = doc || document;
//doc.body.scrollTop is IE quirkmode only
return Math.max(doc.documentElement.scrollTop, doc.body.scrollTop);
}
Ich denke jQuery 1.4.2 Code (etwas für die Menschen übersetzt) und unter der Annahme ich verstand es richtig dies tut:
Unfortunatley den Wert von jQuery.support.boxModel
extrahieren ist fast unmöglich, weil Sie müssten Fügen Sie ein temporäres untergeordnetes Element in das Dokument ein und führen Sie die gleichen Tests durch, die jQuery durchführt.
function getSize(method) {
return document.documentElement[method] || document.body[method];
}
getSize("scrollTop");
Gut getestet in Chrome/Safari/Firefox und IE 9, danke! – mkoistinen
Oder nur einfach wie:
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
Funktioniert nicht auf iPad und möglicherweise anderen Geräten/Browsern (Chrome?), Benötigen Sie 'window.pageYOffset' dort. – Yeti
Dies ist kein Cross-Browser. – Progo
Funktioniert für mich in * Handy * Safari 5 und 7, FireFox 31, Chrome 37, Opera 24, IE 5-11. Laut http://www.quirksmode.org/dom/w3c_cssom.html#t35 ist das * so * cross-browser. Also vielen Dank! Kurz und gut. – flu
ich seine schon eine Weile kennen, da dieser Thread wurde aktualisiert, aber dies ist eine Funktion habe ich, dass die Entwickler das Stammelement zu finden, die tatsächlich Hosts hat eine funktionierende Eigenschaft "scrollTop". Getestet auf Chrome 42 und Firefox 37 für Mac OS X (10.9.5):
function getScrollRoot(){
var html = document.documentElement, body = document.body,
cacheTop = ((typeof window.pageYOffset !== "undefined") ? window.pageYOffset : null) || body.scrollTop || html.scrollTop, // cache the window's current scroll position
root;
html.scrollTop = body.scrollTop = cacheTop + (cacheTop > 0) ? -1 : 1;
// find root by checking which scrollTop has a value larger than the cache.
root = (html.scrollTop !== cacheTop) ? html : body;
root.scrollTop = cacheTop; // restore the window's scroll position to cached value
return root; // return the scrolling root element
}
// USAGE: when page is ready: create a global variable that calls this function.
var scrollRoot = getScrollRoot();
scrollRoot.scrollTop = 10; // set the scroll position to 10 pixels from the top
scrollRoot.scrollTop = 0; // set the scroll position to the top of the window
Ich hoffe, Sie finden dies nützlich! Prost.
Ich habe window.scrollY || document.documentElement.scrollTop
verwendet.
window.scrollY
umfasst alle Browser außer IEs.
document.documentElement.scrollTop
deckt IE ab.
Der erste Ausdruck kann auch 'window.pageYOffset' sein. Ich erwähne das, weil 'pageYOffset' historischer zu sein scheint und ich' scrollY' nicht so oft sehe. Laut MDN sind sie gleich. In jedem Fall ist dies bei weitem die sauberste und direkteste Lösung und sollte bevorzugt werden, da sie sich zuerst an moderne Browser wendet und sie somit nicht dafür bestraft, dass sie aktuell sind. – Manngo
@Jason: Ich wollte hinzufügen, dass ich über Ihre Antwort auf die Frage gesprochen habe, die die sauberste und direkteste ist, eher als mein eigener Kommentar oben. – Manngo
Dies funktioniert gut von IE5 zu IE11. Es unterstützt auch alle wichtigen neuen Browser.
var scrollTop = (document.documentElement && document.documentElement.scrollTop) ||
(document.body.scrollTop) || (document.scrollingElement);
- 1. jquery - Erkennen, ob der untere Teil des div den unteren Rand des Browserfensters berührt?
- 2. Position des Browserfensters in JavaScript bestimmen?
- 3. benutzerdefinierter Cursor außerhalb des Browserfensters
- 4. Programmgesteuertes Ändern der Größe des Browserfensters in GWT
- 5. Kann ich die Bewegung eines Browserfensters in JavaScript von einem Bildschirm zum anderen erkennen?
- 6. Standard ändert Capybara Größe des Browserfensters
- 7. HTML divs können außerhalb des Browserfensters gehen?
- 8. ein div machen basierend auf der Größe des Browserfensters
- 9. Erzwingen der Web-API zum Erkennen des Querystring-Parameters
- 10. jQuery scrollTop geht zum falschen Anker
- 11. Größe des Browserfensters während des Debuggens in Visual Studio
- 12. getBoundingClientRect zum Erkennen der Sichtbarkeit
- 13. ScrollTop() während des Scrollens auf iPad/iPhone
- 14. jQuery: Das Hinzufügen der scrollTop zusätzlichen Pixel
- 15. Cronjob zum Erkennen der zuletzt geänderten Dateien
- 16. Randhintergründe, die unabhängig von der Größe des Browserfensters visuell mit dem Hintergrund des Inhalts verbunden sind
- 17. So erstellen Sie eine Nav-Leiste mit Größenanpassung des Browserfensters
- 18. Shiny App ist nur die Hälfte des Browserfensters
- 19. $ (window) .scrollTop() returnig 0
- 20. scrollTop() anders in Firefox vs Chrom
- 21. Problem beim Erkennen der Ausrichtung des Telefons
- 22. Erkennen der Änderung des Knockout View-Modells
- 23. Warum funktioniert mein Code zum Erkennen des CTRL-Schlüsselstatus nicht?
- 24. Ton des Audiosignals erkennen
- 25. Algorithmus zum Erkennen des Vorhandenseins von Text auf Bild
- 26. jQuery scrollTop() für Navigation
- 27. Algorithmus zum Erkennen von Mausbewegungen
- 28. Erkennen des Endes der Videowiedergabe auf der Webseite
- 29. Wie graues Ausblenden des vollständigen Browserfensters und Anzeigen eines Formulars in der Mitte?
- 30. JQuery .animate scrollTop nicht animieren, nur zum gewünschten Speicherort springen
Diese Methode scheint nicht mit Firefox-Browsern unter Mac oder Linux zu funktionieren. – hypervisor666
hässlicher Alarm! Benutze stattdessen console und console.log! , wie auch immer, gute Antwort, aber was ist die Browser-Unterstützung der "// most browsers" - oder besser IEwhatnumber + unterstützt das? –
ist diese kurze Version korrekt genug? 'var scrollTop = pageYOffset || (document.documentElement.clientHeight? document.documentElement.scrollTop: document.body.scrollTop); ' – Roman