草庐IT

关于javascript:尝试通过传入函数来绑定回调会抛出错误

codeneng 2023-03-28 原文

Trying to bind a callback by passing in the function throws an error

我只想在输入使用 jQuery 1.7.2 和 Backbone.js 更改值时触发一个事件。

目前我有以下(有效)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MyView: Backbone.View.extend({
  initialize: function() {

    this.colorInput = $("<input />", {
        "id":"color",
        "name":"color",
        "value": this.model.get("color")
    });

    var self = this;
    this.colorInput.on("change", function() {
      self.changeColor();
    });

  },
  changeColor: function() {
    var color = this.colorInput.val();
    this.model.set("color", color);
  }
});

我试图用另一种方式来做,我只是传入我的函数。

1
this.colorInput.on("change", this.changeColor, this);

但是当试图这样做时,它会抛出错误

((jQuery.event.special[handleObj.origType] || {}).handle ||
handleObj.handler).apply is not a function
.apply( matched.elem, args );

(第 3332 行)

我无法弄清楚。任何想法为什么这种方式不起作用?


你混淆了 jQuery 的 on:

.on( events [, selector] [, data], handler(eventObject) )
.on( events-map [, selector] [, data] )

与 Backbone 的 on:

object.on(event, callback, [context])

Backbone 将上下文作为第三个参数,而 jQuery 没有。看起来 jQuery 的 on 正在将您的第三个参数解释为 handler(eventObject) 并尝试像函数一样调用它,这将解释您看到的错误消息。

通常你会这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
MyView: Backbone.View.extend({
  events: {
    'change input': 'changeColor'
  },
  initialize: function() {
    this.colorInput = $("<input />", {
      "id":"color",
      "name":"color",
      "value": this.model.get("color")
    });
  },
  render: function() {
    this.$el.append(this.colorInput);
    return this;
  },
  changeColor: function() {
    var color = this.colorInput.val();
    this.model.set("color", color);
  }
});

让 Backbone 的事件委托系统来处理。

  • 1,是的,这里的意见相同。我也有一个工作示例的问题,onlive 创建的 DOM 元素没有触发 change 事件,我放弃了,因为这不是与问题相关的问题。
  • @fguillen:我取消了一半的编辑,我认为 .on 正在对其第一个参数进行 isPlainObject 检查以选择它使用的形式,第一个参数不是事件映射,所以它与第一个参数一起使用.on 的形式,我们回来尝试像函数一样调用视图对象。你是否有"直到焦点改变才会触发改变"的问题?
  • @muistooshort,这是完美的。感谢您的解释和代码示例。这种方式要好得多,而且效果很好。我必须将事件选择更改为 change #color 才能使其正常工作,但除此之外它很棒。再次感谢。
  • @fguillen:我把事件规范倒过来了,'input change' 应该是(现在是)'change input':jsfiddle.net/ambiguous/xD7Xm
  • @Brandon:我的事件规范倒退了(呃!),请参阅我对 fguillen 的最后评论。
  • @muistooshort 你看,我知道我错过了一些东西,只是参数的数量......很容易:P
  • @muistooshort 关于您是否遇到"直到焦点更改才触发更改"问题?我不知道这个问题,但很有可能。在我的实验中,我通过代码修改 colorInput.val() 并且没有触发事件,如下所示:jsfiddle.net/fguillen/qZ8aN
  • @fguillen:在值发生变化并且焦点发生变化(或多或少)之前不会触发事件:stackoverflow.com/a/7055771/479863
  • @muistooshort 这个 HTML 规范是在实现 JS 之前完成的 :)... 我明白了,如果我们看书,行为是正确的,但我仍然打开了一个 jQuery 错误只是为了对此产生噪音。
  • 尽管您的评论没有直接适用,但您确实帮助了我,让我知道正在发生的事情,所以 1 给您。我试图在窗口滚动处理程序中调用 lodash 的 debounce(),但我有一个错字并将 debounce() 的参数传递给 on() 的参数。


这是为遇到此问题的 Google 员工准备的。我遇到了完全相同的问题,发生的事情是报告错误的位置和实际发生错误的位置在两个不同的地方。

一行代码已经过时,看起来像

1
2
3
$('#modal').on('click', function(e) {
   // Execute invalid code here.
});

另一行代码类似:

1
2
3
$('#modal').on('click', function(e) {
   // Execute valid code here.
});

错误是第一次调用不是一个真正的函数,所以错误是准确的,第二个被调用的处理程序不是一个真正的函数,jQuery无法完成它,但它总是表现得好像它发生在第二个函数调用。

我会说,如果您遇到此错误,请删除任何可能触发的额外事件处理程序,看看是否可以解决问题。

有关关于javascript:尝试通过传入函数来绑定回调会抛出错误的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  7. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  8. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