具有父依赖参数的Onclick函数

时间:2014-07-16 22:34:59

标签: javascript onclick wrapper

我有这个对象:

Tr.Competence = function()  {
    var thisCount = //variableNumber;
    this.name = "comp" + thisCount;
    var newRow = parentTable.insertRow(-1);
    var cell1 = newRow.insertCell(0);

    var element1 = document.createElement('input');
    element1.type = "button";
    element1.value = "+";
    element1.onclick = function() {
        makeSpecialisation(thisCount, this.name)
    };

    cell1.appendChild(element1);
}

和这个功能:

function makeSpecialisation(parentCount, parentEl)  {
    window[parentEl + "SpecialisationCount"]++;
    var specialisationName = parentEl + "Spe" + window[parentEl + "SpecialisationCount"] ;
    //testing variables with an alert
    alert(
       "parentCount=" + parentCount +
       " & parentEl=" + parentEl + 
       " & specialisationName=" + specialisationName + 
       " comXSpecialisationCount=" + window[parentEl + "SpecialisationCount"]
    );
}

如果element1.onclick直接调用makeSpecialisation(thisCount,this.nom)(没有匿名函数),那么变量是正常的,但是在评估之后我不能使用它(在每个新的Tr.Competence实例调用上) 。 =>请参阅:http://jsfiddle.net/hq8U3/2/

如果element1.onclick使用匿名函数包装器调用makeSpe [...],我可以随时调用它,但变量是NaN或未定义(或JSFiddle上的空白)。 =>请参阅:http://jsfiddle.net/hq8U3/3/

我能做些什么才能使我的变量运作良好&我可以在onClick事件中调用它们吗?

1 个答案:

答案 0 :(得分:0)

第一:

由于你有一个annon函数可以改变this的范围,所以代替:

element1.onclick = function() {
    makeSpecialisation(thisCount, this.name)
};

你需要这样做:

var self = this;
element1.onclick = function() {
    makeSpecialisation(thisCount, self.name);
};

第二:再次因为它是annon函数你需要包装它并调用它来调用你的其他函数,所以上面就变成了这个:

var self = this;
element1.onclick = (function() {
   makeSpecialisation(thisCount, self.name);
})();
第三:我认为你真的想要这样做:

element1.setAttribute('onclick', makeSpecialisation(thisCount, this.name));

在这种情况下,上述两件事很难知道,但无关紧要。

最后作为事后的想法,您应该使用console.log()进行调试而不是alert()。如果您忘记了调试,console.log()将不会惹恼您的用户或破坏您的计划,例如alert()

jsfiddle here