r2079 - in trunk: tests/unit/tabs ui

r2079 - in trunk: tests/unit/tabs ui


Author: klaus.hartl
Date: Fri Feb 13 15:05:16 2009
New Revision: 2079
Modified:
trunk/tests/unit/tabs/tabs_methods.js
trunk/ui/ui.tabs.js
Log:
Tabs: mouseover/focus handling for added tabs, plus test, fixes #4097 as
well as focus/blur handling when using keyboard
Modified: trunk/tests/unit/tabs/tabs_methods.js
==============================================================================
--- trunk/tests/unit/tabs/tabs_methods.js    (original)
+++ trunk/tests/unit/tabs/tabs_methods.js    Fri Feb 13 15:05:16 2009
@@ -43,6 +43,18 @@
});
test('add', function() {
+    expect(3);
+    
+    el = $('#tabs1').tabs();
+    el.tabs('add', "#new", 'New');
+
+    var added = $('li:last', el).simulate('mouseover');
+    ok(added.is('.ui-state-hover'), 'should add mouseover handler to added
tab');
+    added.simulate('mouseout');
+    var other = $('li:first', el).simulate('mouseover');
+    ok(other.is('.ui-state-hover'), 'should not remove mouseover handler from
existing tab');
+    other.simulate('mouseout');
+    
    ok(false, "missing test - untested code is broken code.");
});
Modified: trunk/ui/ui.tabs.js
==============================================================================
--- trunk/ui/ui.tabs.js    (original)
+++ trunk/ui/ui.tabs.js    Fri Feb 13 15:05:16 2009
@@ -172,20 +172,6 @@
                else onShow();
            }
-            // states
-            if (o.event != 'mouseover') {
-                var handleState = function(state, el) {
-                    if (el.is(':not(.ui-state-disabled)')) el.toggleClass('ui-state-' +
state);
-                };
-                this.$lis.bind('mouseover.tabs mouseout.tabs', function() {
-                    handleState('hover', $(this));
-                });
-                // TODO focus/blur don't seem to work with namespace
-                this.$tabs.bind('focus.tabs blur.tabs', function() {
-                    handleState('focus', $(this).parents('li:first'));
-                });
-            }
-
            // clean up to avoid memory leaks in certain versions of IE 6
            $(window).bind('unload', function() {
                self.$lis.add(self.$tabs).unbind('.tabs');
@@ -194,9 +180,10 @@
        }
        // update selected after add/remove
-        else
+        else {
            o.selected = this.$lis.index(this.$lis.filter('.ui-tabs-selected'));
-
+        }
+        
        // update collapsible
        
this.element[o.collapsible ? 'addClass' : 'removeClass']('ui-tabs-collapsible');
        
@@ -210,6 +197,21 @@
        // reset cache if switching from cached to not cached
        if (o.cache === false) this.$tabs.removeData('cache.tabs');
+        // remove all handlers before, tabify may run on existing tabs after add
or option change
+        this.$lis.add(this.$tabs).unbind('.tabs');
+        
+        if (o.event != 'mouseover') {
+            var handleState = function(state, el) {
+                if (el.is(':not(.ui-state-disabled)')) el.toggleClass('ui-state-' +
state);
+            };
+            this.$lis.bind('mouseover.tabs mouseout.tabs', function() {
+                handleState('hover', $(this));
+            });
+            this.$tabs.bind('focus.tabs blur.tabs', function() {
+                handleState('focus', $(this).parents('li:first'));
+            });
+        }
+        
        // set up animations
        var hideFx, showFx;
        if (o.fx) {
@@ -264,7 +266,7 @@
        }
        // attach tab event handler, unbind to avoid duplicates from former
tabifying...
-        this.$tabs.unbind('.tabs').bind(o.event + '.tabs', function() {
+        this.$tabs.bind(o.event + '.tabs', function() {
            var $li = $(this).parents('li:eq(0)'),
                $hide = self.$panels.filter(':visible'),
                $show = $(self._sanitizeSelector(this.hash));