2013-03-26 106 views
4

我已經找到很好的解決方案(最後的答案):選擇並拖動多個列表項(jQuery UI的排序)

jQuery Sortable - Select and Drag Multiple List Items

http://jsfiddle.net/hQnWG/480/

HTML:

<ul> 
    <li>One</li> 
    <li>Two</li> 
    <li>Three</li> 
</ul> 
<ul> 
    <li>Four</li> 
    <li>Five</li> 
    <li>Six</li> 
</ul> 

JavaScript(使用jQuery和jQuery UI):

$("ul").on('click', 'li', function (e) { 
    if (e.ctrlKey || e.metaKey) { 
     $(this).toggleClass("selected"); 
    } else { 
     $(this).addClass("selected").siblings().removeClass('selected'); 
    } 
}).sortable({ 
    connectWith: "ul", 
    delay: 150, //Needed to prevent accidental drag when trying to select 
    revert: 0, 
    helper: function (e, item) { 
     var helper = $('<li/>'); 
     if (!item.hasClass('selected')) { 
      item.addClass('selected').siblings().removeClass('selected'); 
     } 
     var elements = item.parent().children('.selected').clone(); 
     item.data('multidrag', elements).siblings('.selected').remove(); 
     return helper.append(elements); 
    }, 
    stop: function (e, info) { 
     info.item.after(info.item.data('multidrag')).remove(); 
    } 

}); 

它的偉大工程,但是,當我拖着兩個或多個元素JS控制檯谷歌瀏覽器顯示此錯誤:

Uncaught TypeError: Cannot call method 'insertBefore' of null

如何解決呢?

+0

在Safari'6.0.3'和OS X'10.8.3'沒有錯誤。另外我沒有看到'insertBefore()'在你的代碼中?問題是,一個jQuery選擇器可能失敗了'var test = $('#myNoneExcistingElement');''和'console.log(test);'會打印null或undefined。 – 2013-03-26 12:20:46

+0

'25.0' chrome – 2013-03-26 12:26:23

+0

@DavidChase沒有錯誤,因爲'.insertBefore()'方法在示例中不存在);或者它被用作另一種方法的替代品,但無法確認。 – 2013-03-26 12:27:11

回答

4

我認爲它在jQuery的UI _rearrange功能的錯誤...... 所以我也將覆蓋該方法...... 插入後DOM準備好下面的代碼...這將解決這一問題的破解

$.ui.sortable.prototype._rearrange = function (event, i, a, hardRefresh) { 

       a ? a[0].appendChild(this.placeholder[0]) : (i.item[0].parentNode) ? i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling)) : i.item[0]; 
       this.counter = this.counter ? ++this.counter : 1; 
       var counter = this.counter; 

       this._delay(function() { 
        if (counter === this.counter) { 
         this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove 
        } 
       }); 

      } 

這裏是小提琴

http://jsfiddle.net/r83zY/

相關問題