2017-08-06 187 views
0

我知道有很多关于此主题的文章,但是我无法根据自己的需求使用它们中的任何文章。目的是在日期选择器中使用变量seconddivval并显示可用日期。在另一个函数中使用函数中的Javascript变量

我有一个隐藏输入一个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 in this function

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;到点击功能,我加在函数结束返回,...

我甚至尝试了下面,我认为这是正确的方式。它工作正常,如果我只有一个数组,但如果我有一个以上的数组,它只返回第一个数组:

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"} 
+1

你在哪里调用函数'available' – Spectarion

+0

在日期选择器:$( “datefromavailable”)日期选择器({ 的minDate:0, DATEFORMAT: 'M DD,YY', changeMonth:真实, changeYear:真实, NUMBEROFMONTHS:2, beforeShowDay:可用, – Daniela

+0

为什么不'如果($ .inArray(DMY,$(本).find('输入.activedates')。val())!= -1){'?为什么用户需要点击'myArray'? – Spectarion

回答

0

在:

if ($.inArray(dmy, seconddivval) != -1) { 

你是看看一个值是否存在array ...
但是seconddivval不是数组。

它就像"['2017-07-04','2017-07-05','2017-07-06']"

字符串你必须做一个数组。
所以从您在文本输入的格式...这将是:

var seconddivval_asArray = seconddivval.substr(1,seconddivval.length-2).replace(/'/g,"").split(","); 

CodePen

一个伟大的想法是echo你直接一个JS数组变量...而不是在文本输入中回显...


编辑

好吧...我们从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,""]; 
    } 
    } 
} 


并宣布在函数外的变量是要走的路。
;)

+0

''['2017-07-04','2017-07-05','2017-07-06']“'无效'JSON' – guest271314

+0

我添加了JSON.parse,但控制台日志显示:Uncaught SyntaxError :意外令牌'的JSON在位置1 在JSON.parse() – Daniela

+0

@Daniela使用'json_encode()''在php' – guest271314

0

您可以echophp.ready()别名$()并获得与$.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) 
    }) 
}) 
+0

@Louys我有同样的想法在JS中回显数组,但它只返回我在PHP foreach循环中的第一个数组。 – Daniela

+0

此外,这有助于:我知道数组没有正确地在JS中用单引号和双引号声明。我相信正确的是 var secondivval = <?php echo'[''。implode('','',$ newactivedate)。'“]'; ?>;如果我在隐藏的输入中直接使用这个代码→控制台日志返回这个→“var secondivval = [” – Daniela

+0

您试过''json_encode()'echo'结果到'$ .getJSON() '打电话?如果在HTML中设置一个属性,你将需要调用'JSON.parse()'来传递元素的'.value'来获得一个'Array'而不是'String' – guest271314

0

响应使用json_encode()有效JSON字符串我想我找到了我的错误,我他们在这里张贴了它可以帮助别人:

1.-申报seconddivval内功能可用(日期)

var seconddivval = <?php echo '["' . implode('", "', $newactivedate) . '"]'; ?>;

奇怪的是它仅对外宣称返回数组的最后一排。

2:我删除了** $(文件)。就绪(函数()**

3 .-我应该只是PHP的while循环结束之前写的JS脚本。这样它需要正确的行(我错误地认为它更容易使用点击功能...但犯错误,这是我们学习...)。 !

相关问题