警告this.id关键字返回未定义的Javascript

时间:2013-10-10 15:56:49

标签: javascript jquery html5 dynamic inputbox

我动态地创建了几次相同的输入框。当用户按下enter键时,它会调用一个函数。然后我用这段代码测试:

function insertComment(){
  alert($(this).attr('id'));
}

但它一直未定义返回。这是我用来创建类似输入框的语法:

$("#divToAppend").append("<input id='testID' type = 'text' class = 'formatCSS' style = 'margin-top:12px ; ' placeholder = 'Add Comment' onkeydown='if (event.keyCode == 13) insertComment()'></input>");

4 个答案:

答案 0 :(得分:7)

在调用方法时传递此信息:

$("#divToAppend").append("<input id='testID' type = 'text' class = 'formatCSS' style = 'margin-top:12px ; ' placeholder = 'Add Comment' onkeydown='if (event.keyCode == 13) insertComment(this)'></input>");


function insertComment(this)
{ 
alert($(this).attr('id')); 
}

答案 1 :(得分:1)

谨防this。这是一个疯狂的变量,你总是想在你的代码中添加它之前要三思而后行。

在我们调试之前,第一课是 -

  • 每个函数总是在上下文中调用,如果你不能告诉上下文,那就是window对象。

现在让我们分析一下这里发生了什么。

当用户按下输入字段上的某个键时,会调用insertComment。由于没有上下文,因此在窗口上下文中调用它。现在,在函数内部,this实际上指向window,并且没有定义window.attr('id')

相当于调用window.insertComment this == window

如果您修改代码 -

onkeydown='if (event.keyCode == 13) insertComment(this)'

function insertComment(x){
    alert(x.attributes.id);
}

此处,上下文仍为window,即this变量仍指向window对象,但input元素本身将作为参数传递给insertComment函数。

x将引用该元素,您现在可以用老式的javascript方式提取id属性 - x.attributes.id

(或以jQuery方式,如果您愿意 - $(x).attr('id')

答案 2 :(得分:1)

检查一下:

<强> HTML:

<div id="divToAppend">
  <input class="formatCSS" type="text" id="id_1">  

</div>

js&amp; jquery的

// For alert the ID
 function insertComment(id){
   alert(id);
}

$(document).ready(function(){
// Look for any event 'keydown' in any element which has a class 'formatCSS'
$(document).on('keydown','.formatCSS',function(e){

    // If enter is pressed
    if (e.keyCode == 13){

        //Get the current ID
       var text_id=$(this).attr('id');

        //Split it to get the counter. The ID must be unique
       var id=text_id.split('_');

        //Add 1 to the counter
       var counter=parseInt(id[1])+1;

        // Build the new ID
       var new_text_id="id_"+counter;         

        // Then, create the new input with the iD           
       $("#divToAppend").append("<input id='"+new_text_id+"' type = 'text' class = 'formatCSS' />"); 

        // Last, alert the ID
        insertComment(new_text_id);


    }

});


});

也许它可以提供帮助。 :)

看到它正常工作:http://jsfiddle.net/pN8P6/

答案 3 :(得分:0)

您需要将值存储在ID中吗? (似乎你的部分问题可能是你有多个相同的ID,这是非法的。)

怎么样:

$("#divToAppend")
  .append("<input type = 'text' class = 'formatCSS' style = 'margin-top:12px ; ' placeholder = 'Add Comment'></input>")
  .keydown(function() { insertComment('whatever') });