0

我经常使用 PHP,并且一直有点害怕 javascript 和 jquery。但是两周前我跳到了 jquery,我必须说我真的很喜欢它:-) 我制作了几个工作脚本,也感谢我在 stackoverflow 上找到的信息。所以谢谢大家:-)

但是......我在这个似乎无法解决的问题上花了很多时间......我会尽力解释。

在 index.php 文件中,我使用 php 创建了一个表(从具有典型 SELECT * FROM ... 的 mysql 数据库中提取)。每个单元格都有一个唯一的 ID(例如 Cell_1_1 作为第一个,...)。使用 Jquery,我有一个脚本可以检测对单元格的点击,获取单元格的 id 并在其中放置一个包含单元格内容的文本输入字段。然后,我检测到一个“onchange”事件(如 enter)以使用 ajax 调用一个 php 脚本,该脚本更改实际 Mysql 数据库中这个单元格的值(使用 UPDATE ... WHERE id = cellid 语句)。

这一切都很好,我对 jquery 的强大功能感到非常满意 :-)

但是出于另一个原因,我想创建原始表,而不是使用 php,而是使用 jquery。这也很好用。如果将其与输出的 html 进行比较,则它与 php 脚本的相同。但是由于某种原因,当我单击(jquery 表的)单元格时,jquery 脚本无法检测到。当我将检测绑定到外部 div 时,在单元格中放置文本字段没有问题。

所以jquery'识别'单元格ID来改变单元格。但不能检测 onclick 事件。

有谁知道这怎么可能?

代码的某些部分需要澄清:

$(document).ready(function () {
  makeclickable();
  // script1: build the table when clicked on a div with the name of the table
  $(".showtable_x").click(function() { 
    var idlastclick = $(this).attr("id"); //take tablename from click
    $.ajax({ //let php return an array with the titles and the content of the table                                   
      url: 'inc/api/api.php',
      data: '&table='+idlastclick,
      dataType: 'json',
      success: function(rows)        
      {
        var table = $('<table></table>');
        var numrow = rows.length; // take number of rows
        var numcol = rows[0].length; // number of cols
        for (i=0; i<numrow; i++){ // for every row
          var row = rows[i]; // take row from array
          var row2 = $('<tr></tr>'); //create html row
          for (j=0; j<numcol; j++){ // for every cell
            var cell = $('<td></td>').html(row[j]);//place content of array in cell
            var cellcounter = "cell_"+i+"_"+j; 
            cell.attr('id', cellcounter); // asign meaningfull id to the cell
            if (i==0) {
              var cell = cell.addClass("bgcolor1");
            } //the titles of the table
            row2.append(cell); // append the cell to the row
          }
          table.append(row2); // append the row to the table
        } // end for i
        $('#firstplaceholder').html(table);
      } // end function
    }); // end ajax;
  }); // end script 1

// script2: 确保单元格可点击并写入数据库。(在 php 创建的表上工作正常)

  function makeclickable() {
    $('td').click( function() { // when click on cell
      if (!$("td.active")[0]){ // only execute when there is no other cell 'active'
        var idlastclick = $(this).attr("id"); // take id of the cell
        var content = $('#'+idlastclick).text(); // take the content of the cell
        $('#'+idlastclick).html("<input type='text' id='textie' value='' />").addClass("active"); 
        $('#textie').attr("value", content).focus();    
        // place a textfield, place the content of the cell, mark the cell as 'active', focus on it
        $('#textie').on("keyup change", function() { // on type, remember the new value
          var value = this.value; 
          $('#textie').on("change", function() { // on enter
            $("td.active").empty().removeClass("active").addClass("exiting"); // clear cell, remove 'active' status, mark it (by class) as the cell to be written in
            $("td.exiting").html(value); // place new value in cell 
            // call php script that writes the new value to the database
            $.ajax({                                      
              url: 'inc/api/api2.php',
              data: '&celid='+idlastclick+'&content='+value,
            }); 
          }); // end 'on enter' detection
        }); // end 'on key-stroke' detection
        $("td.exiting").removeClass("exiting"); // restore original class to cell
      } // end if
    });
  }
});
4

5 回答 5

1

使用on()进行事件委托,例如,

利用

$(document).on("keyup change",'#textie', function() { 

代替

$('#textie').on("keyup change", function() { 
于 2013-10-10T07:36:26.547 回答
1

执行 $(/**/).click(); 只会附加到已经存在的 html 元素。对于动态添加的元素,您必须进行选择。

  1. 再次手动附加事件(检查您是否没有将其双重绑定到现有元素)
  2. 使用事件冒泡或委托并捕获父元素上的单击事件,例如通过 .on() 方法的示例表。这是首选方式。

例子:

$('#myTable').on('click', 'td', function () {/*your code goes here*/});
于 2013-10-10T07:39:09.937 回答
0

您使用on()实际上是为该问题创建的..对于“即时”创建的元素..

于 2013-10-10T08:16:14.660 回答
0

您必须将 click 事件委托给您的函数中的父容器(不是动态添加的),makeclickable()如下所示:

$('table').on('click', 'td', function () {
    ...
}

请参阅 JQuery 文档:.on()

希望我对你有帮助!

于 2013-10-10T07:38:15.287 回答
0

<td>在创建任何标签之前,您将 onclick-handler 附加到所有标签。

makeclickable() 创建表后执行,它应该可以工作。

于 2013-10-10T07:42:09.890 回答