2011-07-27 137 views
0

我第一次做我自己的功能$.fn.testing = function(){....};防止功能執行兩次

但我有一個問題,我無法解決。接下來的情況是不聰明,但它可能會發生,所以這就是爲什麼我想解決這個問題,使用戶不必原因:

$('.target').testing("message" : "Hello!"); 
$('#test .target').testing("message" : "Hello world!"); 

功能將使「消息」彈出。因此,用戶想要的是,每.target必須有一個帶有「你好!」的彈出框。如果這個.target也有一個ID爲#test那麼它應該彈出:「Hello world!」。但問題是,現在腳本會彈出「你好!」和「你好世界!」當.target#test被觸發時。

所以我想在我的功能是,函數看看函數是否已經在這個對象上調用,如果它是前.unbind()然後繼續添加函數。

我該如何做到這一點?希望我的解釋足夠清楚!

(上面的例子是簡化了一點點,所以請不要在使用它的評論)

幫助表示讚賞!

回答

2

這裏是我會怎麼做:

var _myFunction = function() { 
    alert($(this).data("message")); 
}; 

的插件,做這樣的事情

jQuery.fn.testing = function(msg) { 
    this 
     .data("message", msg) 
     .unbind('click', _myFunction) 
     .bind('click', _myFunction); 
}; 

編輯:這裏在jsfiddle

中是一個例子
+0

感謝您的努力!這確實會有訣竅! – Milaan

+0

你好,歡迎幫助(: – dugokontov

1

你可以這樣做:

$('.target#test').testing("message" : "Hello world!"); 
$('.target:not(#test)').testing("message" : "Hello!"); 

編輯 - 你的意思是這樣?

$('.target').testing(function(e){ 
    if (this.id === 'event'){ 
     alert('hello world'); 
    }else{ 
     alert('hello'); 
    } 
}); 
+0

確實非常有幫助,但用戶必須指定它。函數內部是否有這樣的方法? – Milaan

+0

我編輯了主帖,看看代碼位,你現在怎麼實現它?謝謝你的回答,如果沒有可能的方法來實現這個功能,那麼我會用這個!謝謝! – Milaan

+0

你能提供一個更詳細的例子嗎?就像向我們展示你的函數的代碼一樣,否則我們無法正確理解你正在努力實現的目標。也許在jsfiddle.net上發佈一個例子 –

0

試試這個

var $this. msg; 
$('.target').each(function(){ 
    $this = $(this); 

    if((#this.attr("id) != "#test") || ($this.find("#test").length == 0))//here check for all the possible ids you want){ 
     msg = "message" : "Hello world!"; 
    } 
    else{ 
     msg = "message" : "Hello!"; 
    } 
    $this.testing(msg); 
}); 
+0

確實可行,但我希望它發生在函數本身內部。這只是一個簡單的例子,但如果它變得更高級,你可能需要使用類似於''('。target')。filter(「:not(#test#test1#test2#test3#test4#test5 #test6#test7 #test8#test9#test10 etc)「)。testing(」message「:」Hello!「); '我編輯了主帖,看看代碼位,你現在怎麼實現它?感謝您的答覆btw! – Milaan

+0

請檢查我編輯的答案,希望這有助於。 – ShankarSangoli

+0

謝謝,如果'id'是'$(this)'的孩子,它確實會有所幫助,但它不會。我在這個問題上並不確切,對此抱歉。但我已經想像出來了。謝謝你的幫助! – Milaan

0

據我瞭解:比如你對目標附加到目標元素的彈出現在的彈出框是孩子的目標,也可以是你可以有否則執行。我的觀點是,無論何時調用函數,它都會檢查彈出窗口是否插入到DOM中。如果它是第一個,它會刪除該彈出框,然後插入一個新的消息。

我的意思是像...

function() { 
     //if a pop is present 
     $('.popup').remove(); 

     var msg = $(this).attr('title'); //for example 
     var popup = "html containin msg..."; 
     $(this).append(popup); 
    } 
+0

謝謝你的幫助!但我已經擁有了它。感謝您的幫助,雖然 – Milaan

0

不知道這是否是正確的做法,但我自己想出了它。這很簡單,只需在你自己的功能開始時加上$(this).unbind()即可。它將刪除所有以前添加的功能,並繼續添加當前的功能。我曾嘗試過,但有一個額外的選擇器:$(this).unbind(".testing"),由於某種原因沒有工作,但現在我有它的工作。

感謝您的答案和你的幫助!真的很感激它!