2012-07-05 20 views
9

我試圖在select元素改變時觸發一個函數。如何綁定到模糊和更改,但只在JQuery/Javascript中觸發一次函數?

由於Ipad在on('change')方面有問題,我還想綁定到'blur',這在Ipad上可以正常工作。

但是我不希望這兩個事件觸發功能的兩倍,所以我需要某種形式的掛鉤,以確保如果兩個變化模糊觸發,底層函數只觸發一次。

這是我現在在做什麼,但......不是很好:

// make sure binding is only assigned once 
var compSel = $('#my_select'); 
if (compSel.jqmData('bound') != true){ 
    console.log("bound"); 
    compSel.jqmData('bound', true) 
     .on($.support.touch ? 'blur' : 'change', function(){ 
      console.log("trigger"); 
      // run function xyz 
     }) 
    }    

這工作,如果你可以與所有的可觸摸設備製造生活確實與模糊

問:
有沒有人有一個更好的主意,以確保模糊和更改一次只觸發功能?

感謝您的幫助!

回答

21

嘗試創建一個函數,綁定到兩個事件,並添加一個超時來調用該函數。這樣,如果函數被多次調用,它將只運行一次。

像這樣的東西(如果需要的話,你可以調整超時):

function blurChange(e){ 
    clearTimeout(blurChange.timeout); 
    blurChange.timeout = setTimeout(function(){ 
     // Your event code goes here. 
    }, 100); 
} 

$('#my_select').on('blur change',blurChange); 
+1

+1這應該工作 – Vithozor 2012-07-05 14:48:08

+0

呀。也是我正在採取的方法。謝謝! – frequent 2012-07-05 19:33:43

+0

如果操作打開新頁面,則在用戶返回到原始頁面時,超時將過去,並通過單擊所述頁面,他將觸發模糊事件。 – 2016-10-18 21:00:30

0

這不是很好,但你可以打電話changeblur功能,並做所有的東西在change功能:

... 
$(document).on("change", "#yourelement", function(){ 
    //do your stuff 
}); 
.... 
$(document).on("blur", "#yourelement", function(){ 
    $("#yourelement").change(); 
    //alternatively, you can trigger the change event 
    //$("#yourelement").trigger("change"); 
}); 

它並不好看,但我認爲它應該工作。

編輯:如果瀏覽器啓動兩個事件(模糊和更改),此代碼將調用兩次change功能。我認爲你可以實現與某種標誌的這種行爲:

var executed = false; 
... 
$(document).on("change blur", "#yourelement", function(){ 
    if(!executed){ 
     executed = true; 
     //do your stuff 
    } 
}); 
+0

HM。試試這個。 thx到目前爲止 – frequent 2012-07-05 14:31:17

+0

國際海事組織,如果你做了這個改變,模糊仍然可以被稱爲自改變仍然宣佈。更改可以由自身和模糊功能觸發。 – Melanie 2012-07-05 14:32:41

+0

@Melanie,你完全正確 – Vithozor 2012-07-05 14:34:29

2

不知道的ipad,但瀏覽器也許是這樣的

$("#dataTable tbody").on("click blur", "tr", function(event){ 
     if (event.type == "click") 
     { 
     //do stuff 
     } 
     else 
     { 
     //do nothing 
     } 
}); 
+0

也是一個好主意。讓我們來看看 – frequent 2012-07-05 14:33:33

-4

您可以綁定到在多個事件同時:

$(document).on('blur change','#mySelector',function(){ 
    // this is called on either 
}); 
+0

但是,如果你已經改變了元素並且同時模糊了元素,那麼兩者都會觸發並且該函數將會運行兩次,而這往往不是你想要的。 – KyleFarris 2013-11-26 16:34:16

0

附加多個事件,你可以使用它像這樣也

<select class="form-control" id="Category" name="Category" required> 
    <option value="">Choose an option</option> 
    <option value="1">Your Text</option> 
</select> 
<p class=""></p> 

$("#Category").on("blur change", function(event) { 
    if($(this).val()===""){ 
      $(this).next().text("Please choose category").css("color","#a94442"); 
     } 
     else 
     { 
      $(this).next().text(""); 
     } 

}); 
相關問題