2012-01-24 36 views
0

我使用的方法来接受的元素的ID的一部分,并且使用它来确定我需要传递给一个方法,其URL路径。在我的情况下,这是用来通过点击一个按钮事件可以连接到多个网格中的任何一个,所以我需要知道我是为了知道重新加载什么数据,格:使用eval将变量分配给方法。我应该怎么做呢?

jQuery('.reset').click(function(e) { 
    e.preventDefault(); 
    jQuery('#' + grid_id + '_mnf').toggle(); 
    jQuery('#' + grid_id + '_mnfall > .instance').each(function() { 
     jQuery(this).removeAttr("checked"); 
    }); 
    var url = eval(grid_id + '_url'); 
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid'); 
}); 

可能的网址被定义为变量,所以我有类似:

var foo_url = url_path + '?input=moduleone&param=1'; 
var bar_url = url_path + '?input=moduleone&param=2'; 

这意味着在URL值以上setGridParam方法将这些VARS之一。如果我只是这样做:

var url = grid_id + '_url'; //note I'm not using eval here 

传递给setGridParam的值将不起作用。

如果我不使用eval像我这样做上述网址将无法正常工作。为什么?这里发生了什么?因为“eval是邪恶的”,我还应该做什么?

在我的脑海里,不使用eval,我传递的网址,如:

jQuery('#foo').setGridParam({url:foo_url}).trigger('reloadGrid'); 

但这未能如此明显的eval这里需要?


因为我相信这是过于死板,笨重的方式来做到这一点,如果有人想看到它(也许建议如何,我这样做不对?),这里是我怎么得到这grid_id

// ex. id='foo_filter' 
var source = $(this).parent().parent().attr('id').split('_'); 

var parsed_source = source.splice(1, source.length + 1); 

grid_id_portion = ''; 
for (var i = 0; i < parsed_source.length; i++) { 
    grid_id += parsed_source[i]; 
    if(i < parsed_source.length - 1){ 
     grid_id += '_'; 
    } 

} 

一些问题,我看......我必须定义的URL为每个网格的变量。这是非常不灵活的,是吗?这些网址非常相似,因此定义一些网址似乎效率不高。另外,如果某人编写了一段特殊的代码来插入我分开传递给eval的ID。这可能是个坏消息,是的?任何建议如何改善这将不胜感激。

+0

需要真正看到完整的点击代码,并在那里你定义grid_id – Alex

+0

@Alex - 我加了一点,这是不存在的。 grid_id定义代码已经在那里...在底部。 – Lothar

+0

我想可以用更简单的方式实现所有你需要的东西。问题是我不完全明白你的所作所为。网页上有两个(或更多)网格吗?页面上有多少个“重置”类按钮?元素在哪里......'_ mnf','_mnfall> .instance'? HTML标记将非常有帮助。 – Oleg

回答

2

使用地图存储网址,而不是局部变量。

var URLs = { 
    foo: url_path + '?input=moduleone&param=1', 
    bar: url_path + '?input=moduleone&param=2' 
}; 

jQuery('.reset').click(function() { 
    //do stuff... 
    var url = URLs[grid_id]; 
    jQuery('#foo').setGridParam({url:url}).trigger('reloadGrid'); 
}); 
+0

这是否与使用这些方括号有关?这是否可以让你绕过使用eval出于某种原因? – Lothar

+1

如果没有'eval',你传递的是字符串“foo_url”,而不是'foo_url'变量的值。有了'eval',你就可以'评估'foo_url'这意味着获得'foo_url'变量的值。 – bububaba

+0

是的。 JavaScipt语法允许使用点符号和括号符号来进行地图属性查找。你以前的做法是通过字符串进行局部变量查找,这需要解释器访问(即恶意调用)。 –

相关问题