2010-12-29 43 views
66

Tôi đã tìm kiếm khắp nơi, nhưng tôi dường như không thể tìm thấy bất kỳ sự giúp đỡ ...Bind jQuery UI autocomplete sử dụng .live()

Tôi có một số textbox được tạo ra tự động qua JS, vì vậy tôi cần phải ràng buộc tất cả các lớp học của họ thành tự động hoàn thành. Kết quả là, tôi cần sử dụng tùy chọn .live() mới.

Như một ví dụ, để ràng buộc tất cả các mục có một lớp học của .foo bây giờ và trong tương lai tạo:

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

Phải mất (và cư xử) giống như .bind(). Tuy nhiên, tôi muốn để ràng buộc một autocomplete ...

này không hoạt động:

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

Làm thế nào tôi có thể sử dụng .live() để ràng buộc autocomplete?

CẬP NHẬT

đặn nó ra với Framer:

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

+1 cho đăng giải pháp – ehftwelve

+7

Như một bản cập nhật, 'live()' bị phản đối, bây giờ ' on() 'được sử dụng để làm điều này, như:' $ (document) .on ("keyup.autocomplete", '.autocomplete', function() {$ (this) .autocomplete ({...});}) '... – devdRew

+0

Có cách nào để đạt được hành vi này mà không cần gọi phương thức tự động hoàn thành cho mọi phần tử được thêm vào, thay vào đó gọi phương thức tự động hoàn thành một lần và chỉ một lần? –

Trả lời

18

Nếu bạn đang sử dụng jquery.ui.autocomplete.js thử này để thay thế

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

nếu không, sử dụng jquery.ui.autocomplete.js và xem nếu nó sẽ làm việc

Nếu điều đó không áp dụng, tôi không biết làm thế nào để giúp bạn bro

+2

Tôi đang sử dụng ui.autocomplete và các công việc liên kết của bạn :). Tôi có thể kích hoạt một cảnh báo ... nhưng điều đó không thực sự làm cho nó một autocomplete ... Nếu tôi thử những gì tôi đã cập nhật trong câu trả lời của tôi, tôi nhận được lỗi cú pháp ... – sethvargo

+0

hmm .. cú pháp lỗi? –

+2

Điều này không có ý nghĩa với tôi. tính năng tự động hoàn tất vẫn chưa được thêm vào phần tử mới nên bạn không thể liên kết với bất kỳ sự kiện nào mà nó tạo ra. câu trả lời đúng là câu trả lời dưới đây của Dan. – mynameistechno

1

autocomplete không phải là một sự kiện khá một chức năng cho phép chức năng autocomplete cho một textbox.

Vì vậy, nếu bạn có thể sửa đổi js tạo hộp văn bản động để bọc phần tử hộp văn bản như một đối tượng jquery và gọi tự động hoàn thành trên đối tượng đó.

3

Bạn không thể. .live() chỉ hỗ trợ các sự kiện JavaScript thực, chứ không hỗ trợ bất kỳ sự kiện tùy chỉnh nào. Đây là một hạn chế cơ bản về cách thức .live() hoạt động.

9

Chỉ cần thêm, bạn có thể sử dụng plugin .livequery cho việc này:

$('.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); 
}); 
+0

Đây là plugin tuyệt vời nhất và tuyệt vời nhất từ ​​trước đến nay! Điều này cũng sẽ hoạt động với datepicker tôi giả sử! Tôi đã tìm kiếm điều này kể từ khi tôi làm việc với jquery ... Tôi chỉ có thể bỏ phiếu một lần .... xấu của tôi ... – workdreamer

+0

Rất được đề xuất Plugin, điều này sẽ loại bỏ nhức đầu của bạn – GusDeCooL

1

Tôi vừa mới nhận thấy bạn đã chỉnh sửa bài đăng của mình bằng câu trả lời này. Rõ ràng với tôi vì vậy tôi đăng nó dưới đây cho những người khác. Cảm ơn bạn.

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

Điều này biến .search yếu tố thành một phần tử tự động hoàn thành sau một phím được nhấn. Tự động hoàn thành sẽ hoạt động TRƯỚC KHI bất kỳ phím nào được nhấn và nó chỉ nên được khởi tạo một lần thay vì sau mỗi sự kiện khóa. –

70

