2012-08-12 89 views
1

我需要使用綁定click事件到DOM中的一個元素,同時能夠傳遞參數,包括事件對象。我現在的腳本使用下列內容:將參數傳遞給jQuery .click WHILST保留事件參數

var counter = 1; 
$(".dynamo_user_info .dynamo_awards").each(function(){ 
    $(this).find("~ div a").each(function(){ 
     var id = $(this).attr("rel").split("aid-")[1]; 
     $(this).attr("id","dynamo_award-"+counter+"-"+id).bind('click',{c:counter,i:id},function(e){ 
      e.returnValue = e.preventDefault && e.preventDefault() ? false : false; 
      dynamo.awards.tooltip.ini(c,i); 
     }); 
    }); 
    counter++; 
}); 

現在,你可以看到,在每次迭代counter增加,id不持有靜態值。每次迭代後,最終值爲:counter = 4id = 2。現在只要點擊這些元素中的一個,就會根據需要preventDefaults,然後運行dynamo.awards.tooltip.ini(c,i);

但是,這不符合預期。相反,它的運行:

dynamo.awards.tooltip.ini(1,1); dynamo.awards.tooltip.ini(2,6);

等(例如),它,而不是運行:

dynamo.awards.tooltip.ini(4,2); dynamo.awards.tooltip.ini(4,2);

即它使用counterid上次存儲的值。我的猜測是,這是由於bind如何工作,傳遞參數元素被點擊,而不是之前。我不知道如何解決這個問題,除非我能以某種方式欺騙函數的範圍?

+2

*儘管!*啊,英文。 ':'' – 2012-08-12 22:14:53

+0

您需要了解[閉包範圍](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)。 (另見[Bonsai!](http://bonsaiden.github.com/JavaScript-Garden/#function.closures)和枯燥的舊版[MDN](https://developer.mozilla.org/en-US/docs/) JavaScript /指南/閉包)) – 2012-08-12 22:17:32

+0

就像一個側面說明,這條線似乎是多餘的:'e.returnValue = e.preventDefault && e.preventDefault()? false:false;' – ahren 2012-08-12 22:27:39

回答

2

的參數是通過event.data對象訪問,像

dynamo.awards.tooltip.ini(e.data.c, e.data.i); 

http://api.jquery.com/bind/#passing-event-data

+0

似乎似乎合理(從來沒有這樣做過)。 – 2012-08-12 22:21:06

+0

完美的作品:)。 – 2012-08-12 22:53:30