组合绑定事件而不丢失上下文

时间:2015-07-22 18:32:23

标签: javascript jquery html

我在表行上有两个事件绑定,一个用于#! /usr/bin/env node var start = Date.now(); var assemble = require('assemble'); var extname = require('gulp-extname'); assemble.task('assets', function () { console.log(Date.now() - start); assemble.data('assets/templates/data/*.json'); assemble.layouts('assets/templates/layouts/*.hbs'); assemble.partials('assets/templates/partials/*.hbs'); return assemble.src('assets/templates/*.hbs', { layout: 'default' }) .pipe(extname()) .pipe(assemble.dest('build/')); }); assemble.task('watch', ['assets'], function () { assemble.watch('./assets/**/*.*', ['assets]'); }); // Enable --watch command line if (process.argv.pop() === '--watch') { assemble.run(['watch']); } else { assemble.run(['assets']); } ,因此我可以在更改之前获取文本输入的值。然后我将.change事件绑定到那个,所以我可以处理它,同时仍然具有前一个值。

但是,在.change函数中,“this”现在是正在更改的输入表,而不再是输入元素本身。我在这做错了什么?

focus

3 个答案:

答案 0 :(得分:1)

$(".RowClassName").on("focus", ".columnClassName td:first-child input", ...)

^此调用解析为.RowClassName元素,而不是您在事件委派过滤器中使用的input元素。

尝试这样的事情:

var filter = ".columnClassName td:first-child input";

$(".RowClassName").on("focus", filter, function() {
    previousName = this.value;
}).on("change", filter, function() {
    $(this).width($(this).val().length * 9);
    UpdateList(previousName, this.value);
});

答案 1 :(得分:1)

为什么this引用该表已在其他答案中解释过。

为避免重复选择器,您可以存储在变量或pass an object事件处理程序中:

(function() {
    var previousName;
    $(".RowClassName").on(
      {
         focus: function() { 
           previousName = this.value;
         },
         change: function() {
           $(this).width($(this).val().length * 9);
           UpdateList(previousName, this.value);
         }
      },
      '.columnClassName td:first-child input'
    );
}());

答案 2 :(得分:0)

您将change事件绑定到行,而不是输入;你应该尝试这样的事情:

var previousName = '';
$(".RowClassName").on("focus", ".columnClassName td:first-child input",    
   function() {
       previousName = this.value;
 })

$(".RowClassName").on("change", ".columnClassName td:first-child input",
   function() {
       $(this).width($(this).val().length * 9);
       UpdateList(previousName, this.value);
});