i have eval function, which needs to execute javascript from php. but i need to pass element, so i can put mouse over tips on the link user clicked on.
var globalEval = function globalEval(src, element) {
if (window.execScript) {
window.execScript(src);
return;
}
var fn = function(element) {
window.eval.call(window,src);
};
fn(element);
};
im using following way to pass $(this)
element
globalEval(js_code, $(this));
// js_code is = alert(element);
i get error of undefined element, which is defined in globalEval();
how can i fix this?
This is a scoping issue as the global eval isn't invoking the code in the same scope as the variable element
. If you must use eval
even though eval is evil, you'll have to do it in a way that lets you invoke your code in the environment you want. One way to do this is to wrap it as an anonymous function which you give parameters for the environment variables of choice.
For example
window.eval.call(window,'(function (element) {'+src+'})')(element);
This means the src
string is parsed but not invoked by the eval
as it returns an anonymous function. You then invoke it, passing your data, in this case element
.
Test it with var element = document.body, src = 'console.log(element.tagName)';
and you'll see it log "BODY"
. Please note that if you want to set global variables (or functions) this way they have to be stated as global explicitly (window.foobar = ...
) or they will be GCd after the anonymous function finishes.