2010-12-29 9 views
66

나는 모든 곳에서 검색 한,하지만 난 어떤 도움을 찾을 수 없습니다 ... 바인딩 jQuery를 UI 자동 완성()

나는 그래서 난에 JS를 통해 동적으로 생성 된 일부 텍스트 상자를 필요로했다 모든 클래스를 자동 완성에 바인딩합니다. 결과적으로 새로운 .live() 옵션을 사용해야합니다. 예를 들어

가 만들어 지금 .foo와 미래의 클래스와 모든 항목을 바인딩 :

$('.foo').live('click', function(){ 
    alert('clicked'); 
}); 

이 소요 (및 작동) .bind과 동일(). 그러나, 나는 자동 완성을 바인딩 할 ...

이 작동하지 않습니다 :

$('.foo').live('autocomplete', function(event, ui){ 
    source: 'url.php' // (surpressed other arguments) 
}); 

가 어떻게 자동 완성을 바인딩 .live()를 사용할 수 있습니까?

UPDATE

는 프레이머 그것을 알아 냈 :

$(function(){ 
    $('.search').live('keyup.autocomplete', function(){ 
    $(this).autocomplete({ 
     source : 'url.php' 
    }); 
    }); 
}); 
+2

1 업데이 트,'라이브()'되지 않습니다, 지금'으로 솔루션 – ehftwelve

+7

을 게시 $ (document) .on ("keyup.autocomplete", ".autocomplete", function() {$ (this) .autocomplete ({...});}과 같은 방법으로 on())'... – devdRew

+0

추가 된 모든 요소에 대해 자동 완성 메서드를 호출하지 않고 자동 완성 메서드를 한 번만 호출하면이 동작을 얻을 수있는 방법이 있습니까? –

답변

18

, 나는 방법을 모른다

$('.foo').livequery(function() { 

    // This will fire for each matched element. 
    // It will also fire for any new elements added to the DOM. 
    $(this).autocomplete(options); 
}); 
: 그냥 추가하면
+2

ui.autocomplete를 사용하고 있는데 바인딩이 작동합니다. :) 나는 경보를 울릴 수는 있지만 실제로 자동 완성을하지는 않는다 ... 내가 내 대답에서 업데이트 한 것을 시도하면 구문 오류가 발생한다 ... – sethvargo

+0

흠 .. 구문 오류? –

+2

이것은 나에게 이해가되지 않습니다. 자동 완성은 아직 새 요소에 추가되지 않았으므로 생성되는 모든 이벤트에 바인딩 할 수 없습니다. 정답은 댄 (Dan)의 답변입니다. – mynameistechno

1

자동 완성이 아니라 이벤트 텍스트 상자에 대한 자동 완성 기능을 가능하게하는 기능이 아닙니다.

따라서 텍스트 상자를 jquery 개체로 랩핑하고 해당 개체에서 자동 완성을 호출하도록 동적으로 텍스트 상자를 만드는 j를 수정할 수 있다면.

3

수 없습니다. .live()는 사용자 정의 이벤트가 아닌 실제 JavaScript 이벤트 만 지원합니다. 이것은 .live()가 작동하는 방식의 근본적인 제한 사항입니다. 당신이이 jquery.ui.autocomplete.js 대신

.bind("keydown.autocomplete") or .live("keydown.autocomplete") 

없는 경우이 시도 jquery.ui.autocomplete.js를 사용하고이 적용되지 않는 경우가

작동합니다 있는지 사용하는 경우

9

을 동생 아 수 있도록, 당신은이에 대한 .livequery 플러그인을 사용할 수 있습니다
+0

이것은 내가 찾은 최고의 최고로 멋진 플러그인입니다! 이것은 내가 생각하는 datepicker에서도 작동합니다! 나는 jquery로 일하고 있기 때문에 나는 이것을 찾고 있었다. 나는 한 번만 투표를 할 수있다 .... 나의 나쁜 ... – workdreamer

+0

Very Recommended Plugin, 이것은 두통을 제거 할 것이다 – GusDeCooL

1

방금이 답변으로 귀하의 게시물을 편집하신 것으로 나타났습니다. 나에게는 분명 했으므로 다른 사람들을 위해 아래에 게시하고 있습니다. 고맙습니다.

$(function() 
{ 
    $('.search').live('keyup.autocomplete', function() 
    { 
    $(this).autocomplete({ source : 'url.php' }); 
    }); 
}); 
+0

이것은 .search 요소를 자동 완성 요소로 바꾼다. 키를 누르면 자동 완성은 아무 키나 누르기 전에 작동해야하며 각 키 이벤트 이후가 아닌 한 번만 초기화해야합니다. –

70

jQuery UI 자동 완성 기능은 "ui-autocomplete-input"클래스를 요소에 자동으로 추가합니다. "ui-autocomplete-input" 클래스를 사용하지 않고 포커스가있는 요소를 바인딩 한 라이브 바인딩을 사용하여 해당 요소 내의 모든 keydown 이벤트에 대한 재 바인딩을 방지하는 것이 좋습니다.

