2012-09-17 54 views
3

是否可以手動觸發jQuery排序控件的事件?jQuery手動排序觸發排序事件

我試過$(selector).trigger('sortstop')但似乎沒有發生。

一些相關的HTML:

<div data-zone="name"> 
    <div class="section disabled" id="section-1">Some section template 1</div> 
    <div class="section" id="section-2">Some section template 2</div> 
    <div class="section" id="section-3">Some section template 3</div> 
</div> 

<button class="trigger-button">Trigger stop</button> 

和一些JavaScript代碼:

$("[data-zone]").sortable({ 
    placeholder: 'ui-state-highlight', 
    cancel : ".section.disabled", 
    stop: function(){ 
     console.log('sort-stopped');   
    } 
}) 

$(".trigger-button").click(function(){ 
    console.log('trigger-button clicked'); 
    var $zone = $('[data-zone]'); 
    console.log($zone); 
    $zone.trigger('sortstop'); 
}); 

問題的JsFiddle

+0

爲什麼你需要手動觸發sortstop?你不能把停止功能的內容放在另一個函數中嗎?並直接調用第二個函數? – Nal

+0

主要問題是代碼中的閉包。雖然我參考了該區域,但每個區域都有一個「切換移動」,可以移動該區域。我試圖有一個身體點擊處理程序,將取消移動,因爲所有其他控件是隱藏的。我想我已經通過適當的封閉解決了它。我會稍後更新jsfiddle –

回答

0

jQuery UI使用事件通知您的代碼發生了與其代碼有關的事情,而不是相反。

你應該尋找方法,你可以用它來控制排序對象,而不是試圖通過觸發事件來控制UI元素:

// Are you looking for this? 
$(".selector").sortable("cancel"); 

// Or this? 
$(".selector").sortable("enable"); 
$(".selector").sortable("disable"); 

也沒有「sortstop」事件。有一個「停止」事件和一個「beforeStop」事件,可以在排序完成或即將完成時進行排序,但這些事件由可排序對象發出,而不是由可排序對象讀取以執行操作。

如果你真正想要的是偵聽這些事件,所以你可以執行一些操作,那麼這就是你可能想要做什麼:

$("[data-zone]").on('stop', function(evt, ui) { 
    // sortable has notified that it has stopped, do stuff here 
}); 

更多信息可以在jQuery UI的文件上發現排序:

http://api.jqueryui.com/sortable/

另外,這裏是在GitHub上sortable.js源文件

https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.sortable.js