【问题标题】:How to make javascript in innerHTML work after an AJAX如何在 AJAX 之后使 innerHTML 中的 javascript 工作
【发布时间】:2015-05-10 15:05:57
【问题描述】:

我正在制作一个投票系统。用户单击这些按钮(div)后,将调用 ajax 将数据传递到另一个页面,执行 SQL 以插入会话 id、投票值、投票 id 并显示新的总数
这是我的 ajax

$('.like').on('click', function(){
    var voteclass=2;
    var vote_id=$(this).parent().attr("id");
    var poststr="voteclass="+voteclass+"&voteteacher="+vote_teacher;
    $.ajax({
    url:"insert.php",
    cache:0,
    data:poststr,
    success:function(result){
    $('#'vote_id).html(result);}  });   });

在 ajax 之后,insert.php 执行 SQL 并显示与 fontpage 相同的投票 div 内容但具有新的总值的结果。
我的问题是我不能再次投票刷新整个页面。这是否意味着 innerHTML 无法在外部(我不知道术语是什么)页面的 head 元素中加载脚本?我该如何解决?

【问题讨论】:

  • 两个问题:你使用'bind'而不是'on'有什么原因吗?并使用本机javascript: document.getElementById(...).innerHtml = ... 而不是 $('#'+vote_id).html(result)?
  • 感谢回复!! Jason Q1:我已将其更改为“on” Q2:我尝试了您提到的内容,但单击 2 次后仍然无法正常工作
  • 我意识到为什么我只能点击两次是 .html() 会去掉我原来的 html 有什么办法可以避免吗?
  • 你可以这样做:$('#'+vote_id).append(result)
  • 这里是我所说的一个 jsfiddle:jsfiddle.net/jasonwilczak/rtmo4093/33

标签: javascript php jquery ajax innerhtml


【解决方案1】:

我想我会添加一个答案:Working Fiddle

Javascript:

我将整个逻辑封装在一个 document.ready 中以确保 DOM 已完全加载,我假设您也在这样做。

我还使用了“on”而不是“bind”,因为这是他们当前库的 jQuery 首选方法。

我的 ajax 调用是 jsFiddle 的模拟 ajax 调用,但您可以将 url 替换为 index.php。

在成功中我使用了 $('.'+vote_id) 因为你得到了父级的'class',所以你需要一个'.'而不是 jquery 选择器中的“#”。如果我是你,我会将变量“vote_id”更改为“parentVoteClass”。

最后,我使用了“附加”,因为您不想丢失父标记中现有的 html。这会将结果中的值添加到父元素中现有 html 的末尾。如果你使用 prepend(result) 它将把它放在第一位,使用 .html(result) 将替换它。

 $(document).ready(function() {
        $('.like').on('click', function(){
            var vote_teacher = 1;
        var voteclass = 2;
        var vote_id = $(this).parent().attr("class");
        var poststr="voteclass="+voteclass+"&voteteacher="+vote_teacher;
        $.ajax({
            type: "POST",
            url: "/echo/json/",
            data: poststr,
            cache: false,
            success: function(result) {
                var someDatafromResult = "my stuff";
                $('.'+vote_id).append(someDatafromResult);
            }
        });
    });
});

HTML:

<div id="parent" class="parentClass">
<a href="#" class="like">Vote!</a>    
</div>

更新:

我修改了你的小提琴:Modified Fiddle

主要变化在这里:

function main(){
$('#something').on('click','.agree', function(){...code hidden...}

这允许您在父元素上绑定事件,而不是“#something”,您也可以使用文档。现在,如果您使用 'agree' 类的 html 被替换或炸毁,甚至仍然存在。

我在这里伪造了成功的php返回:

success:function(result){            
           $('#'+des_id+'').html('<li>text    <span class="votes_type ">    <a href="#!" class="agree">'+voteNumber+'<img src="png"></a>    <a href="#!" class="disagree">disagreenumber<img src="png"></a> </span>    </li>   ');
           ;}

我使用了一些内联字符串 html 来伪造一个 html 返回结果,然后使用变量“voteNumber”随着每次点击而增加,以表明它确实发生了变化并继续工作。

【讨论】:

  • 谢谢你一步一步指导我!!我接受您的建议并删除了 index.php 中的
    ,这样父子级别就不会更改以禁用我的 javascript,但现在我只能用 vote 的值点击两次vote_id 之后,javascript 对我的点击没有任何反应
  • 至于 HTML,我只是编造了一些我认为会模仿你的情况的东西。如果您可以在 JSFiddle.net 上创建一个小提琴,那将是非常棒的。您可以使用我的小提琴并对其进行修改或创建自己的。这可以帮助您了解您正在尝试做的事情。
  • php 不是我的母语,但让我看看并回复你
  • 我稍微修改了小提琴:jsfiddle.net/jasonwilczak/09xr8Lc4/17 我想这会对你有所帮助。如果您更新 html,则该事件绑定将消失 $('.agree').on('click'...)。因此,如果您要替换该部分,则需要在父级上绑定,在您的示例中,我在父级 div 上使用了“某事”ID。您也可以轻松使用文档。我删除了 php 特定的项目,以便小提琴可以正常运行。
  • 非常感谢您花这么长时间向我解释这些细节。我很感激!!!!事实证明,我只需要添加 parent() like $('#'des_id'').parent().html(result) 来解决我的问题。 Stackoverflow 应该发明一个 ''thank you x 100 times'' 按钮。我可以给点什么吗?
【解决方案2】:

你需要使用on()函数,更改:

$('.like').bind('click', function(){

$('body').on('click','.like', function(){

当然,我假设您向我们展示的 sn-p 脚本包含在:

$(document).ready(function(){
   ...
});

也改变这个:

var vote_id=$(this).parent().attr("class");

到:

var vote_id=$(this).parent().attr("id");

【讨论】:

  • 感谢回复!!!但是即使进行了更改,我的问题仍然存在,我仍然无法在投票后投票
  • 我可以看到 - 我更新了我的答案 - 你上课,然后你打电话给 getElementById,即使你有课,而不是 id
  • 感谢您一步一步指导我。我没有注意到sn-p中有这么多错误。但我做了你在我的原始脚本中提到的正确
【解决方案3】:

试试这个..

 $('.like').on('click', function(){
        var voteclass=2;
        var vote_id=$(this).parent().attr("class");
        var poststr="voteclass="+voteclass+"&voteteacher="+vote_teacher;
        $.ajax({
            url:"insert.php",
            cache:0,
            data:poststr,
            success:function(result){
                $('#vote_id').html(result);
            }
        });  
 });

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 2012-04-25
    • 2012-07-31
    • 1970-01-01
    相关资源
    最近更新 更多