没有'this'的jQuery onclick

时间:2017-08-10 19:37:38

标签: javascript jquery html object

// Block class
function Block(id) {
    this.element = $('<td>');
    $(this.element).click( function() {
        console.log(this);
    });
}

控制台日志输出单击的HTML元素,这不是我想要的。我想访问与此元素关联的Block对象。这怎么可能?

4 个答案:

答案 0 :(得分:2)

您还可以使用在ES6中新定义的箭头功能。

  

&#34;箭头函数表达式的语法短于函数   表达式并不绑定它自己的this,arguments,super或   new.target。箭头功能始终是匿名的。这些功能   表达式最适合非方法函数,但它们不能   用作构造函数。&#34;

function Block(id) {
    this.element = $('<td>');
    $(this.element).click( () => {
        console.log(this); // now this will be what it was outside of the anonymous function passed into .click
    });
}

请注意,并非所有浏览器都实现了此功能。我相信它适用于Chrome,但不适用于IE(当然)。因此,如果您想使用此功能,我还建议您使用javascript转换器(我建议使用Babel),它会将您的javascript转换为与特定浏览器版本兼容。所以在上面的函数上使用babel后,javascript看起来就像这样

function Block(id) {
    var objectReference = this;
    this.element = $('<td>');
    $(this.element).click( function() {
        console.log(objectReference); 
    });
}

你当然可以像上面那样编写你的函数而不需要使用Babel。如果您想确保浏览器兼容性或计划使用更多ES6功能,Babel真的是值得的。

答案 1 :(得分:1)

发布的替代解决方案是使用bind

$('#sl').on('mouseup', function(){
    canvas=document.getElementById("a");
    ctx=canvas.getContext("2d");
    dataURL = canvas.toDataURL();
    $('.s').find('img').attr('src', dataURL);
    $('#a').hide();
});    

这种方法很好,因为它不需要额外的上下文保存变量。

答案 2 :(得分:0)

您传递给.click()方法的函数存在于元素的上下文中,因此该上下文中的this引用该元素。通过将外部上下文保存在变量中,您可以在新上下文中访问它:

// Block class
function Block(id) {
    var self = this;  // here, this refers to Block()
    this.element = $('<td>');
    $(this.element).click( function() {
        console.log(this); // here this refers to element
        console.log(self); // here self refers to Block()
    });
}

答案 3 :(得分:0)

您可以在点击处理程序之外的变量中捕获this的值:

function Block(id) {
    var self = this; //capture "this" in outside context

    this.element = $('<td>');
    $(this.element).click(function() {
        console.log(self);
    });
}