I've tried the context approach as well with the same result:

(function($) {

        $.widget("ui.mywidget", {

                _init: function() {
                        // init code for mywidget
                        // can use this.options
                        if (this.options.makered) {
                                // and this.element
                                this.element.css("background-color",
"red");
                        }

                        var self = this;
                        $("div", self.element.get(0)).live("click",
function() {
                                self.fire();
                        });
                },

                _doSomething: function() {
                        // internal functions should be named begin
with an underscore
                        // manipulate the widget
                },

                value: function() {
                        // calculate some value and return it
                        return this._calculate();
                },

                length: function() {
                        return this._someOtherValue();
                },

                destroy: function() {
                        $.widget.prototype.apply(this, arguments); //
default destroy
                        // now do other stuff particular to this
widget
                },

                fire: function() {
                        this._trigger('onfire', null, { val: this });
                }

        });

        $.extend($.ui.mywidget, {
                getter: "value length",
                defaults: {
                        option1: "defaultValue",
                        makered: true
                }
        });

})(jQuery);

In my example, if the DIVs inside the container of the widget
constantly change (added/removed), how would one use the live() method
for event delegation if one cannot use it within one's widget. I've
resorted to creating a single click event handler that inspects the
event target to determine the appropriate action.

On Sep 23, 3:32 pm, Scott González <[email protected]> wrote:
> You're using .live() wrong, this actually has nothing to do with the
> widget factory. You're creating a separate live event handler for
> every single instance of your plugin, which completely defeats the
> purpose of using event delegation.
>
> On Sep 22, 9:50 am, Neil Craig <[email protected]> wrote:
>
> > Take the following example:
>
> > (function($) {
>
> >         $.widget("ui.mywidget", {
>
> >                 _init: function() {
> >                         // init code for mywidget
> >                         // can use this.options
> >                         if (this.options.makered) {
> >                                 // and this.element
> >                                 this.element.css("background-color", "red");
> >                         }
>
> >                         var self = this;
> >                         self.element.find("div").live("click", function() {
> >                                 self.fire();
> >                         });
> >                 },
>
> >                 _doSomething: function() {
> >                         // internal functions should be named begin with an 
> > underscore
> >                         // manipulate the widget
> >                 },
>
> >                 value: function() {
> >                         // calculate some value and return it
> >                         return this._calculate();
> >                 },
>
> >                 length: function() {
> >                         return this._someOtherValue();
> >                 },
>
> >                 destroy: function() {
> >                         $.widget.prototype.apply(this, arguments); // 
> > default destroy
> >                         // now do other stuff particular to this widget
> >                 },
>
> >                 fire: function() {
> >                         this._trigger('onfire', null, { val: this });
> >                 }
>
> >         });
>
> >         $.extend($.ui.mywidget, {
> >                 getter: "value length",
> >                 defaults: {
> >                         option1: "defaultValue",
> >                         makered: true
> >                 }
> >         });
>
> > })(jQuery);
>
> > And here is the HTML:
>
> > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
> > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
>
> > <html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en"
> > dir="ltr">
> >     <head>
> >         <title>jQuery UI - Widget Factory Test</title>
> >                 <script type="text/javascript" language="javascript" 
> > src="Script/
> > jquery-1.3.2.min.js"></script>
> >                 <script type="text/javascript" language="javascript" 
> > src="Script/
> > jquery-ui-1.7.1.custom.js"></script>
> >                 <script type="text/javascript" language="javascript" 
> > src="Script/
> > testwidget.js"></script>
> >                 <script type="text/javascript">
> >                         $(function() {
>
> >                                 $("#el1").mywidget({
> >                                         onfire: function() { alert("el1 
> > fired up"); }
> >                                 });
>
> >                                 $("#el2").mywidget({
> >                                         onfire: function() { alert("el2 
> > fired up"); }
> >                                 });
>
> >                                 $("#el1").bind("mywidgetonfire", function() 
> > {
> >                                         alert("post init event on el1");
> >                                 });
>
> >                         });
> >                 </script>
> >     </head>
> >     <body>
> >         <form id="form1" action="">
> >                         <div id="el1" style="margin:2px; 
> > padding:2px;">Element #1 <div
> > style="margin:2px; border:solid 1px #000; background-
> > color:yellow;">Fire it up!</div></div>
> >                         <div id="el2" style="margin:2px; 
> > padding:2px;">Element #2 <div
> > style="margin:2px; border:solid 1px #000; background-
> > color:yellow;">Fire it up!</div></div>
> >                 </form>
> >     </body>
> > </html>
>
> > All the 'onfire' event handlers get called for all instances of the
> > widget. Replacing it with the bind method, only the applicable
> > widget's 'onfire' event handlers get called.
>
> > On Sep 22, 3:30 pm, Scott González <[email protected]> wrote:
>
> > > Can you please provide a little more detail here? I'm really not sure
> > > what you're talking about.
>
> > > On Sep 21, 5:43 am, Neil Craig <[email protected]> wrote:
>
> > > > I develop a lot of widgets using the jQuery UI widget factory, and
> > > > noticed that one should not use the "live" methods for handling
> > > > events. It is best one handle the event delegation oneself to avoid
> > > > problems like having similar events attached to other instances of the
> > > > same widget when it should only fire on the applicable widget or not
> > > > firing at all.
>
> > > > Don't know if anyone came across the same issues? Could make for an
> > > > interesting discussion.....
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jQuery UI" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/jquery-ui?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to