2013-02-12 77 views
1

有一些類似的問題,但它們都是關於原生jQuery回調函數的。用戶定義的回調函數在Javascript/jQuery中被多次觸發

所以我有這個代碼(生活)創建一個div包含一些表單元素。 這些元素的值應該在刪除div(之前)時在回調函數中檢索。

function popup(callback) { 
    // ... 
    // before removing the div 
    callback.call(); 

    // remove div 
} 

出乎意料的是,回調函數在第一次執行彈出窗口後被激發多次(越來越多)。

我簡化了代碼,這裏是fiddle

+1

這是因爲每當'popup'執行時都綁定一個新的事件處理函數。 – 2013-02-12 11:03:40

回答

1

我希望這是你所需要的。

function popup(callback) { 
    $("body").append('<div><span id="test">test</span> <a href="#" id="close">close</a></div>'); 
    $(document).on("click", "#close", function() { 
     callback.call(); 

     // 
     //callback = function() {}; 
     $(document).off("click", "#close"); 
     $("div").remove(); 

    }); 
}; 

$(document).on("click", "#open", function() { 
    popup(function() { 
     alert('$("#test").length = ' + $("#test").length); 
    }); 
}); 

基本上,你需要通過調用關閉()方法來刪除事件處理程序。

+0

就是這樣。非常感謝你。 – user1643156 2013-02-12 11:13:51

0

嘗試動態生成元素而不是使用字符串。這將使您可以更輕鬆地綁定事件。

function popup(callback) 
{ var $elem = $("<div></div>"); 
    $elem.append($("<span></span>").html("test")); 
    $elem.append(" "); 
    $elem.append($("<a></a>").html("close").attr("href", "#")); 

    $("body").append($elem); 
    $elem.find("a").click(function() { 
     callback.call(); 
     $elem.remove(); 
    }); 
}; 

$(document).on("click", "#open", function() { 
    popup(function() { 
     alert('$("#test").length = ' + $("#test").length); 
    }); 
}); 

例子:http://jsfiddle.net/4se7M/2/

+0

對不起,但你的小提琴一直返回0,應該是1代替。 – user1643156 2013-02-12 11:27:02

0

我不知道確切的情況,但爲什麼每次顯示彈出窗口時都要綁定和解除綁定事件?

你只能綁定一次,像這樣,不是嗎?

$(document).on("click", "#close", function() { 
    alert('$("#test").length = ' + $("#test").length); 
    $("div").remove(); 
}); 

function popup() { 
    $("body").append('<div><span id="test">test</span> <a href="#" id="close">close</a></div>'); 
}; 

$(document).on("click", "#open", function() { 
    popup(); 
}); 
+0

在實際代碼中,popup在另一個函數中被調用,還有一些其他值需要傳遞給函數popup。當彈出窗口關閉時,有一些生成的數據需要傳回並處理。所以它不能那麼簡單。無論如何,我已經從靈魂行者那裏得到了答案。 – user1643156 2013-02-12 11:23:28