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.

plunker

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

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -