<script>
      $(document).ready(function () {

          $(document).on('click', 'th.default', function() {
            alert("hello world!");
          });

          $(document).on('click', '#columnHeaders', function()
          {
              alert('Hello world!');
          });

          /*$(document).bind('click', function (e) {
           var target = $(e.target);
           if (target.is('.default')) {
              e.preventDefault(); // if you want to cancel the event flow
              // do something
              alert('Hello world!');
           } else if (target.is('.myotherclass')) {
              e.preventDefault();
              // do something else
              alert('Nah');
           }
        });*/
      });

      /*var theParent = document.querySelector("#columnHeaders");
      theParent.addEventListener("click", doSomething, false);

      function doSomething(e) {
          if (e.target !== e.currentTarget) {
              var clickedItem = e.target.id;
              alert("Hello " + clickedItem);
          }
          e.stopPropagation();
      }*/
      //on click: show textbox, hide label

      function renameColumn(label_id)
      {
        alert('Entered rename' label_id);
        //change 'Rename' to 'Save'
        var elt = document.getElementById(label_id);
        if (elt.nodeName == "LABEL")
        {
          document.getElementById(label_id).innerHTML = 'Save';
          $(label_id).css('display', 'none');
        }

        var elt = document.getElementById(inputText_id)
        if (elt.nodeName == "INPUT")
        {
          $(inputText_id)
          .val($(label_id).text())
          .css('display','')
          .focus();
        }
      }

      //on blur
      function cancelRename(editText, column_id)
      {
        document.getElementById(label).innerHTML = 'Rename';
        $(editText).css('display', 'none');
        $(column_id)
        .css('display', '');
      }

      //on save
      function saveColumnName(label)
      {
        document.getElementById(label).innerHTML = 'Rename';
      }
  </script>
<meta name="description" content="jQuery Kanban Widget with Multiple Kanbans" />
  <link rel="stylesheet" type="text/css" href="<?php echo base_url("assets/jqwidgets/styles/jqx.base.css"); ?>">
  <script type="text/javascript" src="<?php echo base_url("assets/scripts/jquery-1.11.1.min.js");?>"></script>
  <script type="text/javascript" src="<?php echo base_url("assets/jqwidgets/jqxcore.js");?>"></script>
  <script type="text/javascript" src="<?php echo base_url("assets/jqwidgets/jqxsortable.js");?>"></script>
  <script type="text/javascript" src="<?php echo base_url("assets/jqwidgets/jqxkanban.js");?>"></script>
  <script type="text/javascript" src="<?php echo base_url("assets/scripts/demos.js");?>"></script>
  <!--<script type="text/javascript" src="data.js"></script>-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  <a href="<?php echo base_url();?>index.php/dashboard/reset">Reset</a>
  <a href="<?php echo base_url();?>index.php?/dashboard/insertNewColumn/1/0">Add Column</a>
  <a href="<?php echo base_url();?>index.php?/dashboard/insertNewRow/1">Add Row</a>
    <?php
      $levels = $columnData[0];
      $maxrowspan = $columnData[1];
      $max_parent_colspan = 0;
      $num_rows = $rowData[1];
      $rows = $rowData[0];
      $td_var = '';
      $default_column = false;

?>

