2011-03-11 58 views
1

我在我的软件中创建了一个功能,允许用户一次编辑多个项目。他们可以选择他们想要的项目,并将每个项目放在一列中。然后我创建了一个拖放界面来复制每个项目的数据。jQuery导致浏览器在大量排序时超时

问题是,我必须为每列加载一个可排序的元素。如果他们选择了10列,它会加载大量的可排序数据,导致浏览器挂起,并在FireFox中显示一条消息,询问是否要停止脚本运行。这显然是因为浏览器的JavaScript执行时间有限。

有没有办法让jQuery排序加载而不会导致浏览器挂起?

不知道这会帮助,但我的代码...

<script type="text/javascript"> 
$(document).ready(function() { 

    $(".servicesMultipleMembers").sortable({ 
     connectWith: '.servicesMultipleMembers', 
     placeholder: 'servicePlaceHolder', 
     containment: '#servicesMembers', 
     helper: 'clone', 
     start: function(event, ui) { 
      moving_li_index_members = $(this).find('li:hidden').index(); 
      $(this).find('li:hidden').show(); 
     }, 
     remove: function(event, ui) { 
      var newRow = $(ui.item).html(); 
      var newRowRel = $(ui.item).attr('memberId'); 
      var newRowTarget = $(event.target).find('li:eq(' + (moving_li_index_members) + ')'); 
      if ($(newRowTarget).length == 0) { 
       $(event.target).append('<li memberId="' + newRowRel + '">' + newRow + '</li>'); 
      } else { 
       newRowTarget.before('<li memberId="' + newRowRel + '">' + newRow + '</li>'); 
      } 
     }, 
     receive: function(event, ui) { 
         var newRowImg = $(ui.item).find('span.serviceTitle img').attr('src'); 
      var newRow = $(ui.item).html(); 
      newRow = newRow.replace(newRowImg, site_url + 'img/help.png'); 
      newRow = newRow.replace('<span class="member_declined">', '<span class="">'); 
      $(ui.item).html(newRow); 
      MultipleServices.checkServicesMembersConflicts($(ui.item)); 
      update_member_stop = true; 
     }, 
     update: function(event, ui) { // Only update if reordering list 
      if (!update_member_stop && $(event.target).attr('id') == $(ui.item).parent().attr('id')) 
       MultipleServices.updateServiceMembers($(ui.item).parent()); 
      update_member_stop = false; 
     } 
    }); 

}); 
</script> 
+0

你有演示或我们可以看看的东西吗?可以帮助提出一种替代方法 – JohnP 2011-03-11 04:09:19

回答

2

我会尝试做与setTimeout和递归函数的东西。也许是这样的:

function initSortable(idx) { 
    if ($(".servicesMultipleMembers").eq(idx).length >0) { 
     $(".servicesMultipleMembers").eq(idx).sortable({ 
      connectWith: '.servicesMultipleMembers', 
      placeholder: 'servicePlaceHolder', 
      containment: '#servicesMembers', 
      helper: 'clone', 
      start: function(event, ui) { 
       moving_li_index_members = $(this).find('li:hidden').index(); 
       $(this).find('li:hidden').show(); 
      }, 
      remove: function(event, ui) { 
       var newRow = $(ui.item).html(); 
       var newRowRel = $(ui.item).attr('memberId'); 
       var newRowTarget = $(event.target).find('li:eq(' + (moving_li_index_members) + ')'); 
       if ($(newRowTarget).length == 0) { 
        $(event.target).append('<li memberId="' + newRowRel + '">' + newRow + '</li>'); 
       } else { 
        newRowTarget.before('<li memberId="' + newRowRel + '">' + newRow + '</li>'); 
       } 
      }, 
      receive: function(event, ui) { 
          var newRowImg = $(ui.item).find('span.serviceTitle img').attr('src'); 
       var newRow = $(ui.item).html(); 
       newRow = newRow.replace(newRowImg, site_url + 'img/help.png'); 
       newRow = newRow.replace('<span class="member_declined">', '<span class="">'); 
       $(ui.item).html(newRow); 
       MultipleServices.checkServicesMembersConflicts($(ui.item)); 
       update_member_stop = true; 
      }, 
      update: function(event, ui) { // Only update if reordering list 
       if (!update_member_stop && $(event.target).attr('id') == $(ui.item).parent().attr('id')) 
        MultipleServices.updateServiceMembers($(ui.item).parent()); 
       update_member_stop = false; 
      } 
     }); 
     setTimeout(initSortable(idx+1),500); 
    } else { 
     //remove loading message logic goes here 
    } 
} 

,然后在文档。就绪事件:initSortable(0);

设定的超时值应该给浏览器一些喘息的空间,但你可能会想工作的正在进行的一些指示页。

+0

真棒,这是完美的!我正在努力显示重叠加载消息,以表明它正在像您提到的那样加载。然而,当页面加载时,它挂起,并没有显示我的加载消息,直到可排序的加载...有什么办法强制加载我的加载覆盖功能第一? – 2011-03-13 23:41:20

+0

我不知道你是如何实现的,所以我不能说真的,但我会确保在调用initSortable()之前先初始化它,然后再添加一个initSortable()来关闭加载信息。我已经更新了答案,以获得else语句。 – 2011-03-14 01:30:57