我无法在对象构造函数中创建事件监听器

时间:2019-06-09 14:27:41

标签: javascript jquery javascript-objects

当我滚动div时,基本上什么也没发生。对象初始化时,方法slideIt就被触发一次。它不在听滚动事件!有什么原因会发生这种情况?

function fixed_column_or_row(container_name){
    this.container_div=$(container_name);

    this.scrollable_div=this.container_div.find(".simplebar-content-wrapper");
    this.fixed_row=this.container_div.find(".fixed-row")
    this.fixed_column=this.container_div.find(".fixed-column")

    //the issue in this line
    this.scrollable_div.scroll(this.slideIt())

}

fixed_column_or_row.prototype.slideIt=function(){
     var scrollTop      = this.scrollable_div.scrollTop(),
     scrollLeft      = this.scrollable_div.scrollLeft();
     console.log("scrollTop")
     this.fixed_row.css({
         "margin-left": -scrollLeft
     });

     this.fixed_column.css({
         "margin-top": -scrollTop
      }); 

}

1 个答案:

答案 0 :(得分:0)

一个常见的JavaScript错误是,当需要的是对函数的引用时(通常用于设置事件处理程序,但是还有其他类似情况),键入函数 call

因此

  this.scrollable_div.scroll(this.slideIt());

调用 this.slideIt()函数并将返回值传递给.scroll方法,这显然不是所希望的。 ()之后的this.slideIt是造成这种情况的原因,因此this.slideIt ()是必要的。

现在,完成此操作后,下一个问题将是与this的关系将会丢失。 There are various questions on Stackoverflow with long, thorough answers about how this works.在这里要说的是,必须确保正确设置this

  this.scrollable_div.scroll(this.slideIt.bind(this));

(还有其他方法可以这样做,但是应该可以。)