2

感谢大家考虑我的新手问题。我正在使用 jQuery 遍历一个表并在一个数组中捕获所有硬编码的日期。我将这些日期与 Date.today(); 使用 .isAfter() 函数。如果硬编码的日期是过去的,它应该得到一个 .css("display", "none");

<table>
    <html>
      <table>
        <tr class="gig">

           <td class="gigDate">Mar 27 2013</td>
           <td>the Saloon</td>
           <td>Atlanta, Ga</td>
           <td>$20 (2 passes)</td>
            <td>button to purchase tix<td>
        </tr>

        <tr class="gig"><td class="gigDate"> ... date2 ..</td></tr>
        <tr class="gig"><td class="gigDate"> ... date3 ..</td></tr>
        <tr class="gig"><td class="gigDate"> ... date4 ect ..</td></tr>
  </table>

<script type="text/javascript">
$("document").ready( function() {

var stringDate = []; //create array to hold elements

var now = Date.today(); // create current date

$('.gigDate').each(function (i, e) {   //adds hardcoded dates to array
stringDate.push($(e).text());
});

for(var y = 0; y < stringDate.length; y++){
var singleDate =  Date.parse(stringDate[y]);  //parse to milliseconds
var compare = now.isAfter(singleDate);        //compare to today's date

if(compare){
    $('.gig').css("display", "none");   //hide <tr class="gig"> 
                                      //if in the past
      }
}    
 });
</script>

循环逻辑似乎可以正常运行,但是添加样式 display:none 的 if(statement) 很糟糕。任何帮助将不胜感激。


我在这里可能弄错了,但我相信最好的方法是利用 Model::afterFind() 方法。

<?php
// type.php (Model)
function afterFind($results, $primary) {
    if ($primary === true) {
        foreach ($results as $key => $type) {
            foreach ($type['Collector'] as $collector) {
                // Assuming you built the associations/tables/etc. correctly and are following cake conventions.
                if (empty($collector['Place']))  {
                    unset($results[$key]);
                    continue 2;
                }
            }
        }
    }
}
?>

<?php
// types_controller.php

// Assuming you're using the containable behavior? If not
// set recursive to 2.
$this->Type->contain(array(
    'Collector' => array(
        'Place'
    )
));
$types = $this->Type->find('all');

?>
4

4 回答 4

0

当您尝试隐藏单行时,您只需隐藏所有行 - $('.gig') 选择所有行,而不仅仅是您认为应该的行。

将您的逻辑移动到您测试日期的循环中。大致是这样(我尽可能少地更改您的代码,可能仍然无法正常工作,尚未检查):

var now = Date.today(); // create current date

$('.gigDate').each(function (i, e) {   //adds hardcoded dates to array
   var current = ($(e).text());
   var singleDate =  Date.parse(current);  //parse to milliseconds
   var compare = now.isAfter(singleDate);        //compare to today's date
   if(compare){
       // we want to hide the parent of td, not the td:
       $(e).parent().css("display", "none");   //hide <tr class="gig"> 
                                      //if in the past
   }

});
于 2013-03-26T22:54:08.030 回答
0

你有什么理由过滤客户端吗?似乎效率低下。你的 html 是硬编码的还是你有服务器端脚本?你真的应该过滤你的结果预渲染,除非没有其他选择。

于 2013-03-26T22:50:39.423 回答
0

我不知道这个 isAfter 函数,但你可以直接比较日期。我想那会更容易。

于 2013-03-26T22:48:06.900 回答
0

即使比较有效,你也会用“演出”类隐藏任何东西。

您可以通过从您的字符串创建一个新的 Date(xxxxxxx) 来简化此操作。然后您可以使用“<”运算符进行比较。

假设您的演出日期与您的活动日期格式相同:

var now = new Date(); // create current date    
$('.gigDate').each(function (i, e) { 
    ele = $(this).html();
    gigDate = new Date(ele);
    if (gigDate<now){
        $(this).hide();
    }

});

你可以看到它在这里工作:

http://jsfiddle.net/skelly/vzH8U/

于 2013-03-26T23:04:24.450 回答