2010-10-26 51 views
14
<script> 
$("input[name='my_radio_button']").change(function(){ 
    if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ 
       do_this_stuff(); 
    } else { do_other_stuff(); } 
}); 
</script> 

<input type="radio" name="my_radio_button1" id="radio1" value="ONE" checked /> 
<input type="radio" name="my_radio_button2" id="radio2" value="TWO" /> 

(giả nhúng HTML hoàn hảo và kịch bản bắn khi tất cả đã sẵn sàng)Thay đổi sự kiện không bắn khi nút radio được chọn với bàn phím

Các sự kiện thay đổi dường như bắn khi nhấp chuột để chọn một tùy chọn radio, nhưng không khi lựa chọn được thay đổi bằng bàn phím. Bất cứ điều gì có thể được thực hiện về điều này?

chỉnh sửa - không có sự khác biệt nếu tôi sử dụng bind hoặc live - đây có phải là lỗi không?

Để làm rõ, sự kiện không kích hoạt ngay cả sau khi tiêu điểm bị mất.

chỉnh sửa 2 - không ai biết lý do cho điều này?

chỉnh sửa 3 - như DonaldIsFreak chỉ ra điều này dường như là một vấn đề chrome

+0

gì bạn có, theo thứ tự đó là trong, không nên làm việc ở tất cả, là bạn chắc chắn bạn đang nhận được bất kỳ hành vi nào, ngay cả với nhấp chuột? –

+0

@Nick Craver - điều này có tốt hơn không? – Greg

+1

Khi tôi chạy tập lệnh này trên trình duyệt firefox là thành công, nhưng trên trình duyệt Chrome không thay đổi. tôi đoán vấn đề này về xử lý sự kiện jquery. Phiên bản nào bạn sử dụng jquery? – dz1984

Trả lời

24

đây là một sửa chữa đáng tin cậy http://evilstreak.co.uk/blog/fixing-change-events-on-radios

Và sử dụng nó đây là cách bạn sẽ thực hiện nó với ví dụ của bạn: Và đây là một demo của mã dưới đây http://www.jsfiddle.net/uDkdJ/1/ tôi thử nghiệm bản demo này trong FF3.6, IE8, Safari5 , Chrome7 và Opera10.65

$.fn.fix_radios = function() { 
    function focus() { 
    if (!this.checked) return; 
    if (!this.was_checked) { 
     $(this).change(); 
    } 
    } 

    function change(e) { 
    if (this.was_checked) { 
     e.stopImmediatePropagation(); 
     return; 
    } 
    $("input[name=" + this.name + "]").each(function() { 
     this.was_checked = this.checked; 
    }); 
    } 
    return this.focus(focus).change(change); 
} 

$(function() { 
    $("input[type=radio]").fix_radios(); 
    $("input[name='my_radio_button']").change(function(){ 
    if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ 
     do_this_stuff(); 
    } else { do_other_stuff(); } 
    }); 
}); 
+0

Tôi chưa có cơ hội để kiểm tra điều này, nhưng tôi tin rằng nó hoạt động. Tôi sẽ tận dụng điều này. Cảm ơn bạn! – Greg

+0

không hoạt động khi bạn bấm div quanh đài, trình duyệt sẽ tự động kiểm tra radio –

+0

@DoHoaVinh dường như hoạt động tốt. có một cái nhìn http://jsfiddle.net/uDkdJ/302/ –

0

Thật không may, nút radio không cháy, sự kiện thay đổi khi thay đổi với bàn phím, cho đến khi bạn mất tập trung.

Nếu bạn muốn khắc phục sự cố này, bạn luôn có thể thiết lập bộ hẹn giờ theo dõi trạng thái và gửi một sự kiện khi nó thay đổi. Giống như (giả):

var monitorRadio = function(radio) 
{ 
    var state = $("input[@name='']:checked").val(); 
    $(radio).data("state", state); 
    var func = function() 
    { 
    var state = $("input[@name='']:checked").val(); 
    if (state != $(radio).data("state")) 
    { 
     $(radio).data("state", state); 
     // dispatch the change event 
     $(radio).change(); 
    } 
    setTimeout(100, func()); 
    }; 


    func(); 
} 
+0

Cảm ơn bạn đã giải quyết sự cố, nhưng mã của tôi không hoạt động ngay cả * sau khi * các nút radio bị mất tiêu điểm. Tôi sẽ tab đến một lĩnh vực khác và jquery chỉ bỏ qua sự thay đổi hoàn toàn. Hộp chọn, ví dụ, hoạt động đúng khi thay đổi và tiêu điểm bị mất. – Greg

0

Tôi không có nhiều may mắn nhận được nút radio để thay đổi nó là nhà nước với các phím mũi tên trong jsfiddle của tôi, vì vậy đây là một câu trả lời mù:

Sử dụng .keypress() Cùng cai trị về việc không thay đổi cho đến khi mất tập trung áp dụng để chọn hộp, và tôi đã sử dụng thành công .keypress()

http://api.jquery.com/keypress/

0
$("input[name='my_radio_button']").bind('change keypress', function(){ 
    if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ 
    do_this_stuff(); 
    } else { do_other_stuff(); } 
}); 

Vấn đề với phương pháp này là sự kiện sẽ kích hoạt một lần khi người dùng nhấn một phím và một lần nữa khi nó mất tiêu điểm. Tôi không chắc chắn những gì do_this_stuff()do_other_stuff() làm, nhưng nếu họ bắn nhiều hơn một lần là một vấn đề, bạn có thể sửa lỗi này với một var để kiểm tra những gì giá trị trước đó là, để bạn biết nếu nó thực sự đã thay đổi:

$("input[name='my_radio_button']").bind('change keypress', function(){ 
    if ($(this).value() != prevValue) { 
    if ($("input[@name='my_radio_button']:checked").val() == 'ONE'){ 
     do_this_stuff(); 
    } else { do_other_stuff(); } 
    } 
    prevValue = $(this).value(); 
}); 
7

Trong bộ chọn jquery 1.4.2 @ không hoạt động. Hãy xem ví dụ này để xem nó có hữu ích cho bạn hay không, thay đổi sự kiện "thay đổi" cho mỗi "bấm".

html

<input type="radio" name="rdio" value="a" checked="checked" /> 
<input type="radio" name="rdio" value="b" /> 
<input type="radio" name="rdio" value="c" /> 

<br /> 

<div id="test"></div> 

javascript:

$("input[name='rdio']").click(function(){ 
    if ($("input[name='rdio']:checked").val() == 'a') 
     $("#test").append("<div>a</div>"); 
    else if ($("input[name='rdio']:checked").val() == 'b') 
     $("#test").append("<div>b</div>"); 
    else 
     $("#test").append("<div>c</div>"); 
}); 

example
ref 1
ref 2

+0

Điều này hoạt động như một sự quyến rũ! Cảm ơn! – KManohar

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