SitePoint Sponsor

User Tag List

Results 1 to 7 of 7

Hybrid View

  1. #1
    SitePoint Member
    Join Date
    Feb 2007
    Posts
    4
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Alternative to using eval

    Hi There,

    I am fairly new to JavaScript and I am trying to use a floating menu that i got from simplythebest.net on a page layout for an ebay store. The problem is ebay does not allow the eval function to be used for security reasons. I have done many googles and racked my brain and cannot work out how i can remove this eval and replace it with somthing else. Any help would be muchly appreciated.

    Thanks alot.

    Code JavaScript:
    		// global reference to this object
    		this.gRef = "ypSlideOutMenu_"+id
    		eval(this.gRef+"=this")
     
    		// add this menu object to an internal list of all menus
    		ypSlideOutMenu.Registry[id] = this

  2. #2
    SitePoint Guru
    Join Date
    Apr 2006
    Posts
    802
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    window["ypSlideOutMenu_"+id] will reference the global variable with that identifier.

  3. #3
    SitePoint Member
    Join Date
    Feb 2007
    Posts
    4
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank you so much for your quick responce Mrhoo, unfortunatly i still cant get it to work. when i open it in internet explorer the javascript error states.

    Error: 'ypSlideOutMenu_menu1' is undefined.

    I will paste the complete code here:

    Code JavaScript:
    ypSlideOutMenu.Registry = []
    ypSlideOutMenu.aniLen = 250
    ypSlideOutMenu.hideDelay = 1000
    ypSlideOutMenu.minCPUResolution = 10
     
    // constructor
    function ypSlideOutMenu(id, dir, left, top, width, height)
    {
    	this.ie  = document.all ? 1 : 0
    	this.ns4 = document.layers ? 1 : 0
    	this.dom = document.getElementById ? 1 : 0
     
    	if (this.ie || this.ns4 || this.dom) {
    		this.id			 = id
    		this.dir		 = dir
    		this.orientation = dir == "left" || dir == "right" ? "h" : "v"
    		this.dirType	 = dir == "right" || dir == "down" ? "-" : "+"
    		this.dim		 = this.orientation == "h" ? width : height
    		this.hideTimer	 = false
    		this.aniTimer	 = false
    		this.open		 = false
    		this.over		 = false
    		this.startTime	 = 0
     
    		// global reference to this object
    		this.gRef = "ypSlideOutMenu_"+id
    //		window["ypSlideOutMenu_"+id]
    		eval(this.gRef+"=this")
    		this.gRef = this
     
    		// add this menu object to an internal list of all menus
    		ypSlideOutMenu.Registry[id] = this.gRef
     
    		var d = document
    		d.write('<style type="text/css">')
    		d.write('#' + this.id + 'Container { visibility:hidden; ')
    		d.write('left:' + left + 'px; ')
    		d.write('top:' + top + 'px; ')
    		d.write('overflow:hidden; }')
    		d.write('#' + this.id + 'Container, #' + this.id + 'Content { position:absolute; ')
    		d.write('width:' + width + 'px; ')
    		d.write('height:' + height + 'px; ')
    		d.write('clip:rect(0 ' + width + ' ' + height + ' 0); ')
    		d.write('}')
    		d.write('</style>')
     
    		this.load()
    	}
    }
     
    ypSlideOutMenu.prototype.load = function() {
    	var d = document
    	var lyrId1 = this.id + "Container"
    	var lyrId2 = this.id + "Content"
    	var obj1 = this.dom ? d.getElementById(lyrId1) : this.ie ? d.all[lyrId1] : d.layers[lyrId1]
    	if (obj1) var obj2 = this.ns4 ? obj1.layers[lyrId2] : this.ie ? d.all[lyrId2] : d.getElementById(lyrId2)
    	var temp
     
    	if (!obj1 || !obj2) window.setTimeout(this.gRef + ".load()", 100)
    	else {
    		this.container	= obj1
    		this.menu		= obj2
    		this.style		= this.ns4 ? this.menu : this.menu.style
    		this.homePos	= eval("0" + this.dirType + this.dim)
    		this.outPos		= 0
    		this.accelConst	= (this.outPos - this.homePos) / ypSlideOutMenu.aniLen / ypSlideOutMenu.aniLen 
     
    		// set event handlers.
    		if (this.ns4) this.menu.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
    		this.menu.onmouseover = new Function("ypSlideOutMenu.showMenu('" + this.id + "')")
    		this.menu.onmouseout = new Function("ypSlideOutMenu.hideMenu('" + this.id + "')")
     
    		//set initial state
    		this.endSlide()
    	}
    }
     
    ypSlideOutMenu.showMenu = function(id)
    {
    	window.status = id
    	var reg = ypSlideOutMenu.Registry
    	var obj = ypSlideOutMenu.Registry[id]
     
    	if (obj.container) {
    		obj.over = true
     
    		// close other menus.
    		for (menu in reg) if (id != menu) ypSlideOutMenu.hide(menu)
     
    		// if this menu is scheduled to close, cancel it.
    		if (obj.hideTimer) { reg[id].hideTimer = window.clearTimeout(reg[id].hideTimer) }
     
    		// if this menu is closed, open it.
    		if (!obj.open && !obj.aniTimer) reg[id].startSlide(true)
    	}
    }
     
    ypSlideOutMenu.hideMenu = function(id)
    {
    	// schedules the menu to close after <hideDelay> ms, which
    	// gives the user time to cancel the action if they accidentally moused out
    	var obj = ypSlideOutMenu.Registry[id]
    	if (obj.container) {
    		if (obj.hideTimer) window.clearTimeout(obj.hideTimer)
    		obj.hideTimer = window.setTimeout("ypSlideOutMenu.hide('" + id + "')", ypSlideOutMenu.hideDelay);
    	}
    }
     
    ypSlideOutMenu.hide = function(id)
    {
    	var obj = ypSlideOutMenu.Registry[id]
    	obj.over = false
     
    	if (obj.hideTimer) window.clearTimeout(obj.hideTimer)
     
    	// flag that this scheduled event has occured.
    	obj.hideTimer = 0
     
    	// if this menu is open, close it.
    	if (obj.open && !obj.aniTimer) obj.startSlide(false)
    }
     
    ypSlideOutMenu.prototype.startSlide = function(open) {
    	this.open = open
    	if (open) this.setVisibility(true)
    	this.startTime = (new Date()).getTime()	
    	this.aniTimer = window.setInterval(this.gRef + ".slide()", ypSlideOutMenu.minCPUResolution)
    }
     
    ypSlideOutMenu.prototype.slide = function() {
    	var elapsed = (new Date()).getTime() - this.startTime
    	if (elapsed > ypSlideOutMenu.aniLen) this.endSlide()
    	else {
    		var d = Math.round(Math.pow(ypSlideOutMenu.aniLen-elapsed, 2) * this.accelConst)
    		if (this.open && this.dirType == "-")		d = -d
    		else if (this.open && this.dirType == "+")	d = -d
    		else if (!this.open && this.dirType == "-")	d = -this.dim + d
    		else										d = this.dim + d
     
    		this.moveTo(d)
    	}
    }
     
    ypSlideOutMenu.prototype.endSlide = function() {
    	this.aniTimer = window.clearTimeout(this.aniTimer)
    	this.moveTo(this.open ? this.outPos : this.homePos)
    	if (!this.open) this.setVisibility(false)
    	if ((this.open && !this.over) || (!this.open && this.over)) {
    		this.startSlide(this.over)
    	}
    }
     
    ypSlideOutMenu.prototype.setVisibility = function(bShow) { 
    	var s = this.ns4 ? this.container : this.container.style
    	s.visibility = bShow ? "visible" : "hidden"
    }
    ypSlideOutMenu.prototype.moveTo = function(p) { 
    	this.style[this.orientation == "h" ? "left" : "top"] = p
    }
    ypSlideOutMenu.prototype.getPos = function(c) {
    	return parseInt(this.style[c])
    }

  4. #4
    Programming Since 1978 silver trophybronze trophy felgall's Avatar
    Join Date
    Sep 2005
    Location
    Sydney, NSW, Australia
    Posts
    16,875
    Mentioned
    25 Post(s)
    Tagged
    1 Thread(s)
    Perhaps:

    this[gref]=this;
    Stephen J Chapman

    javascriptexample.net, Book Reviews, follow me on Twitter
    HTML Help, CSS Help, JavaScript Help, PHP/mySQL Help, blog
    <input name="html5" type="text" required pattern="^$">

  5. #5
    SitePoint Member
    Join Date
    Feb 2007
    Posts
    4
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Thank for you reply felgell,

    but alas this does not work either. Internet explorer reports:

    Error: 'container' is null or not and object.

    Thanks heaps for posting though.

  6. #6
    SitePoint Member
    Join Date
    Feb 2007
    Posts
    4
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Ok so I have now got this to work. Being the Javascript novice that I am I did not know how to properly use Mrhoo's advice. This is what is now working.
    Code JavaScript:
    		// global reference to this object
    		this.gRef = "ypSlideOutMenu_"+id
    		window["ypSlideOutMenu_"+id] = this

    Unfortunatly there is another eval in the code that i cannot seem to get rid of. Wish i knew more about javascript. I will post the code here and hopfully some nice person like Mrhoo will give me some advice. Please dont think that i havent done searches and pulled my hair out already. I am posting as a last resort. Thanks alot.

    Code JavaScript:
    ypSlideOutMenu.prototype.load = function() {
    	var d = document
    	var lyrId1 = this.id + "Container"
    	var lyrId2 = this.id + "Content"
    	var obj1 = this.dom ? d.getElementById(lyrId1) : this.ie ? d.all[lyrId1] : d.layers[lyrId1]
    	if (obj1) var obj2 = this.ns4 ? obj1.layers[lyrId2] : this.ie ? d.all[lyrId2] : d.getElementById(lyrId2)
    	var temp
     
    	if (!obj1 || !obj2) window.setTimeout(this.gRef + ".load()", 100)
    	else {
    		this.container	= obj1
    		this.menu		= obj2
    		this.style		= this.ns4 ? this.menu : this.menu.style
    		// this is the code i am having problems removing.
    		this.homePos	= eval("0" + this.dirType + this.dim)
    		// end problem code
    		this.outPos		= 0
    		this.accelConst	= (this.outPos - this.homePos) / ypSlideOutMenu.aniLen / ypSlideOutMenu.aniLen 
     
    		// set event handlers.
    		if (this.ns4) this.menu.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
    		this.menu.onmouseover = new Function("ypSlideOutMenu.showMenu('" + this.id + "')")
    		this.menu.onmouseout = new Function("ypSlideOutMenu.hideMenu('" + this.id + "')")
     
    		//set initial state
    		this.endSlide()
    	}
    }

  7. #7
    SitePoint Enthusiast
    Join Date
    Jul 2006
    Location
    Leeds, UK
    Posts
    38
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    I can't see from your code what this.dirType and this.dim should be, but my guess would be you should replace;

    this.homePos = eval("0" + this.dirType + this.dim)
    with
    this.homePos = window["0" + this.dirType + this.dim]


Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •