【问题标题】:Inserting html with jquery doesn't work用jquery插入html不起作用
【发布时间】:2010-10-07 20:33:14
【问题描述】:

我正在构建一个简单的喊话箱。

这是html:

<div id="shoutbox">    
    <form method="post" id="form" class="shoutbox-form">
        <table>
            <tr>
                <td><label>User</label></td>
                <td><input class="text user" id="nick" type="text" MAXLENGTH="25" /></td>
            </tr>
            <tr>
                <td><label>Message</label></td>
                <td><input class="text" id="shout" type="text" MAXLENGTH="255" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input id="send-shout" type="submit" value="Dodaj!" /></td>
            </tr>
        </table>
    </form>
    <div id="shoutbox-container">
        <span class="clear"></span>
        <div class=".shoutbox">
            <div id="shoutbox-loading"><img src="css/images/loading.gif" alt="Loading..." /></div>
            <ul>
            </ul>
        </div>
    </div>
</div

>

这是js代码:

$(document).ready(function(){
    var inputUser = $("#nick");
    var inputMessage = $("#shout");
    var loading = $("#shoutbox-loading");
    var messageList = $(".shoutbox > ul");

    function updateShoutbox(){
        messageList.hide();
        loading.fadeIn();
        $.ajax({
            type: "POST", 
            url: "/shouts/", 
            data: "action=refresh",
            success: function(data){
                var data = JSON.parse(data);
                loading.fadeOut();
                messageList.html(data["response"]);
                messageList.fadeIn(2000);
            }
        });
    }
});

但显然 messageList.html(data["response"]) 不起作用,尽管 firebug 显示我的响应是:

{"response": "&lt;li&gt;&lt;strong&gt;user1&lt;/strong&gt;&lt;img src=\"\" alt=\"\" &gt;test&lt;span class=\"date\"&gt;2010-10-07 19:36:13&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;user2&lt;/strong&gt;&lt;img src=\"\" alt=\"\" &gt;test2&lt;span class=\"date\"&gt;2010-10-07 20:23:56&lt;/span&gt;&lt;/li&gt;"}

如果不是 success 在 ajax 我有 complete 我得到 var data = JSON.parse(data); 错误。任何想法可以改变什么来解决这个问题?

更新:

添加:

    var c = data["response"];
    console.log(c);

给我:
&lt;li&gt;&lt;strong&gt;user1&lt;/strong&gt;&lt;img src="" alt="" &gt;test&lt;span class="date"&gt;2010-10-07 19:36:13&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;user2&lt;/strong&gt;&lt;img src="" alt="" &gt;test2&lt;span class="date"&gt;2010-10-07 20:23:56&lt;/span&gt;&lt;/li&gt; 在萤火虫控制台中。

【问题讨论】:

    标签: jquery ajax insert innerhtml


    【解决方案1】:

    没有其他人注意到您的 html 中的错误。

    <div class=".shoutbox">
    

    应该是:

    <div class="shoutbox">
    

    解决这个问题,看看你的 jQuery 东西是否有效。

    EDIT 正如其他答案中提到的,您还应该将响应类型设置为 JSON。这将避免您必须在数据上使用JSON.parse()。但鉴于您在响应数据上使用了JSON.parse(),这不是必需的。

    【讨论】:

    • ... 除非没有可用的 JSON 对象,例如在 IE 6 和 7 中。 (而且是类名的好地方。)
    【解决方案2】:

    我得到 var data = JSON.parse(data);错误

    您引用的响应不是 JSON,是吗?它是 HTML。直接插入就可以了。

    【讨论】:

    • Poster 正在使用 JSON.parse() 解析响应(技术上 JSON)并使数据成为对象。无法直接附加/插入具有所需效果的对象。
    • @sholsinger aww,你说得对,出于某种原因,我完全忽略了 {"response": 部分。 +1 为您的答案,似乎是要走的路
    • 在检查了所有答案之后,这似乎确实是个问题。但是我该如何解决呢?将 data["response"] 转换为字符串不起作用:/
    • @mastodon 不,应该没问题,我错了。即使您可以将类型更改为 JSON 以保存解析,响应也可以。如果@sholsinger的方法不起作用,那么你需要检查var messageList = $(".shoutbox &gt; ul");是否存在!
    • 好的解决了这个问题。 sholsinger,如果您将此评论添加为答案,我将给予您一分。在将完成更改为成功并创建一个变量来存储响应数据后一切正常。
    【解决方案3】:

    你应该将你的调用设置为dataType:

    $.ajax({
        type: "POST", 
        url: "/shouts/", 
        data: "action=refresh",
        dataType: 'json',
        success: function(data){
            loading.fadeOut();
            messageList.html(data["response"]);
            messageList.fadeIn(2000);
        }
    });
    

    这会让 jQuery 自动解析 JSON 并将数据作为返回的对象提供给您。

    这可能会解决您的问题。至少它会为您处理 JSON 解释并防止跨浏览器问题。

    【讨论】:

      【解决方案4】:

      正确答案:

      $(document).ready(function(){
          var inputUser = $("#nick");
          var inputMessage = $("#shout");
          var loading = $("#shoutbox-loading");
          var messageList = $(".shoutbox > ul");
      
          function updateShoutbox(){
              messageList.hide();
              loading.fadeIn();
              $.ajax({
                  type: "POST", 
                  url: "/shouts/", 
                  data: "action=refresh",
                  dataType: "json",
                  success: function(data){
                      loading.fadeOut();
                      var c = data["response"];
                      console.log(c);
                      messageList.html(c);
                      messageList.fadeIn(2000);
                  }
              });
          }
      

      【讨论】:

      • 您是否已将 HTML 修复为没有 .shoutbox 类?
      【解决方案5】:

      我喜欢跟进最新的插件

      为什么您不只以 JSON 格式做出响应,然后用新的jQuery Templating Plugin 填充它们

      有关使用此插件的更多信息

      http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-working-with-the-official-jquery-templating-plugin/

      【讨论】:

      • 建议使用 more jQuery 的东西(eg 插件)是不负责任的。
      猜你喜欢
      • 2011-01-03
      • 2018-04-20
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 2014-03-26
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多