jQuery检测附加的小部件

I have a web application with a medium amount of ajax requests.

I load all jquery and jquery widgets on head then i load my base.js before close body tag.

function baseScripts() {
        $(".open-dialog").click(function (event) {
            event.preventDefault();
            event.stopPropagation();        
            alert("Opening dialog");        
            href = $().buildUrl($(this).attr("href"), "&isAjax=true");        
            $().createDialog(href, "Window Title");        
            return false;
        });

        $("input:hidden.select").each(function () {
                var element = $(this);            
                if (!($("#s2id_" + element.attr("id")).length)) {
                    $(element).select2({
                        // select2 properties...
                    });
                }
            });
        }
}

SCRIPT BLOCK TO LOAD BASE SCRIPTS ON EVERY AJAX REQUEST

$(document).ajaxComplete(baseScripts);

The problem is after every ajax request the base scripts its called again and them opening dialog multiple times and attaching select2 multiples times too.

How i can detect if widget is already attached into element or class? Execute scripts on every ajax request (like i did) its a bad pratice?

It doesn't make sense that you will want to re-bind the click event and select2 on ajaxComplete. They should be a one-time binding, in which case, you can just do:

$(document).ready(function(){
    baseScripts();

    function baseScripts() {
        $(".open-dialog").click(function (event) {
            event.preventDefault();
            event.stopPropagation();

            alert("Opening dialog");

            href = $().buildUrl($(this).attr("href"), "&isAjax=true");

            $().createDialog(href, "Window Title");

            return false;
        });

        $("input:hidden.select").each(function () {
            var element = $(this);

            if (!($("#s2id_" + element.attr("id")).length)) {
                $(element).select2({
                    // select2 properties...
                });
            }
        });
    } 
});