Javascript jQueryUI-在不同小部件上使用相同名称调用方法

Javascript jQueryUI-在不同小部件上使用相同名称调用方法,javascript,jquery,jquery-ui,methods,widget,Javascript,Jquery,Jquery Ui,Methods,Widget,假设我创建了几个小部件(mywidget1、mywidget2等),并且它们都有一个同名的方法(doSomething)。 要调用我可以使用的方法,请执行以下操作: $("#elem").widget1("doSomething"); 但这样我需要知道小部件的名称(在示例widget1中)。 如果我有一个包含多个不同小部件实例的数组,如何在不知道小部件名称的情况下对每个小部件调用“doSomething”方法?你不能。您有两个选择: 将它们存储在单独的数组中(一个数组用于widget1,另

假设我创建了几个小部件(mywidget1、mywidget2等),并且它们都有一个同名的方法(doSomething)。
要调用我可以使用的方法,请执行以下操作:

$("#elem").widget1("doSomething");  
但这样我需要知道小部件的名称(在示例widget1中)。

如果我有一个包含多个不同小部件实例的数组,如何在不知道小部件名称的情况下对每个小部件调用“doSomething”方法?

你不能。您有两个选择:

  • 将它们存储在单独的数组中(一个数组用于widget1,另一个数组用于widget2),或者

  • 将对象存储在数组中,该数组包含与该条目相关的小部件的信息

  • 这里有一个#2的例子


    理论上,我想你可以做如下的事情:

    var widgets = [widget1, widget2, widget3]; // etc, will assume they are defined already
    
    // Access each Widget, now widget points to each of the widgets
    // So we dont need to know the actual name like widget1, widget2 etc
    widgets.forEach(function (widget) {
        $('#elem').widget('doSomething'); // Call the doSomething method of this widget
        $('#elem').widget.call(null, 'doSomething'); // Try this if the above fails
        $('#elem').call(widget, 'doSomething'); // Or maybe this :)
    }
    

    无论如何,试试上面的方法,我不确定哪一个会起作用。我认为您正在尝试的操作可能有点难以实现,如果它不起作用,那么很抱歉。希望它会:)

    您可以拥有一个函数对象并动态获取键值以使用特定函数

    widgets = {
        widget1 : function(value){return value;},
        widget2 : function(value){return value+1},
        widget3 : function(value){return value+2}
    }; //you can have your list of functions say widgets1,2,3....
    
    for(var k in widgets ){
      console.log(widgets[k](1));
    } //to get the function name you can use the key name in the object
    
    榜样

    如果知道该键,也可以调用该函数

    widgets['widget2'](10); //to directly call the function if you know the key
    
    要动态添加更多小部件,请使用

    function add_widget(name,widgetFunction){ //function to add widget
        widgets[name]=widgetFunction;
    }
    
    add_widget("widget4",function(value){return value+10;}); //adds a new widget to the widgets list
    

    我找到了这个解决方案:

    之前:

    var tmp = $("#elem").widget1();
    myarray[i] = tmp;
    
    现在:

    var tmp = $("#elem").widget1();
    myarray[i] = tmp.data(ui-widget1);
    
    通过这种方式,可以直接调用该方法:

    myarray[x].doSomething();
    
    你觉得怎么样?
    这是一个有效的解决方案吗

    多谢大家

    myarray[x].doSomething();