【问题标题】:button not getting to ajax按钮没有进入ajax
【发布时间】:2015-04-17 17:58:15
【问题描述】:

我真的很困惑为什么第二种方法没有进入 ajax:

1. (这是触发 ajax 好)

<div id="div_comment">
    <textarea name="text_comment" id="text_comment" placeholder="160 chars or less, no # or @" data-role="none" rows=11 cols=20 onkeypress="if(event.keyCode==13){return false;}" onKeyDown="limitText2(this,160);" onKeyUp="limitText2(this,160);" style="resize:none;"></textarea>
    <button id="comment_btn" class="ui-btn ui-btn-inline" style="border: #ffffff 1px solid;">Enter your comment</button>
</div> <!-- div_comment -->

2。 (这不会触发 ajax)

document.getElementById('div_comment').innerHTML = "<br> <br> <textarea name=\"text_comment\" id=\"text_comment\" placeholder=\"160 chars or less, no # or @\" data-role=\"none\" rows=11 cols=20 onkeypress=\"if(event.keyCode==13){return false;}\" onKeyDown=\"limitText2(this,160);\" onKeyUp=\"limitText2(this,160);\" style=\"resize:none;\"></textarea> <span id=\"commenterr\" style=\"font-weight:bold; font-size:90%;\"></span> <br style=\"line-height:190%;\"> <button id=\"comment_btn\" class=\"ui-btn ui-btn-inline\" style=\"border: #ffffff 1px solid;\">Enter your comment</button> </center> <a href=\"#searchpage\" data-transition=\"slide\"> Back </a>";

两者都使用相同的 ajax:

$(document).ready(function(){
  $("#comment_btn").click(function(){ //click write_comment a tag btn
  console.log ("ready-comment_btn: clicked comment_btn");
    $.post("cgi-bin/s_comment.pl", {
        comment:"HELLO WORLD IN READY",
    },
    function(data,status){
      document.getElementById('div_comment').innerHTML = data;
    });
  }); //write_comment
}); //ready

第二种方法将相同的内容分配给innerHTML,但不起作用,当单击按钮时,没有响应,只是橙色边框发光。

这是因为 Chrome 吗?

【问题讨论】:

  • 所以您知道这里发生了什么,当此代码运行时:$("#comment_btn"),如果该元素不存在,则不会选择任何内容,这意味着单击事件处理程序未附加到任何元素.我已经有几年没有使用过 jQuery Mobile,但是该框架的 AJAXy 特性意味着您不想使用 document.ready,而是使用 jQuery Mobile 特定事件之一,而不是在 AJAXy 环境中模仿 document.ready

标签: javascript jquery ajax jquery-mobile


【解决方案1】:

如何使用.on() 的委托风格:

$("body").on("click", "#comment_btn", function(){ ... });

.on() 的文档:http://api.jquery.com/on/

【讨论】:

  • .click.on 的快捷方式,不同之处在于您使用的是委托事件处理程序,而不是直接绑定到不存在的元素。
  • 向我解释一下“点击时”和点击时的区别
  • @CindyTurlington .click([callback]).on('click', [callback]) 的快捷方式。您正在寻找一个像this answer这样的委托事件处理程序,它使用这些参数:.on('click', [selector], [callback])。委托事件处理程序附加到您知道在代码运行时存在于 DOM 中的元素,body 始终存在因此它可以工作,您也可以使用document 对象:$(document).on([event], [selector], [callback])
  • @CindyTurlington 您能否将此答案标记为有用?谢谢
  • 为什么 innerHTML 分配不起作用,它在客户端,它在运行时可用
【解决方案2】:

将其更改为使用.on,这样所有动态元素都会得到处理。

$(document).on("click","#comment_btn",function(){ //click write_comment a tag btn
  console.log ("ready-comment_btn: clicked comment_btn");
    $.post("cgi-bin/s_comment.pl", {
        comment:"HELLO WORLD IN READY",
    },
    function(data,status){
      document.getElementById('div_comment').innerHTML = data;
    });
  }); 

【讨论】:

  • 您仍在尝试绑定到代码运行时可能存在或不存在的#comment_btn。如果你想使用事件委托,你需要改变你的语法。
  • 第一个代码示例在功能上仍然与问题中的代码相同,因此关于将.on 用于动态元素的说明不正确。
  • @Jaspersi .on 不会处理动态添加的元素?
  • 这取决于你如何使用它,在你的第一个例子中,不会。按照代码执行...首先您选择一个元素,但是等待,该元素不在 DOM 中,因此没有选择任何内容,因此事件绑定未绑定...在第二个示例中,您首先选择一个元素它总是存在的,所以这很好,然后你告诉 jQuery 将事件处理程序绑定到它,但只有当事件从与你作为第二个参数输入的选择器匹配的特定元素冒泡到 DOM 时才运行回调。
  • 那为什么要投反对票 :) ,你可以说第一个不行
猜你喜欢
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2011-11-21
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多