![](/img/trans.png)
[英]calling return from a function to use in a variable in another function? javascript
[英]Use a Javascript variable from a function in another function
我知道有很多关于该主题的帖子,但是我不能使用其中的任何一个。 目的是在日期选择器中使用变量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
的形成方式如下:
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"}
这些是从数据库中获取的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"}
在:
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,""]; } } }
您可以在.ready()
别名$()
处使用json_encode()
从php
echo
有效的JSON
字符串,并使用$.getJSON()
获得响应
$(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)
})
})
我想我发现了自己的错误,因此将其张贴在这里,因为它可以帮助其他人:
1.-在available(date)函数中声明seconddivval :
var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;
奇怪的是,如果在外部声明,它仅返回数组的最后一行。
2.-我删除了** $(document).ready(function()**
3.-我应该在PHP while循环结束之前编写JS脚本。 这样就可以得到正确的行(我错误地认为使用单击功能会更容易...但是犯错是我们学习的方式...)。
谢谢所有试图帮助我解决这个问题的人!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.