javascript - $window .on("scroll") working only in last directive it's called on -
i'm trying create simple directive sets or removes classes when scrolling near element. i'm using callback scroll event on $window, problem it's working last directive only.
html
<html ng-app="myapp"> <head> <link rel="stylesheet" href="style.css"> <script src="//code.jquery.com/jquery-1.12.0.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script> <script src="script.js"></script> </head> <body> <div class="box hidden" on-scroll-class="{add: 'large', remove: 'hidden'}"></div> <div class="box hidden" on-scroll-class="{add: 'large', remove: 'hidden'}"></div> <div class="box hidden" on-scroll-class="{add: 'large', remove: 'hidden'}"></div> </body> </html> js
var app = angular.module("myapp", []); app.directive("onscrollclass", ["$window", function ($window) { return { restrict: "a", scope: { onscrollclass: "@", onscrollclassreverse: "@", onscrolloffset: "@" }, link: function(scope, element, attrs) { var reverse = angular.isdefined(scope.onscrollclassreverse) ? scope.onscrollclassreverse : false; var offset = angular.isdefined(scope.onscrolloffset) ? scope.onscrolloffset : 150; var classtoaddobj = scope.$eval(scope.onscrollclass); var classtoadd; var classtoremove = null; if (angular.isobject(classtoaddobj)) { classtoadd = classtoaddobj.add; classtoremove = classtoaddobj.remove; } else { classtoadd = classtoaddobj; } $element = $(element); $($window).on("scroll", function() { console.log($element); console.log($element.offset().top); if (this.pageyoffset >= $element.offset().top - offset) { $element.addclass(classtoadd); $element.removeclass(classtoremove); } else if (reverse) { $element.addclass(classtoremove); $element.removeclass(classtoadd); } }); } } }]); css
body { height: 2000px; } .hidden { opacity: .3; } .large { transform: scale(1.2); } .box { background-color: tomato; width: 200px; height: 200px; margin: 50px auto; transition: .5s ease; }
it has nothing angular.
you setting variable $element without declaring variable. due javascript prototypal inheritance, try find variable in prototype chain. , in case won't find it, treat global variable.
thats why last directive works you, it's overriding $element variable each time.
just add var before $element, , remember declare variable using var keyword (or let (es 2015) better).
Comments
Post a Comment