繁体   English   中英

在另一个函数中使用一个函数中的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(",");

CodePen

一个好主意是直接在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM