关于eval的邪恶:如何清理
About the evil of eval: How to clean up
我正在构建一个网站,它将(最终)成为游戏的前端。我希望能够动态地建立一个用户可以购买的"权力"列表。为了构建这些列表,我使用了一个基于PHP的SQL查询,然后将其传递给Javascript以进行动态选择(某些功能具有必备功能)。
- 我知道有一种更简单的方法来做我正在做的事情,但我现在并不太担心(我稍后会这样做,但我正在努力让它发挥作用,然后清理)(同样,我知道这不是最佳的)
- 我正在使用eval来解析要显示哪些div,我想知道如何不显示
- 我在一开始就构建div名称时遇到了问题
这是我的代码:Javascript(单独文件)
function upgradeList(passed)
{
var PowerArray = [];
var DetailPowerID = [];
var EscapedPowerID = [];
PowerArray.push([]);
PowerArray = eval(passed);
var OutputThing="";
for (i=0;i<PowerArray.length;i++)
{
DetailPowerID[i] = 'detail' + PowerArray[i][0];
EscapedPowerID[i] = "'" + DetailPowerID[i] + "'";
}
for (i=0;i<PowerArray.length;i++)
{
OutputThing = OutputThing + "<br><a href='#' onClick='showUpgradeDetails(" + DetailPowerID[i] + ")'>" + PowerArray[i][2] + "</a><div class='hidden' id='" +
DetailPowerID[i] + "'>" + PowerArray[i][3] + "</div>"; }
document.getElementById("secondUpgrade").innerHTML=OutputThing;
document.getElementById("secondUpgrade").style.display='block';
}
}
PHP编写HTML和JS:{$AbleToUpgrade和$UpgradeList都是从SQL查询构建的2d数组)
echo "<script name='UpgradeList'>";
settype($UpgradesListSize[$i],"int");
for ($i=0;$i<count($AbleToUpgrade);$i++)
{
echo "var UpgradeList" . $AbleToUpgrade[$i][0] . " = new Array();";
for ($j=0;$j<=$UpgradesListSize[$i];$j++)
{
echo "UpgradeList" . $AbleToUpgrade[$i][0] . ".push(Array('"
. $UpgradeList[$i][$j][0] . "', '"
. $UpgradeList[$i][$j][1] . "', '"
. $UpgradeList[$i][$j][2] . "', '"
. $UpgradeList[$i][$j][3] . "', '"
. $UpgradeList[$i][$j][4] . "'));";
}
}
echo "</script>";
后来。。。
echo "<div id='SpendUpgrade'>
Select power to upgrade:
<ul>";
for ($i=0;$i<count($AbleToUpgrade);$i++)
{
echo "<li><a href='#' name='UpgradeList" . $AbleToUpgrade[$i][0] . "' onClick='upgradeList(this.name)'>" . $AbleToUpgrade[$i][1] . " - " . $AbleToUpgrade[$i][2] . "</a></li>";
}
echo "</select>
<div id='secondUpgrade' class='hidden'>
</div>
<div id='thirdUpgrade' class='hidden'>
</div>
</div>";
当我加载页面时,我最终会生成这样的文本:
<a href="#" onclick="showUpgradeDetails(detail21)">Real Armor</a>
以及相应的div:
<div class="hidden" id="detail21" style="display: none;">Your armor only works in the Waking</div>
为了让div显示(display:block;)
,我需要调用这样的函数:
showUpgradeDetails("detail21")
但是我不能让JS/PHP正确地写引号。请帮忙(做任何或所有这些?)!
我找到了一个解决方案,它不是JSON.parse()
。我把PowerArray = eval(passed);
改成了PowerArray = window[passed];
。
因为passed
包含一个变量的名称,而不是变量本身,所以我不能直接使用它。但是,因为它是一个只包含全局定义变量名称的字符串,所以我可以将它传递给window[]
构造并使其工作。
相关文章:
- 清理json包含和使用
- “createImageData()”和“new ImageData(()”有何不同
- 正在清理三元语句中的代码
- 清理HTML输入值
- 正在清理内存泄漏
- 试图清理一个电话号码,以便如果它像816-345-6757一样被输入,它会像8163456757一样返回它
- 阻止Ember CLI中的目录清理
- jQuery GraphML解析(正在清理导入的数据)
- 清理在加载 Ajax 内容时添加的 CSS
- d3.js 中的 HTML 工具提示清理
- 绕过JavaScript清理器
- Javascript - 清理特定的 html 元素
- 这与 $(document).ready() 有何不同
- 未使用angular JS清理日期选择器
- 清理字符串以避免特殊字符破坏php生成的javascript
- 更改页面时如何清理和卸载Unity WebGL画布
- 使用sturts2进行客户端数据清理和分析
- 清理了SQL/PHP,它没有写.赢得'不要选择CSS
- removeChild,然后再次添加以前删除的Child以重新加载并清理它
- 关于eval的邪恶:如何清理