2017-08-06 188 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腳本。這樣它需要正確的行(我錯誤地認爲它更容易使用點擊功能...但犯錯誤,這是我們學習...)。 !

相關問題