Chức năng tự động hoàn thành jQuery UI tự động thêm lớp "ui-autocomplete-input" vào phần tử. Tôi muốn khuyên bạn nên liên kết trực tiếp phần tử trên tiêu điểm mà không có lớp "ui-autocomplete-input" để ngăn chặn việc ràng buộc lại mọi sự kiện keydown trong phần tử đó.

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

Sửa

câu trả lời của tôi bây giờ đã quá hạn kể từ jQuery 1.7, xem bình luận Nathan Strutz của để sử dụng với .on() cú pháp mới.

+1

Đây là câu trả lời đúng. Ràng buộc về khóa không có vẻ liên kết với lần nhấn phím đầu tiên. Tư duy rất thông minh. Cảm ơn. –

+1

Cảm ơn. Tôi thấy 'tập trung' tốt hơn 'keydown'. – Cynial

+0

Cảm ơn bạn, tuyệt vời – kaklon

5

.live() không hoạt động với tiêu điểm. cũng keyup.autocmplete không có ý nghĩa gì cả. Thay vào đó, điều tôi đã thử và làm việc là

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

Điều này hoàn toàn phù hợp.

2

Bạn có thể thử sử dụng này:

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

này làm việc cho tôi:

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

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

    }); 
}); 
2

Sau khi đọc và kiểm tra tất cả mọi người của người khác câu trả lời tôi đã cập nhật nó cho phiên bản hiện tại của JQuery và thực hiện một vài chỉnh sửa.

Sự cố khi sử dụng phím tắt khi sự kiện gọi .autocomplete() là sự cố không tự động hoàn tất cho chữ cái đầu tiên được nhập. Sử dụng tiêu điểm là lựa chọn tốt hơn.

Một điều khác mà tôi đã nhận thấy là tất cả các giải pháp đã cho kết quả là .autocomplete() được gọi nhiều lần. Nếu bạn thêm phần tử động vào trang sẽ không bị xóa lần nữa, sự kiện chỉ nên được kích hoạt một lần. Ngay cả khi mục bị xóa và được thêm lại, sự kiện sẽ bị xóa và sau đó thêm lại mỗi khi phần tử bị xóa hoặc thêm vào để tập trung vào trường một lần nữa sẽ không cần thiết gọi .autocomplete() mỗi lần.

mã cuối cùng của tôi là như sau:

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

Đây là câu trả lời hay nhất mà tôi đã nhìn thấy nhưng vẫn không phải những gì tôi đang tìm kiếm. Tôi nghĩ rằng điểm của phương pháp 'on' là bạn liên kết với cha mẹ gần nhất mà bạn biết KHÔNG được thay thế, do đó bạn chỉ bao giờ liên kết một lần. Ở đây bạn có một thời gian ràng buộc với một hàm liên kết với tính năng tự động hoàn tất mỗi lần thêm các phần tử mới. Điều này không bỏ lỡ điểm một chút? I E. các ràng buộc tự động hoàn thành đang được chạy mỗi khi các yếu tố đầu vào mới được thêm vào thay vì chỉ một lần. –

+1

Bạn đúng về 'on()', nhưng tự động hoàn tất không phải là một sự kiện. Mỗi lần phần tử được thay thế, chức năng tự động hoàn tất cần phải được gọi lại trên phần tử đó một lần nữa. Bạn có thể thực hiện nó để gọi tự động hoàn tất là một phần của việc thay thế phần tử hoặc bạn có thể thiết lập trình xử lý sự kiện tự động gọi tự động hoàn thành khi bạn tập trung vào bất kỳ phần tử nào có lớp "tự động hoàn tất". Một cách hoặc tự động hoàn thành khác cần phải được gọi mỗi khi phần tử được thay thế. Tôi mở cửa cho các giải pháp của người khác và tôi hy vọng nhóm jQuery giải quyết nhược điểm này trong một bản phát hành trong tương lai. –

8

Để có được làm việc autocomplete khi nạp tự động cho sự kiện on() sử dụng trong jQuery> 1,7, sử dụng cú pháp Nathan Strutz cung cấp trong bình luận của ông:

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

trong đó .my-field là bộ chọn cho phần tử nhập tự động hoàn thành của bạn.

0

Bạn chỉ có thể đặt tự động hoàn bên trong sự kiện trực tiếp đầu vào, như thế này:

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

 
});

Các vấn đề liên quan