<?php
      echo "<table id=\"columnHeaders\" border=1 style='font-family: Arial; font-size:13' layout=auto>";
      foreach ($levels as $level_id => $level_array) 
      {
        echo "<tr>";
        if (!$default_column)
        {
          echo "<th rowspan=".($maxrowspan+1)." class='default'>Default</th>";
          $default_column = true;
        }

        if ($level_id > 1)
        {
          foreach ($level_array as $child_column_id => $array_properties) 
          {
            $colspan = $array_properties['child_colspan'];
            $is_parent = $array_properties['has_child'];

            if ($colspan == 1 && !$is_parent) 
            {
              foreach ($level_array as $id => $array_props)
              {
                $cols = $array_props['child_colspan'];
                $is_p = $array_props['has_child'];
                $td_var = "<td>

                <label id=\"col_{$child_column_id}\">{$child_column_id}</label>

                <input type=\"text\" id=\"text_{$child_column_id}\" style=\"display:none\">

                 <br>
                 <span id=\"{$child_column_id}\" class=\"rename\">Rename</span> /

                 <a href=\"".base_url()."index.php/dashboard/deleteCol/{$child_column_id}\"> Delete</a> /

                 <a href=\"".base_url()."index.php/dashboard/insertNewColumn/1/{$child_column_id}\">Split</a>

                 </td>";

                if ($cols > 0 && $id != $child_column_id && $is_p) 
                {
                  $td_var = "<td rowspan={$maxrowspan}> <label id={$child_column_id}>{$child_column_id}</label><br> Rename / <a href=\"".base_url()."index.php/dashboard/deleteCol/{$child_column_id}\"> Delete</a> / <a href=\"".base_url()."index.php/dashboard/insertNewColumn/1/{$child_column_id}\">Split</a> </td>";
                  break;
                }
              }
            } else {
              $td_var = "<td colspan={$colspan}> <label id={$child_column_id}>{$child_column_id}</label> <br> Rename / <a href=\"".base_url()."index.php/dashboard/deleteCol/{$child_column_id}\"> Delete</a> / <a href=\"".base_url()."index.php/dashboard/insertNewColumn/1/{$child_column_id}\">Split</a> </td>";
            }
            echo $td_var;
          }
        }
        else
        {
          foreach($level_array as $level1_parent_col_id => $parent_properties)
          {
            $colspan = $parent_properties['colspan'];
            if ($parent_properties['num_of_children'] > 0)
            {
              echo "<th colspan = {$colspan}> <label id={$level1_parent_col_id}>{$level1_parent_col_id}</label> <br> Rename / <a href=\"".base_url()."index.php/dashboard/deleteCol/{$level1_parent_col_id}\"> Delete</a> / <a href=\"".base_url()."index.php/dashboard/insertNewColumn/1/{$level1_parent_col_id}\">Split</a> </th>";
            } else {
              echo "<th rowspan = ".(++$maxrowspan)."><label id={$level1_parent_col_id}>{$level1_parent_col_id}</label> <br> Rename / <a href=\"".base_url()."index.php/dashboard/deleteCol/{$level1_parent_col_id}\"> Delete</a> / <a href=\"".base_url()."index.php/dashboard/insertNewColumn/1/{$level1_parent_col_id}\">Split</a> </th>";
            }
            $max_parent_colspan += $colspan;
          }
        }
        echo "</tr>";
      }
      echo "</table>";
     ?>

     <table border=1>
     <?php

     foreach($rows as $r)
     {
       echo "<tr>";
       echo "<td>  <br> Rename / <a href=\"".base_url()."index.php/dashboard/deleteRow/{$r->id}\"> Delete</a> </td>";

       for ($y = 0; $y < $max_parent_colspan; $y++)
       {
         echo "<td> Row {$y} </td>";
       }

       echo "</tr>";
     }
      ?>
     </table>

<br />
  </div>

Я пытаюсь привязать несколько элементов к одному слушателю событий. Сначала я попробовал это для одного элемента, th.default, но событие никогда не срабатывает.

$(document).ready(function () {
    $(document).on('click', 'th.default', function() {
            alert("hello world!");
    });
});

<?php
      //not inside a <div> nor <body>
      echo "<table id=\"columnHeaders\" border=1 style='font-family: Arial; font-size:13' layout=auto>";
      foreach ($levels as $level_id => $level_array) //Loop through each level
      {
        echo "<tr>";
        if (!$default_column)
        {
          echo "<th rowspan=".($maxrowspan+1)." class=\"default\">Default</td>";
          $default_column = true;
        }
         //More cells below
}
?>
1
herondale 9 Янв 2017 в 10:47

3 ответа

Лучший ответ

Поскольку 'on' работает относительно элементов, вы должны предоставить существующий элемент для прослушивания события, такой как 'body', который всегда существует на странице.

$(document).ready(function () {
    $('body').on('click', 'th.default', function(event) {
            alert("hello world!");
    });
});

Это кажется дубликатом, посмотрите этот вопрос $ (document) .on (" click "... не работает?

1
Community 23 Май 2017 в 12:16

Как я вижу, вы генерируете свою разметку через php, поэтому делегирование событий не требуется в вашем случае, потому что генерация разметки выполняется на сервере, и это должно работать:

$(document).ready(function () {
    $('th.default').on('click', function() {
         alert("hello world!");
    });
});

Также вы должны убедиться, что используете правильную версию jQuery, в которой есть прослушиватель событий .on(), поскольку более ранние версии из 1.7 не имеют.


< EM> Дополнительно

Вы должны поместить библиотеку jquery непосредственно перед сценарием, который вы пытаетесь выполнить.

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
   // Here you should put your script.
</script>
1
Jai 9 Янв 2017 в 08:02

Ваш код отлично работает для меня:

$(document).ready(function () {
    $(document).on('click', 'th.default', function() {
            alert("hello world!");
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table id="columnHeaders" border=1 style='font-family: Arial; font-size:13' layout=auto>
  <tr><th class="default">Default</th><th class="default">Default</th><th class="default">Default</th></tr>
</table>

Проблема, которая может вызывать вашу проблему, заключается в том, что закрывающие теги </td> являются неправильными и должны быть </th>. Если браузер исправляет открывающие теги на <td>, тогда ваше событие не будет запущено.

0
Seb Cooper 9 Янв 2017 в 07:54