我知道有很多关于这个主题的帖子,但我无法使用其中任何一个来满足我的需求。目的是在datepicker中使用变量 seconddivval 并显示可用日期。
我有一个带有隐藏输入的PHP foreach循环
<td class='myArray'>
<input type="hidden" class="activedates" value="<?php echo "['".implode("','",$newactivedate)."'];"; ?>">
单击myArray时,此Javascript函数返回上述输入的值
$('.myArray').click(function() {
seconddivval = $(this).find('input.activedates').val();
});
以上所有工作都很好,但我需要在此函数中使用变量 seconddivval
function available(date) {
dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' +
date.getFullYear();
if ($.inArray(dmy, seconddivval) != -1) {
return [true, ""];
} else {
return [false,""];
}
}
$(".datefromavailable").datepicker({
minDate: 0,
dateFormat: 'M dd, yy',
changeMonth: true,
changeYear: true,
numberOfMonths: 2,
beforeShowDay: available,
onClose: function (selectedDate) {
$(".datetoavailable").datepicker("option", "minDate", selectedDate);
var days_to_add = 365, // SET DAYS HERE
parsed_date = new Date($.datepicker.parseDate('M dd, yy', selectedDate)),
add_year = new Date(parsed_date.setDate(parsed_date.getDate() + days_to_add)),
formatted_date = $.datepicker.formatDate('M dd, yy', add_year);
$(".datetoavailable").datepicker('option', 'maxDate', formatted_date);
$(this).parent().next().children().focus();
setTimeout(function() {
$(this).next().datepicker('show')
},0);
}
});
$(".datetoavailable").datepicker({
minDate: 0,
dateFormat: 'M dd, yy',
changeMonth: true,
changeYear: true,
numberOfMonths: 2,
beforeShowDay: available,
maxDate: '+1y'
});
});
我确信它很简单,但我无法找到实现目标的方法。
我尝试了所有我能想到的东西。我在函数外部声明了变量,我删除了var,我将 window.seconddivval; 添加到click函数中,我在函数末尾添加了return,...
我甚至试过以下,我认为这是正确的方法。如果我只有一个数组但是如果我有多个数组,那么它只能返回第一个数组:
var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;
这个foreach循环也有效,但也返回第一个数组:
var seconddivval = new Array();
<?php foreach($newactivedate as $key => $val){ ?>
seconddivval.push('<?php echo $val; ?>');
<?php } ?>
我做错了什么?
<小时/> 的修改$newactivedate
的形成方式:
$sqlactivedate = $bddp->prepare("SELECT (nullif(Adate1,'')),(nullif(Adate2,'')),(nullif(Adate3,'')),(nullif(Adate4,'')),(nullif(Adate5,'')),(nullif(Adate6,'')),(nullif(Adate7,'')),(nullif(Adate8,'')),(nullif(Adate9,'')),(nullif(Adate10,''))
FROM prices WHERE id_prices = '$id_prices'");
$sqlactivedate->execute();
$rowactivedate = array();
while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) {
$newactivedate = array();
$newactivedate = array_filter($rowactivedate);
这些是从数据库中提取的2行:
Room1 → {"(nullif(Adate1,''))":"15-8-2017","(nullif(Adate2,''))":"16-8-2017","(nullif(Adate3,''))":"17-8-2017","(nullif(Adate4,''))":"18-8-2017","(nullif(Adate5,''))":"20-8-2017","(nullif(Adate6,''))":"21-8-2017","(nullif(Adate7,''))":"22-8-2017","(nullif(Adate8,''))":"25-8-2017","(nullif(Adate9,''))":"26-8-2017","(nullif(Adate10,''))":"28-8-2017"}
Room2 → {"(nullif(Adate1,''))":"1-8-2017","(nullif(Adate2,''))":"2-8-2017","(nullif(Adate3,''))":"4-8-2017","(nullif(Adate4,''))":"5-8-2017","(nullif(Adate5,''))":"28-8-2017","(nullif(Adate6,''))":"29-8-2017","(nullif(Adate7,''))":"4-9-2017","(nullif(Adate8,''))":"5-9-2017","(nullif(Adate9,''))":"6-9-2017","(nullif(Adate10,''))":"7-9-2017"}
答案 0 :(得分:0)
在:
if ($.inArray(dmy, seconddivval) != -1) {
您正在查看数组中是否存在值...
但seconddivval
不是数组。
这是一个像"['2017-07-04','2017-07-05','2017-07-06']"
你必须把它变成一个数组 所以从你在文本输入中的格式...它将是:
var seconddivval_asArray = seconddivval.substr(1,seconddivval.length-2).replace(/'/g,"").split(",");
直接在JS变量中对echo
数组 ...而不是在文本输入中回显...
<小时/> 的修改
好的......我们将从您的PHP开始。
应在$newactivedate
循环之前定义 while
我们将把数据推送到内部......并避免完全覆盖它。
$newactivedate = [];
while ($rowactivedate = $sqlactivedate -> fetch(PDO::FETCH_ASSOC)) {
array_push($newactivedate, array_filter($rowactivedate));
//...
}
现在你有一个包含数组的数组...
我们将其“字符串化”,以便能够直接在JS变量中回显它。
$newactivedate_string = json_encode($newactivedate);
然后在JS变量中回显:
var seconddivval = <?php echo $newactivedate_string; ?>;
现在,您在JS中拥有与PHP相同的“数组数组”
所以available(date)
函数应该稍微修改一下......以查看每个“内部数组”。
function available(date) {
dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' +
date.getFullYear();
for(i=0;i<seconddivval.length;i++){
if ($.inArray(dmy, seconddivval[i]) != -1) {
return [true, ""];
} else {
return [false,""];
}
}
}
<小时/> 并且在函数之外声明变量是要走的路 )
答案 1 :(得分:0)
您可以使用echo
JSON
别名php
json_encode()
来.ready()
来自$()
的有效$.getJSON()
字符串,并获得{{1}的响应}}
$(function() {
var seconddivval;
$.getJSON("/path/to/server")
.then(function(json) {
seconddivval = json; // global though we will use the variable with `.then()`
$(".myArray.input.activedates").data()
function available(date) {
dmy = date.getDate() + '-' + (date.getMonth()+1) + '-' +
date.getFullYear();
if ($.inArray(dmy, seconddivval) != -1) {
return [true, ""];
} else {
return [false,""];
}
}
$(".datefromavailable").datepicker(
{minDate: 0, dateFormat: 'M dd, yy', changeMonth: true
, changeYear: true, numberOfMonths: 2, beforeShowDay: available
});
}, function err(jqxhr, textStatus, errorThrown) {
console.error(errorThrown)
})
})
答案 2 :(得分:0)
我认为我发现了自己的错误,我在这里发帖,因为它可以帮助别人:
1.-在函数可用(日期)中声明 seconddivval :
var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;
奇怪的是,如果在外面声明,它只返回最后一行数组。
2.-我删除了** $(文件).ready(function()**
3.-我应该在PHP while循环结束之前编写JS脚本。这样它需要正确的行(我错误地认为使用点击功能更容易......但是犯错是我们学习的方式......)。
感谢所有帮助我解决此问题的人!