2011-09-01 21 views
2

我有一個<select>和我處理change()事件。當用戶更改選擇選項時,我想執行一系列操作。但是,如果我通過$(item).trigger('change')觸發更改,那麼我不想執行上述一系列操作。jQuery - 確定用戶與編程事件

我看到trigger() contains帶參數的過載。我不確定這是否會起作用,因爲我沒有編寫自定義事件。那麼,我應該怎麼做才能確定用戶發起的事件與我的程序性事件之間的區別?

+0

嗯...爲什麼觸發事件?必須是你正在尋找的一些副作用?是否有更改處理程序代碼需要運行,無論用戶與編程? – dotjoe

+0

@dotjoe - 有很多解釋。基本上我讓一個網站的行爲像一個桌面應用程序。我需要以特定的順序觸發事件以避免使用$ .get()請求的競爭條件。 –

回答

1

這裏有一個快速和骯髒的方式做到這一點:

var progChange = false; 

$('select').change(function() { 
    if (!progChange) { 
     // Do user actions...    
    } 
    progChange = false; 
}); 

function callSelectChange() { 
    progChange = true; 
    $('select').change(); 
} 

您可以在本質上是相同的方式trigger方法做它,它會消除全球,這是一件好事:

$('select').change(function(event, progChange) { 
    if (!progChange) { 
     // Do user actions... 
    } 
}); 

$('select').trigger('change', [true]); 

工作例如:http://jsfiddle.net/FishBasketGordo/XsPc5/

+0

您可以使用$('select')。data('progchange')而不是全局變量。另外,我不明白爲什麼在if塊內設置progChange爲false。如果它正在執行,它已經是錯誤的。 – vhallac

+0

是的,全局變量很糟糕,因爲當這種事件發生在兩個不同的節點上時會發生什麼? – jyore

+0

它被稱爲快速和骯髒的原因。第二種方法絕對是更好的方法。 – FishBasketGordo

3

你不能這樣做正常,但你可以僞造它從你的programmtic CA傳遞一個標誌二。

$('.selector').bind('click', function(event,data) { 
    if(typeof(data.programmatic) === 'undefined') { 
     //Do user stuff here 
    } else { 
     //Do progammatic stuff here 
    } 
}); 

//Call programmitcally 
$('.selector').trigger('click',{programmatic:true}); 
+1

+1 - 這是一個很好的答案。我選擇了另一個答案,因爲我發現.change()比.bind()方法更容易閱讀。我沒有使用全局變量。 –

+0

好處是可以設置多個事件或自定義事件。例如:'$('。selector')。bind({click:function(){...},change:function(){...},mouseover:function(){...}})''或'$('。selector')。bind('myEvent',function(){...});'。另一個只是簡單的使用綁定的方式,它實際上調用綁定。無論你喜歡還是喜歡,當然是最好的:) – jyore