Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

this.offset is not a function within a click function

The error is that _this.offset is not a function. I logged this to the console and it was the <li> element I clicked on, so I am confused why this would not work.

$('.item').click(function(e) {
  var _this = this;
  var topx = _this.offset().top;
  var leftx = _this.offset().left;
  var moveArea = $('#replace').offset().top;
  var moveLeft = $('#replace').offset().left;
  var moveUp = topx - moveArea - 50;
  _this.css('position', 'absolute').css('top', moveUp).css('zIndex', 50).css('left', leftx);
  _this.animate({
    top: -50,
    left: moveLeft
  }, 300)
});
#replace {
  height: 50px;
  width: 100px;
  background-color: green;
}

#list {
  height: 200px;
  overflow-y: scroll;
}

.item {
  height: 50px;
  width: 100px;
  background-color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.2/jquery.min.js"></script>
<div id="replace">
  Replace this
</div>

<ul id="list">
  <li class="item">TEST</li>
  <li class="item">TEST</li>
  <li class="item">TEST</li>
</ul>

I also want to create an animation such that the item I click in the list moves up to replace the green "Replace this" box, if someone could help with that too.

I created a jsfiddle to show the error: https://jsfiddle.net/v5fjjwmj/2/

like image 732
Shawn123 Avatar asked Apr 19 '16 15:04

Shawn123


People also ask

What is offset function in jQuery?

jQuery offset() Method The offset() method set or returns the offset coordinates for the selected elements, relative to the document. When used to return the offset: This method returns the offset coordinates of the FIRST matched element. It returns an object with 2 properties; the top and left positions in pixels.

What is offset () Top?

The offsetTop property returns the top position (in pixels) relative to the parent. The returned value includes: the top position, and margin of the element.

What is offset in angular?

Typically, the position error of an eye-tracking device is measured as the distance of the eye-position from the target position in two-dimensional space (angular offset).


2 Answers

this (and hence _this) inside your event handler refers to a DOMElement which doesn't have the offset() method as that's part of jQuery. To fix this you can create a jQuery object using $(this):

$('.item').click(function(e) {
    var $this = $(this);
    var topx = $this.offset().top;
    var leftx = $this.offset().left;
    var moveArea = $('#replace').offset().top;
    var moveLeft = $('#replace').offset().left;
    var moveUp = topx - moveArea - 50;

    $this.css({
        'position': 'absolute',
        'top': moveUp,
        'zIndex': 50,
        'left': leftx
    }).animate({
        top: -50,
        left: moveLeft
    }, 300)
});

Also note the use of the object provided to a single css() call over multiple calls to the same method.

like image 84
Rory McCrossan Avatar answered Nov 15 '22 18:11

Rory McCrossan


Replace these two lines:

var topx = _this.offset().top;
var leftx = _this.offset().left;

with:

var topx = _this.offsetTop;
var leftx = _this.offsetLeft;

As .offset() is a jquery function and _this is a DOM element.


Also for your .css line you have to wrap _this in $(...) again because _this is a DOM element and **not a jQuery object.

like image 21
Tuvia Avatar answered Nov 15 '22 17:11

Tuvia