2013-04-15 42 views
2

在jQuery中,我試圖添加一個「提交」綁定到已經有一個「提交」綁定的表單,但我需要新的(第二個)綁定(回調)在預先存在的之前。在另一個綁定之前插入jQuery綁定

有沒有辦法讓我插入一個綁定,以便它在已經連接的綁定之前觸發?

回答

2

你可以使用$._data($("#myform")[0], "events").submit

參見click事件的樣品的jsfiddle:

http://jsfiddle.net/X9hat/

+0

+1。大提琴和偉大的答案。我的目的是防止其他綁定發射,但是當我從新插入的綁定中返回false時,我發現它並不妨礙其他操作。 (http://jsfiddle.net/X9hat/1/)你能告訴我,我必須做什麼來防止其他綁定? (我不想完全失去他們。新的第一次綁定應執行驗證檢查,然後確定其他人是否必須開火。) – JellicleCat

+0

我會看看我是否能儘快找到解決方案 –

+0

找到它。謝謝。我得到了回調,並且將原始綁定解除綁定:'。._ data($(「#pq-new-quoter」)[0],「events」).submit.pop()。handler;' – JellicleCat

1

觸發器中的第一個回調綁定到新的(二)結合:How to order events bound with jQuery

+0

好吧,我可以解除第一個回調,仍然有一個對該函數的引用,以便我可以將它綁定到新的回調函數? (原始的回調函數被封裝,所以我不能通過名稱來調用它。) – JellicleCat

+0

@JellicleCat,爲什麼解除綁定?只要不綁定第一個回調,直到您將其綁定到第二個綁定的回調中。 –

+0

我正在使用CDN中的第三方腳本,因此我無法更改原始綁定。 – JellicleCat

2

使用無法訪問綁定函數,假設您的表單的ID爲a,那麼您可以顛倒處理程序調用的順序,如下所示:

[].reverse.call($._data($('#a').get(0)).events.submit); 

Demonstration(點擊 「與JS運行」,打開控制檯,然後點擊 「點擊」 按鈕)

注意,這種結構是undocumented and without guarantee

請注意,這不是一個支持的公共接口;實際數據 結構可能從版本到版本不兼容。

所以真正的解決方案是更改第一個綁定代碼。

+0

Thx for usefull相關信息! –

+0

+1提醒大家$ ._ data()調用不保證 – DefyGravity

0

我知道這有點晚了,但jQuery exposed this in v1.7 and higher。我有一個會議,當我回來的時候,會變成一個工作的例子...如果我回來了....祝我好運。

#fiddle 這個逃跑的單擊事件,但你可以切換它與思想

HTML

從的jsfiddle

<form> 
    <p>before click</p> 
    <button type="button">start</button> 
</form> 

的JavaScript

重新發布的HTML重新發布的提交javascript from jsfiddle

var $elem = $("button"), //jqElementObject 
    elem=$elem[0], //html element object 
    eventNameKey="click", //name of the event we want to alter 
    eventHandlerKey="handler"; //jQuery private object reference to get the actual function ref 

$elem.click(function(ev){ 
    //this happens somewhere else, pretend we can't control it per your comments 
    console.log("1"); 
    ev.preventDefault(); 
    $("p").text($("p").text()+"<div>first binding</div>"); 
}); 
//this is ours, we can control this 
function submitControler(ev){ 
     console.log("2"); 
    ev.preventDefault(); 
    $("p").text($("p").text()+"<div>second binding</div>"); 
    //uncomment below to stop propogation 
    //return false; 
} 
$elem.click(submitControler); //actually register our event 
$elem.click(function(ev){ //third event for some fun 
ev.preventDefault(); 
    $("p").text($("p").text()+"<div>third binding</div>"); 
}); 

var officialEvents = $._data(elem,"events"), //jQuery official Private events 
    ourSubmitEvents = $.Callbacks("unique stopOnFalse"); //default Callbacks values promises to behave like a standard events list, however, you want your event to fire first, then others to proceed if it returns true. also, no duplicates just because. 

//I'm running out of time, so i went with a for loop. I wanted a way to find our event where the registration order was not guaranteed, feel free to go for something better 
for(var event = officialEvents[eventNameKey].length-1; event >-1; event--){ 
    if(officialEvents[eventNameKey][event][eventHandlerKey] ===submitControler){ 
     ourSubmitEvents.add(officialEvents[eventNameKey][event][eventHandlerKey]); 
     console.log("added primary controler"); 
     break; 
    } 
} 
//add in everyone else to our list, again, i'm out of time and a for loop was the first thought i had. feel free to improve 
for(var event = 0; event < officialEvents[eventNameKey].length; event++){ 
    if(officialEvents[eventNameKey][event][eventHandlerKey] !==submitControler){ 
     ourSubmitEvents.add(officialEvents[eventNameKey][event][eventHandlerKey]); 
     console.log("added secondary controler"); 
    } 
} 
//this is our event scheduler, it will be first to execute, and calls our manually re-ordered 'ourSubmitEvents' object. ('ourSubmitEvents' becomes 'ev.data') 
$elem.on({"click":function(ev){ 
    ev.preventDefault(); 
    ev.data.fire(ev); 
}},null,ourSubmitEvents); 
//remove the other events, except the one we just registered. 
$._data(elem,"events")[eventNameKey].splice(0,officialEvents[eventNameKey].length-1); 
+0

非常酷。請提供一個工作示例。 – JellicleCat

+0

也可以在下面使用@dystroy縮短回答。任何碰到$ ._ data()的東西都是唯一的出路,我使用$ .CallBacks()來組織事件後處理和更細粒度的控制 – DefyGravity