Javascript / jQuery事件处理程序使用关键字this在对象内部作用域

时间:2016-01-03 23:00:21

标签: javascript jquery scope event-handling this

我几天都在努力解决这个问题。我已经阅读了很多关于SO的问题,并且通过Google搜索了许多不同的方式并阅读/尝试了我发现的所有内容。到目前为止我找到的任何东西都没有为我工作,我已经重写了我的代码一百万次似乎尝试了不同的方法来做到这一点。

我觉得我在这里缺少一些非常明显的东西,也许只需要朝着正确的方向努力。如果我认为这完全错误并需要重组一切,我也可以这样做。

基本上我正在使用的是前端"控制器"缺少一个更好的单词,初始化一些变量,设置一些事件监听器并响应用户操作。

我不在乎我是否使用jQuery或纯JavaScript,我只是想让它工作,即使我必须重写整个事情。我的目标是在高负荷下的速度和性能。我正在考虑的另一个选项是node.js,但我的经验有限,所以希望用jQuery来解决它。

当页面加载时,我没有收到错误,但当我单击其中一个已设置事件监听器的项目时,我收到错误... import urllib2 from bs4 import BeautifulSoup r2 = urllib2.urlopen("http://www.ign.com/articles/2016/01/03/steam-surpasses-12-million-concurrent-users").read() soup2 = BeautifulSoup(r2) letters = soup2.find_all("div",class_="fyre-comment-count") print letters 它指的是相应的以TypeError: Cannot Read Property 'apply' of undefined.

开头的行

该行的目的是让var scope = this ? function(e)...关键字引用控制器对象,以便我可以在事件处理程序方法中调用对象方法。虽然看起来它可能不像我想的那样工作。

我尝试使用this来设置点击和更改处理程序,但我也遇到了范围问题。再次,任何帮助都非常感谢。

.on

1 个答案:

答案 0 :(得分:1)

你正在失去对此的引用。

您可以使用以下代码解决此问题:

var scope = this ? function(e) { this.handleEvent.apply(this, ["click"]); }.bind(this) : this.handleEvent;

但如果您希望处理程序可以访问其范围内的元素并引用this,那么您应该写下:

var scope = this ? function(e) { this.handleEvent.apply(ele, ["click"]); }.bind(this) : this.handleEvent;

或者

var that = this;

var scope = this ? function(e) { that.handleEvent.apply(ele, ["click"]); } : this.handleEvent;

我看到了其他错误。因为如果thisundefined,则scope将为this.handleEvent,但这会引发错误,因为undefined无法{ {1}}属性。