What am I doing wrong here? I'm super frustrated here. I'm stuck @ when I call Menu.mouseHandler and since it's being passed an argument it seems to lose its value of this?
Code: http://jsfiddle.net/W6KsU/19/
var Menu = Menu || {};
Menu = {
docHeight: jQuery("document").height(),
menuOffset: jQuery("#menu").offset(),
index:0,
menuItem:"",
menuItemName:"",
menuItemPure:"",
killMenu: function () {
jQuery.each(['#menuApplyForCredit', '#menuBuyOrLease', '#menuVehicleProtection', '#menuCommercialFinancing', '#menuFinanceTools'], function () {
jQuery(menuItem).unbind("mouseenter mouseleave", function () {
console.log("NO CLICK! DO NOTHING~");
});
});
},
initialize: function () {
if (jQuery.browser.ios) {
jQuery.each(['#menuApplyForCredit', '#menuBuyOrLease', '#menuVehicleProtection', '#menuCommercialFinancing', '#menuFinanceTools'], this.touchHandler);
} else {
jQuery.each(['#menuApplyForCredit', '#menuBuyOrLease', '#menuVehicleProtection', '#menuCommercialFinancing', '#menuFinanceTools'], this.mouseHandler);
}
},
touchHandler: function (i, v) {
var _that = this,
this.index = i;
this.menuItem = v;
this.menuItemPure = menuItem.replace('#menu', '');
jQuery(menuItem).bind("touchstart touchend", _that.onTouch);
},
mouseHandler: function (i, v) {
this.index = i;
this.menuItem = v;
console.log("mouseHandler: menuItem= "+this.menuItem);
this.menuItemName = jQuery(this.menuItem).find("a:first img").attr("src");
this.menuItemPure = this.menuItem.replace('#menu', '');
console.log("menuItemName=" + this.menuItemName);
console.log("menuItemPure=" + this.menuItemPure);
jQuery(this.menuItem).bind("mouseenter", Menu.onEnter);
//console.log(jQuery(this.menuItem).bind("mouseenter", Menu.onEnter))
//jQuery(this.menuItem).bind("mouseenter", jQuery.proxy(Menu.onEnter, Menu));
jQuery(this.menuItem).bind("mouseleave", jQuery.proxy(Menu.onLeave, Menu));
},
onEnter: function () {
console.log("CALLED!");
//console.log("evt= "+this);
//console.log("this= "+this);
//console.log("onEnter menuItem= " + menuItem);
jQuery('#menu_overlay').clearQueue().stop().css({
'display': 'block'
}).animate({
opacity: '.3'
}, 200).height(this.docHeight);
//console.log("onEnter menuItemPure= "+ menuItemPure);
jQuery("#megaMenu" + menuItemPure + "Div").addClass("hovering");
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + "Over.png").css({
"z-index": "99"
});
},
onLeave: function () {
var _that = this;
console.log("onLeave= "+ menuItem);
var relX = Math.round(evt.pageX - this.menuOffset.left),
relY = evt.pageY - this.offsetTop;
if ((relX < 960 && relX > 0) && (relY < 41 && relY > 0)) {
jQuery("#megaMenu" + menuItemPure + "Div").removeClass("hovering");
if (menuItemName.indexOf("Stay") > -1) {
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + "Stay.png").css({
"z-index": "1"
});
} else {
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + ".png").css({
"z-index": "1"
});
}
} else {
jQuery('#menu_overlay').css({
'display': 'none'
}).animate({
opacity: '0'
}, 100);
jQuery("#megaMenu" + menuItemPure + "Div").removeClass("hovering");
if (menuItemName.indexOf("Stay") > -1) {
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + "Stay.png").css({
"z-index": "1"
});
} else {
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + ".png").css({
"z-index": "1"
});
}
}
},
onTouch: function () {
jQuery('#menu_overlay').clearQueue().stop().hide().css({
'display': 'block'
}).animate({
opacity: '.3'
}, 200).height(this.docHeight);
jQuery("#megaMenu" + menuItemPure + "Div").removeClass("hovering").addClass("hovering");
jQuery(menuItem).find("a:first").find("img").attr("src", "images/bttn" + menuItemPure + "Over.png").css({
'z-index': '99'
});
}
}
Menu.initialize();
touchHandler,var _that = this,<- terminate with semicolon.thisinmouseHandler? Those properties are just being reassigned on each iteration / invocation of the callback.mouseenter/mouseleaveinmouseHandler, those listeners are being bound to the DOM elements that your selectors (thevargument tomouseHandler) refer to. If you're trying to make surethisrefers toMenuinonEnter/onLeave, usejQuery.proxy, which I see you're already doing in one place. If you wantthisto refer toMenuinmouseHandler, see my answer.