简体   繁体   中英

How to get the name of a jQuery UI widget?

I need a way to read the name of a jQuery UI widget. I have subclassed the dialog widget into two subclasses, myDialog1 and myDialog2 . I have created a destroyDialog function to destroy whichever dialog is active. There should be a way to determine the name of the widget instance.

What I want to do is something like this:

var destroyDialog = function() {
    activeDialog[activeDialog.widgetName]("destroy");
}

But I don't see a way to get the widget name. For now I'm using ugly nested try-catch statements.

var destroyDialog = function() {
        try {
            activeDialog.dialog("destroy");
        }
        catch (e) {
            try {
                activeDialog.myDialog1("destroy");
            }
            catch (e) {
                activeDialog.myDialog2("destroy");
            }
        }
    }

If you standardize your namespace you could use a regex to match the name of the variable where your widget instance is stored (the name of the widget), returned by the $().data() method.

for (i in $(<your element>).data() ) {
    if (i.match(/dialog/)) {
        $(<your element>).data(i).destroy();
    }
}

You can get the widget name (and use it) by using

activeDialog.data("widgetName");

... as tdmartin refers to. So therefore:

activeDialog[activeDialog.data("widgetName")]("destroy");

But to get around this problem personally, I have written a plugin that will allow you to call a widget method without knowing what type the widget is. This will allow you to do:

activeDialog.callWidgetMethod('destroy');

It relies on you using jQuery UI 1.11+. If you are using <1.11, you can take out the "Skip this widget if it does not have the method" check, but the downside of that is that you will get an error if you attempt to call a method that a widget does not have.

Plugin code :

jQuery.fn.callWidgetMethod = function () {
    var args = arguments;
    var result = null;
    if(!this || !this.length) 
        return this;

    this.each(function (i,o) {
        var compClass = $(this).data("widgetName");
        var func = $(this)[compClass];
        // Skip this element if it does not appear to be an initialised jQuery widget
        if(!compClass || !func)
            return true;

        // Skip this widget if it does not have the method (the name of which will be in args[0])
        // This relies on the 'instance' method provided in jQuery UI 1.11
        if(args.length>1 && !$(this)[compClass]("instance")[args[0]])
            return true;

        result = func.apply($(this),args);
    });

    if(this.length>1) 
        return this;
    else 
        return result;
};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM