2013-10-22 55 views
0

我有一个表格,用户可以通过复选框选择某些行。我有一些JavaScript,让他们选择每个复选框和全选。我还写了一些JavaScript,让用户选中一个框,然后按住Shift并单击另一个复选框,之间的所有框都应该被选中。JavaScript没有看到第一次点击?

所有这些工作唯一的问题是,第一个复选框没有被识别。因此,当用户按住Shift并选择另一个复选框时,只会选中该复选框。但是如果用户按住Shift并选择第三个复选框,那么第二个和第三个之间的所有框都会被检查。

的Javascript

$(document).ready(function() { 
    $(this).click(function() { 
     //shift-click checkboxes 
     var lastChecked = null; 
     var handleChecked = function (e) { 
      //alert(lastChecked); 
      if (lastChecked && e.shiftKey) { 
       var i = $('input[type="checkbox"]').index(lastChecked); 
       var j = $('input[type="checkbox"]').index(e.target); 

       var checkboxes = []; 
       if (j > i) { 
        checkboxes = $('input[type="checkbox"]:gt(' + (i - 1) + '):lt(' + (j - i) + ')'); 
       } else { 
        checkboxes = $('input[type="checkbox"]:gt(' + j + '):lt(' + (i - j) + ')'); 
       } 

       if (!$(e.target).is(':checked')) { 
        $(checkboxes).removeAttr('checked'); 
       } else { 
        $(checkboxes).attr('checked', 'checked'); 
       } 
      } 
      lastChecked = e.target; 
     } //handleChecked 
     $('input[type=checkbox]').click(handleChecked); 
    }); //$(this).click(function()) 

    //select all checkboxes 
    $('#selectall').click(function (i, v) { 
     $('.selectedId').prop('checked', this.checked); 
    }); 

    var checkCount = $('.selectedId').length; 
    $('.selectedId').click(function (i, v) { 
     $('#selectall').prop('checked', $('.selectedId:checked').length == checkCount) 
    }); 
}); //ready function 

我做了复制问题小提琴。

http://jsfiddle.net/tihg7947/JXnNK/

要复制我的问题,检查框(不是全部选择其他),然后按住Shift键并选择另一个框。

我是新来的网页设计,不知道如何诊断这个问题(事件处理?)。 我将不胜感激任何帮助或指导。

回答

2

您从$(this).click(function() {内安装handleChecked听众。这意味着:

  1. 直到用户单击一次才安装事件处理程序。
  2. 将安装事件处理程序的多个副本。

我想你只想在$(document).ready(function() {内设置一次事件处理程序。

所以,只要删除线

$(this).click(function() { 

}); //$(this).click(function()) 
+0

非常感谢您!这是问题,并删除它纠正了这个问题。我很欣赏关于为什么它不工作的根本性故障! – bratak

3

要绑定$('input[type=checkbox]')$(this).click(function() {功能因此它不工作第一次

你绑定事件中$(document).ready(function() {

作为我的联合国derstanding删除$(this).click(function() {

Fiddle Demo

+0

谢谢!我希望我可以选择多个答案,因为你和@RussellZahniser有相同的答案。 – bratak

+0

@bratak,不接受它作为答案的问题。我很高兴我能够在某些方面提供帮助。 – Satpal

相关问题