$(".foo:not(.ui-autocomplete-input)").live("focus", function (event) { 
    $(this).autocomplete(options); 
}); 

편집

내 대답은 jQuery를 1.7부터 오래된 지금, 새로운 .on() 구문을 사용 나단 Strutz의 의견을 참조하십시오.

+1

정답입니다. keyup에 대한 바인딩은 첫 번째 키 입력에 바인딩되지 않습니다. 아주 영리한 생각. 감사. –

+1

감사합니다. 나는 '초점'이 'keydown'보다 낫다는 것을 발견했다. – Cynial

+0

고마워요, 우수 – kaklon

5

.live()는 포커스가있는 상태에서 작동하지 않습니다. 또한 keyup.autocmplete는 의미가 없습니다. 는 대신 것은 내가 시도와 작업이 완벽하게 잘 작동이

$(document).ready(function(){ 
$('.search').live('keyup' , function() 
    { 
    $(this).autocomplete({ source : 'url.php' }); 
    }); 
}) 

입니다. 나는 JQuery와의 현재 버전을 업데이트 한 답변을 읽고 다른 사람의 테스트 한 후

$(function() 
{ 
    $('.item_product').live('focus.autocomplete', function() 
    { 

    $(this).autocomplete("/source.php/", { 
     width: 550, 
     matchContains: true, 
     mustMatch: false, 
     selectFirst: false, 
    }); 

    }); 
}); 
2

이 사용 시도 할 수 있습니다 비틀기.

.autocomplete()을 호출하는 이벤트로 keydown을 사용할 때의 문제는 입력 한 첫 번째 문자에 대해 자동 완성에 실패한다는 것입니다. 초점을 사용하는 것이 더 나은 선택입니다.

내가 알아챈 또 다른 사실은 주어진 솔루션 모두가 .autocomplete()이 여러 번 호출된다는 것입니다. 다시 삭제되지 않을 페이지에 요소를 동적으로 추가하는 경우 이벤트는 한 번만 발생해야합니다. 항목을 제거하고 다시 추가하더라도 이벤트를 제거한 다음 요소를 제거하거나 추가 할 때마다 다시 추가해야 필드에 다시 초점을 맞추어 불필요하게 .autocomplete() 번을 호출하지 않아도됩니다. jQuery를> 1.7에서 사용되는 on() 이벤트를 동적으로로드 할 때

$(document).on('focus.autocomplete', '#myAutocomplete', function(e){ 
    $(this).autocomplete(autocompleteOptions); 
    $(document).off('focus.autocomplete', '#myAutocomplete'); 
}); 
1

이 나를 위해 작동합니다

2

을 몇을했다 :

$('.foo').live('focus.autocomplete', function() { 
    $(this).autocomplete({...}); 
}); 
+0

이것은 내가 본 가장 좋은 대답이지만 여전히 내가 찾고있는 것이 아닙니다. 나는 'on'방법의 요점은 당신이 알고있는 가장 가까운 부모에게 묶어서 한 번만 바인딩 할 수있게하는 것이라고 생각했습니다. 여기서 새로운 요소가 추가 될 때마다 자동 완성을 바인드하는 함수에 한 번 바인딩됩니다. 이 점을 조금이라도 놓치지 않습니까? 나는. autocomplete 바인딩은 새로운 입력 요소가 단 한 번이 아니라 매번 추가 될 때마다 실행됩니다. –

+1

당신은'on()'에 대해 정확하지만 자동 완성은 이벤트가 아닙니다. 요소가 대체 될 때마다 해당 요소에서 자동 완성 함수를 다시 호출해야합니다. 자동 완성 호출은 요소를 대체하기 위해 구현하거나 "자동 완성"클래스가있는 요소에 집중할 때 자동 완성을 호출하는 이벤트 리스너를 설정할 수 있습니다. 요소가 교체 될 때마다 한 가지 방법 또는 다른 자동 완성을 호출해야합니다. 나는 다른 사람들의 솔루션에 개방적이며 향후 릴리스에서 jQuery 팀이 이러한 단점을 해결하기를 바랍니다. –

8

자동 완성 작업을 얻으려면, 나단 Strutz 그의 주석에서 제공하는 구문을 사용하여 : :

$(document).on('focus', '.my-field:not(.ui-autocomplete-input)', function (e) { 
    $(this).autocomplete(options) 
}); 
을 다음과 같이

내 마지막 코드는

여기에서 .my-field은 자동 완성 입력 요소의 선택 자입니다.

0

당신은 다음과 같이 입력 라이브 이벤트 내부의 자동 완성을 넣을 수 있습니다 :

$('#input-element').live('input', function(){ 
 
    
 
$("#input-element").autocomplete(options); 
 

 
});