You can have an option of defining the closure function and using it in a way like described in this post
Apart from the above post I came across this situation and i used the following method to check if the event is already registered or not see below function where I needed to bind the click once only I used typeof $._data ( elementClose.get ( 0 ), 'events' ) === 'undefined'
to get the events registered with the element, $._data
is used to retrieve event handlers registered to an element/
this.closeButtonPreview = () => {
let elementClose = $("a.close-preview");
if (typeof $._data(elementClose.get(0), 'events') === 'undefined') {
elementClose.on('click', function(e) {
e.preventDefault();
let container = $(this).parent();
container.find('video').remove();
$("#overlay,.window").effect("explode", {}, 500);
});
}
return;
};
EDIT
Just to get the concept clear for you about the logic I used with $._data()
. i created an example below.
What i am doing is binding event click
to anchor with id=unique
inside the condition if (typeof $._data(uniqueBind.get(0), 'events') == 'undefined') {
which determines if an event is assigned to the element and binding the event click
to the anchor id=multi
outside the condition without checking binded events on the element.
What you have to do.
Initially the button unique
and multi
won't log anything to console, click on EVENT BINDER
once and then click on both unique
and mutli
they both will log text once in console
, but as you keep clicking on the EVENT BINDER
notice that clicking the multi
button will start logging the text as many times as you have clicked the EVENT BINDER
button but the unique
button will only log once no matter how many times you click on the EVENT BINDER
button.
$(document).ready(function() {
$('#binder').on('click', bindEvents);
$('#clear').on('click', function() {
console.clear();
})
});
function bindEvents() {
var uniqueBind = $('#unique-bind');
var multiBind = $('#multi-bind');
//will bind only once as many times you click on the EVENT BINDER BUTTON
//check if any event is assigned to the element
if (typeof $._data(uniqueBind.get(0), 'events') == 'undefined') {
uniqueBind.on('click', function() {
console.log('clicked unique bind');
});
}
//will log the text EVENT BINDER * TIMES_EVENT_BINDER_CLICKED button
multiBind.on('click', function() {
console.log('clicked multi bind');
});
}
body {
text-align: center;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
<a href="#." class="btn btn-success" id="binder">EVENT BINDER</a>
<a href="#." class="btn btn-success" id="clear">CLEAR CONSOLE</a>
<br /><br /><br /><br />
<a href="#." class="btn btn-info" id="unique-bind">UNIQUE</a>
<a href="#." class="btn btn-danger" id="multi-bind">MULTI</a>