2011-07-09 51 views
3

我有一個輸入元素列表。我想綁定一個keyup事件處理程序給他們,以便每當用戶點擊輸入時,他會轉到下一個字段。但是如果輸入是最後一個輸入,那麼我想要觸發按鈕的單擊事件,以便用戶進入另一個級別。我的代碼是這樣的:使用is(':last')來檢查最後一個元素

$('.loginBody input:visible').keyup(function (e) { 
    if (e.keyCode == 13) { 
     if ($(this).is(':last')) { 
      $('#next').click(); 
     } 
     else { 
      $(this).closest('input').focus(); 
     } 
    } 
}); 

但是,似乎is(':last')不起作用。怎麼了?

+0

'$(本)'內KEYUP處理器只指事件發生的輸入。 –

+1

因爲'this'是一個'input'你對$(this).closest('input')''有什麼期望?它不應該返回任何內容,因爲輸入不能嵌套。請張貼表單的html。 –

+0

*但是,似乎'(':last')'不起作用*意味着什麼?它有什麼作用?你想要它做什麼? –

回答

5

:last返回集合的最後一個元素,並$(this)只有一個元素集合。

嘗試使用:last-child選擇器,它將檢查您的<input>是否真的是該組中的最後一個。

另外,如果你的領域是不是都在同一個母公司,扭轉你的測試的意義:

if ($('input').filter(':last').is(this)) { 
    // this is the last input 
} 

注:使用.filter(':last')而不是input:last每建議在http://api.jquery.com/last-selector/

+0

或者只是'$('input')。last()'。 –

+0

@Felix確實 - 我不確定爲什麼JQuery文檔會提示'.filter()'方法。 – Alnitak

2

更新:您可以創建兩個不同的綁定:

$('.loginBody input:last').keyup(function (e) { 
    if (e.which == 13) { 
      $("#result").html("last one"); 
     } 
    }); 

$('.loginBody input').not(":last").keyup(function (e) { 
    if (e.which == 13) { 
      $("#result").html("not last one"); 
     } 
}); 

這裏是一個工作示例:http://jsfiddle.net/6gYXk/1/

1

你嘗試是(':last-child')僞類而不是?

:最後孩子的意思是「如果這個元素是其父母的最後一個孩子」。請注意,只有元素節點(HTML標籤)會計數,這些僞類會忽略文本節點。

編輯: 也集中最接近的同級元素使用:

$(e.target).next('input').focus(); 

所以全碼可以是:http://jsfiddle.net/HhvUF/

0

$('.loginBody input:visible').keyup(function (e) { 
    if (e.keyCode == 13) { 
     if ($(this).is(':last-child')) { 
      $('#next').click(); 
     } else { 
      $(e.target).next('input').focus(); 
     } 
    } 
}); 

我在製備的實例最好的解決方案可能是使用nextAll來查看是否有任何後續兄弟姐妹請注意:

if ($(this).nextAll().length) { 
    $(this).closest('input').focus(); 
} else { 
    $('#next').click(); 
} 

注意我已經將if轉過來以方便閱讀。

如果你只需要檢查input元素,可以提供一個選擇:

if ($(this).nextAll('input').length) { 
相關問題