Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用更安全的东西替换eval_Javascript_Jquery_Eval_Flatpickr - Fatal编程技术网

Javascript 用更安全的东西替换eval

Javascript 用更安全的东西替换eval,javascript,jquery,eval,flatpickr,Javascript,Jquery,Eval,Flatpickr,我用flatpickr.js库创建了一个日历。我只想启用从属性名为destinazione的下拉列表中选择的arreys dateCorfu、dateZante和datePag中存在的日期 我不是一个程序员,但我用eval方法写了下面的代码,这是可行的,但我确信这是错误的方式。。也许有更好的方法来操纵functiondate的结果。那么,有没有一种方法可以让它在不使用eval的情况下工作呢 flatpickr("#data-partenza", { locale:'it', m

我用flatpickr.js库创建了一个日历。我只想启用从属性名为destinazione的下拉列表中选择的arreys dateCorfu、dateZante和datePag中存在的日期

我不是一个程序员,但我用eval方法写了下面的代码,这是可行的,但我确信这是错误的方式。。也许有更好的方法来操纵functiondate的结果。那么,有没有一种方法可以让它在不使用eval的情况下工作呢

flatpickr("#data-partenza", {
    locale:'it', 
    minDate: "2020-07-16",
    enable: [
        function(date) {
            // return true to enable
            var drop_destinazione = jQuery('[name="destinazione"]').val();
            var result = '';
            var dateCorfu = ["2020-07-16","2020-07-23","2020-07-30","2020-08-06","2020-08-13","2020-08-20"];
            var dateZante = ["2020-07-17","2020-07-24","2020-07-31","2020-08-07","2020-08-14"];
            var datePag = ["2020-07-18","2020-07-25","2020-08-01","2020-08-08"];
            var slice = 'date.toISOString().slice(0,10)';
            var i;
            if(drop_destinazione == 'Corfù'){
                for (i = 0; i < dateCorfu.length; i++) {
                    result += (slice + '==' + '"' + dateCorfu[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else if(drop_destinazione == 'Zante'){
                for (i = 0; i < dateZante.length; i++) {
                    result += (slice + '==' + '"' + dateZante[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else if(drop_destinazione == 'Pag'){
                for (i = 0; i < datePag.length; i++) {
                    result += (slice + '==' + '"' + datePag[i] + '"' + '||');
                }
                return eval(result.slice(0, -2));
            }
            else {
                console.log('no destination selected')
            }
        }
    ],
    dateFormat: "d-m-Y",
    disableMobile: true,
});

既然您只进行if验证,为什么不立即对每个结果进行求值和累加+=

result = false;
for (...) {
    if (condition) result = true;
}
return result;
或者更好:像这样提前退出:

result = true;
for (...) {
    if (condition) return true;
}
return false;
function(date) {
    var drop_destinazione = jQuery('[name="destinazione"]').val();
    var dateCorfu = ["2020-07-16","2020-07-23","2020-07-30",
                     "2020-08-06","2020-08-13","2020-08-20"];
    var dateZante = ["2020-07-17","2020-07-24","2020-07-31",
                     "2020-08-07","2020-08-14"];
    var datePag = ["2020-07-18","2020-07-25","2020-08-01","2020-08-08"];
    var slice = date.toISOString().slice(0, 10);
    if (drop_destinazione == 'Corfù') {
        for (var i = 0; i < dateCorfu.length; i++) {
            if (slice == dateCorfu[i]) return true;
        }
    }
    else if(drop_destinazione == 'Zante') {
        for (var i = 0; i < dateZante.length; i++) {
            if (slice == dateZante[i]) return true;
        }
    }
    else if(drop_destinazione == 'Pag') {
        for (var i = 0; i < datePag.length; i++) {
            if (slice == datePag[i]) return true;
        }
    }
    else { console.log('no destination selected'); }
    return false;
}
应用于原始代码,这将使函数如下所示:

result = true;
for (...) {
    if (condition) return true;
}
return false;
function(date) {
    var drop_destinazione = jQuery('[name="destinazione"]').val();
    var dateCorfu = ["2020-07-16","2020-07-23","2020-07-30",
                     "2020-08-06","2020-08-13","2020-08-20"];
    var dateZante = ["2020-07-17","2020-07-24","2020-07-31",
                     "2020-08-07","2020-08-14"];
    var datePag = ["2020-07-18","2020-07-25","2020-08-01","2020-08-08"];
    var slice = date.toISOString().slice(0, 10);
    if (drop_destinazione == 'Corfù') {
        for (var i = 0; i < dateCorfu.length; i++) {
            if (slice == dateCorfu[i]) return true;
        }
    }
    else if(drop_destinazione == 'Zante') {
        for (var i = 0; i < dateZante.length; i++) {
            if (slice == dateZante[i]) return true;
        }
    }
    else if(drop_destinazione == 'Pag') {
        for (var i = 0; i < datePag.length; i++) {
            if (slice == datePag[i]) return true;
        }
    }
    else { console.log('no destination selected'); }
    return false;
}
当然,属性名称Corfù看起来不太好,但是dropu destinazione似乎是一个下拉列表,它们既有值也有标签,请参见。您应该将值设置为简单的字符串,如corfu:

<select>
    <option value="corfu">Corfù</option>
    ...
</select>

希望这有帮助

很抱歉,我不清楚你的答案。请您添加一些详细信息。正如我所说,我不是一名编码员,因此可能缺少一些基本知识。@silvered.dragon更新了我的答案,向您展示了如何在代码中应用这一原则,以及如何进一步批准代码。您非常友好,此解决方案返回允许[drop_destinazione]。包括许可证;它真的很优雅。谢谢我注意到includes在IE11上不起作用,你对此有解决办法吗?你也可以使用array.indexOfel!==-1而不是array.includesel