【问题标题】:mousedown not working on dynamically loaded elementmousedown 不适用于动态加载的元素
【发布时间】:2013-01-19 20:13:42
【问题描述】:

我正在尝试像这样加载我的导航栏:

$.get("nav.html",function(menuData){
  $("body").html(menuData);
)};

在“nav.html”中我们有类似的东西

<td id='menu-item-1'>menu item 1</td>
<td id='menu-item-2'>menu item 2</td>

等等。那么我想为每个项目分配一个事件,我已经尝试过:

$("#menu-item-1").mousedown(function(response){
  //create an empty table
  $("body").append("table id='menu-item-1-sub-table'></table>");
  //retrieve php data and insert it in the table
  $.get("data.php",function(response){
    $("#menu-item-1-sub-table").html(response);
  });
});

问题是事件不会触发。当我将 html 直接放在 javascript 中时,它就起作用了,例如:

$("body").append("<table><tr><td id='menu-item-1'>menu-item-1</td></tr></table>");

但在将其移至另一个文件后,它不再起作用。

编辑

这是一个有效的答案:

使用

$("body").on('click','#menu-item-1',function(){
etc.
});

因为我们尝试时尚未创建 menu-item-1

$("#menu-item-1).mousedown

【问题讨论】:

  • 哪个文件中有$("#menu-item-1").mousedown(... javascript?
  • 所有的javascript都在一个文件中。也是按照我发布的顺序:第一个块在 document.ready 之后,第三个块在它下面,然后 document.ready 被关闭。
  • 欢迎来到stackoverflow。在此 QA 站点中,当实现答案时,我们不会在问题标题后附加“(已解决)”。相反,我们通过单击该答案左上角的复选框来标记正确答案。如果您自己想出了答案,然后发布您自己的答案,给它一些时间,如果没有人有更好的答案(您的判断),您可以在 48 小时的等待期后接受自己的答案。
  • 谢谢,几年前我有一个帐户,我记得当时看到过。我很抱歉。

标签: javascript jquery events dynamic mousedown


【解决方案1】:

给你一个代替的答案

$("#menu-item-1").on("click",function(){
  //stuff
});

$('body').on('click','#menu-item-1', function(){
  //stuff
}); 

之所以有效,是因为当.on() 被委派时,#menu-item-1 尚未出现在页面上,但是当它被调用时,它可以选择 #menu-item-1

【讨论】:

  • 谢谢!我今天不得不重新启动我的帐户,所以我才意识到,我不能投票(低于 15 声望)。
  • 对我来说效果很好。您能否给出更详细的解释。等待投票。
  • 有没有办法通过 mousedown 来完成这项工作? .on('click' 对我开始工作的单击/取消单击功能的影响不同
【解决方案2】:

我认为问题在于您必须在 body.html(menuData) 之后的 get 回调中设置处理程序。但如果一切正常,我认为在页面上加载菜单模板是一种奇怪的方式。

【讨论】:

    【解决方案3】:

    您说的是另一个文件 - 您是否在该代码中添加了 jquery?或者当您加载 mousedown 代码时元素可能不存在 - 尝试 jquery on-function。

     $('#menuitem').on(function(){
    
        $("#menu-item-1").mousedown(function(response){
          $("body").append("table id='menu-item-1-sub-table'></table>");
           $.get("data.php",function(response){
           $("#menu-item-1-sub-table").html(response);
           })
         });
       })
    

    【讨论】:

    • 我检查了 chrome 中的开发人员工具,这些元素以其各自的 id 存在。尝试了 .on 但它也没有工作。不过谢谢
    【解决方案4】:

    您最好在收到响应时附加表格,而不是附加表格然后设置附加表格的 html

    $('body').on('click','#menu-item-1', function() {
      $.get("data.php",function(response){
        $("body").append('<table id="menu-item-1-sub-table">'+response+'</table>');
      });
    });
    

    基于你已经完成的事情

    $('body').on('click','#menu-item-1', function() {
      $("body").append("<table id='menu-item-1-sub-table'></table>");
      $.get("data.php",function(response){
        $("#menu-item-1-sub-table").html(response);
      });
    });
    

    【讨论】:

    • .live() 已被贬值,现在被删除了,我抢的是link to a related question
    • 感谢您的回答;这是有道理的,但是我应该补充一点,主要目标是从 javascript 文件中删除 html。
    • 很公平,我正在输入我的头顶代码并忘记了
    • @user1993502 你想建议什么?我不明白你的意思?
    • 好吧,我只是说我根本不想在我的 .js 文件中包含 html。我认为它最终会更干净,更容易编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多