2013-09-27 40 views
5

Tôi đang viết một plugin jquery tùy chỉnh về cơ bản sao chép chức năng của một đầu vào. Tôi có thể giải thích tại sao, nhưng sự thật giải thích là khá dài và tôi tin rằng nó không liên quan đến câu hỏi.Mở rộng phương thức .val() của jQuery thành các phần tử không nhập

Sự cố xảy ra khi tôi cố gắng mở rộng phương thức .val() của jQuery vào plugin jquery tùy chỉnh của tôi. Dưới đây là những gì tôi đã thử:

$.fn.custom_text_input = function(options){ 
    return this.each(function(){ 
     var custom_text_input = new CustomTextInput(options, this) 

     $(this)[0].val = function(){ 
      alert('something useful') 
     } 
    }) 
} 

Tôi đã thử một vài biến thể khác của điều này, tất cả đều không có ích. Nếu bất cứ ai có bất kỳ ý tưởng mà sẽ làm việc, tôi sẽ rất nhiều đánh giá cao sự khôn ngoan!

Cảm ơn!

+0

nên không định nghĩa hàm đi trong định nghĩa CustomTextInput của bạn? –

+0

Tôi muốn có thể gọi nó từ bất cứ đâu bằng cách sử dụng bộ chọn jquery. ví dụ: $ ('# div'). custom_text_input() và sau đó một nơi khác trong mã của tôi $ ('# div'). val() –

+1

BTW, '$ (this) [0]' này giống với 'this' . Khi bạn tạo một đối tượng jQuery, có một mảng zero-index của các phần tử DOM trong đối tượng jQuery đó. Vì vậy, khi bạn truy cập vào chỉ mục đầu tiên (số không) bạn sẽ có được phần tử đầu tiên. – Jasper

Trả lời

4

Để ghi đè phương thức $.val() bạn cần thực hiện một cái gì đó như $.fn.val = function() {...}. Đây là bản trình diễn: http://jsfiddle.net/CRRP5. Tôi khuyên bạn nên lưu phương pháp cũ .val() trong một biến để bạn có thể sử dụng phương thức này khi số .val() được gọi trên đầu vào biểu mẫu thông thường.

+1

Sẽ không ghi đè lên .val() ban đầu cho tất cả các phần tử? Tôi đang cố tránh điều đó trừ khi không có cách nào khác. Có lẽ có một cách để gọi phương thức .val() của jquery từ bên trong phương thức .val() tùy chỉnh của tôi nếu phần tử không phải là một phần của plugin của tôi? –

+2

@ FredGarbutt Đó là ý của tôi trong câu cuối cùng trong câu trả lời của tôi. Lưu hàm '.val()' cũ vào một biến và gọi nó khi hàm '.val()' của bạn được gọi trên đầu vào biểu mẫu. Bạn sẽ cần phải kiểm tra loại phần tử HTML và nếu đầu vào biểu mẫu của nó sau đó trả về phản hồi từ hàm '.val()' ban đầu, nếu không trả về phản hồi từ tùy chỉnh của bạn. Và có, điều này sẽ ghi đè lên chuẩn jQuery '.val()'. – Jasper

+1

@FredGarbutt Một giải pháp thay thế có thể là trả về một đối tượng jQuery từ phương thức 'custom_text_input' của bạn với phương thức' .val() 'đã cập nhật. Bằng cách đó, bạn chỉ ghi đè phương thức '.val()' cho đối tượng jQuery đơn lẻ đó. Đây sẽ là một cái gì đó như, 'var $ this = $ (this); $ this.val = function() {...} '. Bạn sẽ phải lưu đối tượng jQuery trả về dưới dạng một biến để nó có thể truy cập được trong tương lai, vì việc tạo lại một đối tượng jQuery bằng cách chọn nút DOM sẽ sử dụng phương thức '.val()' toàn cục mà bạn không cập nhật. Đây là chưa được kiểm chứng, chỉ cần đến tâm trí. – Jasper

2

Cách duy nhất bạn sẽ làm việc này là mở rộng kết quả của phương pháp val() của jQuery.

$(function(){ 
    $.fn.oldVal = $.fn.val 
    $.fn.val = function(value){ 
    //I'm assuming here that you're setting/getting a data value 
    //on the object to keep track of it's "custom value" 
    if(value && $(this).data('custom-input-value')){ 
     return $(this).data('custom-input-value', value); 
    } 
    else if(value = $(this).data('custom-input-value')){ 
     return value; 
    }else{ 
     return value ? $(this).oldVal(value) : $(this).oldVal(); 
    } 
    } 


}) 

Điều đó có thể làm việc cho bạn: p

Dưới đây là một jsfiddle với nó làm việc: http://jsfiddle.net/Z4c6d/

+0

đây chính xác là những gì tôi cần! nó cũng là những gì jasper đã nói với tôi để làm trước khi mặc dù. Về mặt kỹ thuật, cả hai đều nói cùng một điều. cảm ơn cho những phản ứng rõ ràng! –

+0

Tôi đã cập nhật mã để hoạt động bình thường ... và bao gồm jsfiddle hoạt động. – nzifnab

+0

Tôi tìm thấy một vấn đề với mã trong jsfiddle nếu bạn cố gắng thiết lập giá trị của cả hai đầu vào - mã ngắn mạch khi thiết lập thông qua oldVal. Tôi đã cập nhật hoạt động đúng trong trường hợp đó: http://jsfiddle.net/Z4c6d/1/ –

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