【问题标题】:Click event not working in javascript点击事件在javascript中不起作用
【发布时间】:2017-01-20 17:35:41
【问题描述】:

我关注这个Article 使用 HTML5 和 Javascript 执行 CRUD 操作。

这样提交数据到Local Storage并保存。

我的问题是单击删除和编辑按钮时的删除和编辑操作没有任何反应。

Javascript

$(function () {
  var operation = "A";
  var selected_index = -1;
  var tbClients = localStorage.getItem("tbClients"); //Retrieve the stored data
  tbClients = JSON.parse(tbClients); //Converts string to object
  if (tbClients === null) //If there is no data, initialize an empty array
    tbClients = [];

  function Add() {
    debugger;
    var Data = {
      ExternalProjects: {
        Name: $('#Name').val(),
        Body: $('#Body').val(),
        Url: $('#Url').val()
      }
    };

    tbClients.push(Data);
    localStorage.setItem("tbClients", JSON.stringify(tbClients));
    alert("The data was saved.");
    List();
    return true;
  }

  function Edit() {
    tbClients[selected_index] = JSON.stringify({
      Name: $('#Name').val(),
      Body: $('#Body').val(),
      Url: $('#Url').val()
    }); //Alter the selected item on the table
    localStorage.setItem("tbClients", JSON.stringify(tbClients));
    operation = "A"; //Return to default value
    return true;
  }

  function List() {

    debugger;
    var div = $('div#ExProjectList');
    div.html("");
    var cli = tbClients;
    for (var i = 0; i < cli.length; i++) {
      debugger;
      div.append(
        '<div href="#" class="list-group-item list-group-item-action flex-column align-items-start">' +
        '<div class="d-flex w-100 justify-content-between">' +
        ' <h5 class="mb-1">' + cli[i].ExternalProjects.Name + '</h5>' +
        '  <small>' +
        '<a id="btnDelete"  alt="Delete' + i + '"><i class="fa fa-trash" style="cursor: pointer" ></i></a>' +
        '<a id="btnEdit" alt="Edite' + i + '"><i class="fa fa-pencil" style="cursor: pointer"></i></a>'
        + '</small>' +
        ' </div>' +
        '<p class="mb-1">' + cli[i].ExternalProjects.Body + '</p>' +
        '<small>' + cli[i].ExternalProjects.Url + '</small>' +
        '</div>'
      );
    }
  }

  function Delete() {
    tbClients.splice(selected_index, 1);
    localStorage.setItem("tbClients", JSON.stringify(tbClients));
  } 


  $('#btnDelete').bind('click', function() {
    selected_index = parseInt($(this).attr("alt").replace("Delete", ""));
    Delete();
    List();
  });

  $("#btnEdit").bind("click", function() {
    operation = "E";
    selected_index = parseInt($(this).attr("alt").replace("Edit", ""));
    var cli = JSON.parse(tbClients[selected_index]);
    $("#Name").val(cli.ExternalProjects.Name);
    $("#Body").val(cli.ExternalProjects.Body);
    $("#Url").val(cli.ExternalProjects.Url);
  });




  $("#AddExternalProject").click(function () {
    if (operation === "A"){
      return Add();
    }
    else{
      return Edit();
    }
  });
});

【问题讨论】:

  • 我的猜测是您的页面加载并且您的 jQuery 在这些项目加载到 DOM 之前运行。
  • 您的开发者控制台中有任何消息吗?
  • 编辑和删除按钮是通过List() 函数动态添加的。您需要使用委托选择器才能将点击处理程序绑定到它们。它看起来像这样:$("#ExProjectList").on("click", "#btnDelete", function () {...});#btnEdit 相同。以下是委托选择器的文档,您可以阅读更多关于它们的信息:learn.jquery.com/events/event-delegation
  • 可能还值得一提的是,您正在循环中将 HTML 添加到 List() 函数中,但您添加的 &lt;a&gt; 标记上有 ID - 这意味着有可能重复的 ID,这会很快导致错误。最好使用类或数据属性来识别您的 btnDeletebtnEdit 元素。
  • @mhodges 感谢修复

标签: javascript jquery local-storage event-delegation


【解决方案1】:

您正在动态创建 HTML,但没有将事件附加到元素。

而不是使用:

$('#btnDelete').bind('click', function() {
    selected_index = parseInt($(this).attr("alt").replace("Delete", ""));
    Delete();
    List();
});


$("#btnEdit").bind("click", function() {
    operation = "E";
    selected_index = parseInt($(this).attr("alt").replace("Edit", ""));
    var cli = JSON.parse(tbClients[selected_index]);
    $("#Name").val(cli.ExternalProjects.Name);
    $("#Body").val(cli.ExternalProjects.Body);
    $("#Url").val(cli.ExternalProjects.Url);
});

使用事件委托:

$("#ExProjectList").on("click", "#btnDelete", function() {

    selected_index = parseInt($(this).attr("alt").replace("Delete", ""));
    Delete();
    List();
});

$("#ExProjectList").on("click", "#btnEdit", function() {
    operation = "E";
    selected_index = parseInt($(this).attr("alt").replace("Edit", ""));
    var cli = JSON.parse(tbClients[selected_index]);
    $("#Name").val(cli.ExternalProjects.Name);
    $("#Body").val(cli.ExternalProjects.Body);
    $("#Url").val(cli.ExternalProjects.Url);
});

【讨论】:

    【解决方案2】:

    如果您将任何事件绑定到任何 html 元素,请始终在内部绑定

    $(document).ready(function(){
    //code here
    });
    

    因为如果您在 Dom 内容准备好之前添加脚本,在自调用函数中,这些元素将无法用于绑定事件。

    【讨论】:

    • OP 已经在 $(function () { ... }); 中绑定了,这也是一样的......
    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多