从php文件执行JS中的字符串,setTimeout vs eval()

时间:2015-10-16 22:30:35

标签: javascript php jquery ajax settimeout

我有一个使用ajax从.php文件获取响应的Javascript代码。我正在使用" eval()"测试和一切工作正常(有点慢)但我发现了一个很好的技巧,我可以使用setTimeut。我仍然是一个初学者但是每个人都说eval是危险的,我应该避免这就是为什么我在寻找替代方案。 setTimeut比eval(速度)工作得更好但是安全吗?

使用setTimeout(result,0)来执行我从php文件中接收的代码(作为字符串)是否安全?或者它比eval()更安全?请提前帮助,谢谢。

我的代码Javascript:

    function sendAjax(vData) {
    $.ajax({
        method: 'GET',
        url: '_process.php',
        data: vData,
        success : function (result) {
            setTimeout(result, 0);
            //old method eval(result);
        }
    });
}

$('.button1, .button2, .button3').click(function () {
    sendAjax($(this).attr('class'));
});

和.php文件

if (isset($_GET['button1'])) {
echo    " $('.button1').hide(500, function () {
                console.log('some1clickedbutton1');

            });";

}

2 个答案:

答案 0 :(得分:0)

这有用吗?我从来没有尝试使用Eval()或setTimeout来运行从ajax返回的函数。但是对于我来说,在javascript中使用该函数并根据返回的值调用它更有意义。

php文件:

if (isset($_GET['button1'])) {
    echo "true";
}else{
    echo "false";
}

然后是javascript:

 function sendAjax(vData) {
    $.ajax({
        method: 'GET',
        url: '_process.php',
        data: vData,
        success : function (result) {
            if(result == "true"){
                hideButton1();
            }
        }
    });
}

function hideButton1(){
    $('.button1').hide(500, function () {
                console.log('some1clickedbutton1');
            });
}

$('.button1, .button2, .button3').click(function () {
    sendAjax($(this).attr('class'));
});

答案 1 :(得分:0)

任何其他名字的玫瑰......

eval的大多数问题是获取字符串并将其作为代码执行的一般问题。避免将字符串传递给setTimeoutsetIntervalnew Function()以及其他任何内容。

通常,您最好在实际的JavaScript中编写代码,然后从服务器发送纯数据(没有逻辑)。

对你要编写的代码做了很多假设,你可以这样做:

if (isset($_GET['button1'])) {
    $clicked = "button1";
}

$response = array( clicked => $clicked );
header("Content-Type: application/json");
echo encode_json($response);

success : function (result) {
    $("." + result.clicked).hide(500, function () {
        console.log("some1clicked" + result.clicked);
    });
}