【问题标题】:onclick append textarea to divonclick 将文本区域附加到 div
【发布时间】:2013-05-21 21:20:42
【问题描述】:

在用户在我的网页上按下button 后,我目前有一个 ajax 调用..

问题是,在提交之后,会有一点延迟(因为需要完成第二个 ajax 调用才能显示 DIV)以避免轻微滞后。我想知道是否可以将内容附加到分区:

    <textarea name='Status'> </textarea>
    <input type='hidden' name='UserID' value="<?=$_SESSION['UserID']; ?>">
    <input type='button' value='Status Update'>
  <script>
  $(function () {
    $('input').on('click', function () {
        var Status = $(this).val();
       $('#output').append(Status);
});
  </script>

以上是我目前的代码配置。现在,这并没有按预期工作。它不会将提交的内容添加到 DIV 中。这是通过我的 ajax 调用显示的方式:

window.setInterval(function()
{
  $(function () 
  {
    $.ajax({                                      
        url: 'Ajax/AjaxStatuses.php', data: "", dataType: 'json',  success: function(rows)        
        {
        $('#output').empty();
            for (var i in rows)
            {
                var row = rows[i];          
                var User = row[0];
                var Status = row[1]
                    $('#output').append(''+
                    '<div class="small-3 large-2 columns "><img src="http://placehold.it/80x80&text=[img]" /></div>'+
                    '<div class="small-9 large-10 columns">'+
                        '<p><strong><a href="#">'+User+'</a>:</strong>'+Status+'</p>'+
                        '<ul class="inline-list">'+
                            '<li><a href="">Reply</a></li>'+
                            '<li><a href="">Share</a></li>'+
                        '</ul><hr>');
            } 
        } 
    });       
  });
 }, 1000);

和电话:

 include "../PHP/Database.php";
    $Array = array();

        $Query = $DB->prepare("SELECT UserID, Text FROM statuses Order BY ID DESC");
        $Query->execute();
        $Query->bind_result($ID, $Text);
        $Query->store_result();
        while($Query->fetch()){
            $Second_Query = $DB->prepare("SELECT Username FROM users WHERE ID=?");
            $Second_Query->bind_param('i',$ID);
            $Second_Query->execute();
            $Second_Query->bind_result($Username);
            $Second_Query->fetch();
                $Array[] = array ($Username, $Text);
            $Second_Query->close();         
        }
        $Query->close();

如何在按下按钮后将文本区域附加到 HTML div,这样我的脚本就不必等待来自新发布的状态的响应?


更新。提交按钮时,它会调用以下代码:

$(function () {
    $('input').on('click', function () {
        var Status = $(this).val();
        $.ajax({
            url: 'Ajax/StatusUpdate.php',
            data: {
                userid: $("input[name=UserID]").val(),
                text: $("textarea[name=Status]").val(),
                Status: Status
            },
            dataType : 'json'

        });
    });
});

处理ajax输入

【问题讨论】:

  • 旁注:建议不要在HTML代码中混用单引号和双引号。
  • @ShivanRaptor 注意了,但总体答案是什么?
  • 如果您不想等待 xhr 请求的响应,请在调用之前附加 div。如果你走这条路,你应该有一个指标,表明正在请求的数据。
  • 嗨 Sophie,您的代码中有语法错误。缺少结尾的小胡子: $(function () { $('input').on('click', function () { var Status = $(this).val(); $('#output').append (状态); } });
  • 你有几个输入元素。您通过 $('input') 定位其中哪一个?

标签: php javascript


【解决方案1】:

Pajax 是使用 ajax 响应更新页面内容的简单解决方案,它将避免大量重复步骤,只需查看以下链接

还可以考虑使用模板生成 html,它们是用 json 数据填充 html 的漂亮且更短的方式

【讨论】:

    【解决方案2】:

    抱歉,如果我误解了您的问题,但这对我来说似乎相对容易。在#output 中,有另一个包含状态的 div... 像这样:

    <div id = "output">
        <div id="statuses">
        ...
        </div>
    <textarea name='Status'> </textarea>
    <input type='hidden' name='UserID' value="<?=$_SESSION['UserID']; ?>">
    <input type='button' value='Status Update'>
    </div>
    

    那么,这里

    window.setInterval(function()
    {
      $(function () 
      {
        $.ajax({                                      
            url: 'Ajax/AjaxStatuses.php', data: "", dataType: 'json',  success: function(rows)        
            {
            $('#output').empty();
            for (var i in rows)
            {
                var row = rows[i];          
                var User = row[0];
                var Status = row[1]
                $('#output').append(''+
                    '<div class="small-3 large-2 columns "><img src="http://placehold.it/80x80&text=[img]" /></div>'+
                    '<div class="small-9 large-10 columns">'+
                        '<p><strong><a href="#">'+User+'</a>:</strong>'+Status+'</p>'+
                        '<ul class="inline-list">'+
                            '<li><a href="">Reply</a></li>'+
                            '<li><a href="">Share</a></li>'+
                        '</ul><hr>');
            } 
        } 
    });       
    });
    }, 1000);
    

    $('#output').empty(); 更改为$('#statuses').empty(); 这样一来,您就永远不会删除文本区域! :D

    还请查看 QArea 的帖子,因为您的语法中有许多其他错误,这些错误已在此处介绍。 :D 如果您需要更多帮助,如果我误解了这个问题,请在 cmets 中了解 :)

    干杯

    普拉奈

    【讨论】:

      【解决方案3】:

      我从你的代码中做了working demo。希望它可以解决您的问题。无论如何,我建议您花一点时间阅读有关 jQuery 和 JavaScript 编码风格的知识。

      首先,我们将修复点击按钮后应该更新状态的代码:

      <!-- TEXTAREA that we will update --> 
      <textarea name='Status'> </textarea>
      
      <!-- I didn't saw output DIV in your code. It should be present in HTML -->
      <div id='output'></div>
      
      <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
      
      <script>
      
       $(function(){
      
         // 1. Update on click:
         $('input').on('click', function () {
      
             var Status = $(this).val();
      
             // append content to the DIV
             $('#output').append(Status);
      
             // save content to the TEXTAREA
             $('textarea').val(Status);
         });
      
       }
      
      </script>
      

      您发出 AJAX 请求的代码看起来也不错,几乎可以正常工作。 我对它做了一些改动:

      <textarea id='status' name='Status'> </textarea>
      <div id='output'></div>
      <input type='button' value='Status Update'>
      
      <script id="AjaxStatusesTemplate" type="text/template">
      
        <div class="small-3 large-2 columns ">
          <img src="http://placehold.it/80x80&text=[img]" />
        </div>
        <div class="small-9 large-10 columns">
            <p><strong><a href="#">{{User}}</a>:</strong>{{Status}}</p>
            <ul class="inline-list">
                <li><a href="">Reply</a></li>
                <li><a href="">Share</a></li>
            </ul>
            <hr/>
         </div>
      
      </script>
      
      <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
      
      <script>
      
          // 2. Update by timer with 1 second delay: 
          function UpdateOutputWithAjaxStatuses(){
              var htmlTemplate = $('#AjaxStatusesTemplate').html();
              $.ajax({ url: 'http://your-server.com/Ajax/AjaxStatuses.php', data: '', dataType: 'json',
                success: function(rows){
                  $('#output').empty();
                  for (var i=0, row=rows[i]; i<rows.length;i++)
                  {     
                    var User = row[0];
                    var Status = row[1];
      
                    var html = htmlTemplate
                                 .replace('{{User}}', User)
                                 .replace('{{Status}}', Status);
      
                    $('#output').append(html);
                  } 
                },
                error: function(){
                    var now = new Date();
                    $('#output').html('error at '+now);
                },
                complete: function(){
                  setTimeout(UpdateOutputWithAjaxStatuses, 1000);
                }
              });       
          }
      
          // comment next line to stop autostart for ajax request scheduler
          UpdateOutputWithAjaxStatuses();
      
      </script>
      

      您可以在此处找到工作示例: http://jsfiddle.net/vmysla/XWuDf/6/

      (您应该更改 AJAX 请求的 URL 以使其正常工作)

      【讨论】:

        【解决方案4】:

        从数据库返回多少个状态?

        我假设您有正确的代码(结合之前在此处发布的答案)并且仍然存在延迟。这可能是由 setInterval 中的 ajax 调用引起的 - 在您将新状态附加到 #output 之后,它会被在 click 事件之前触发的请求覆盖。

        为防止您在单击按钮时可以中止xhr请求并清除间隔功能:

        $(function(){
        
        
            // interval reference and jQuery XHR object
            var ajaxInterval, jqxhr;
        
            // initialize fetching data from server
            function startPolling() {
                stopPolling();
                ajaxInterval = setInterval( function() {
                    jqxhr = $.ajax({                                      
                        url: location.href, 
                        data: {ajax: 1}, 
                        dataType: 'json',  
                        type: "GET",
                        success: function(result)        
                        {
                            // parse result and insert into #output
                            // ...
                        } 
                    });     
                }, 1000);
            }
        
            // clear interval and abort xhr request
            function stopPolling() {
                if(ajaxInterval)
                    clearInterval(ajaxInterval);
                if(jqxhr)
                    jqxhr.abort();
            }
        
        
            $('input').click(function(){
        
                // this prevents overwriting from old ajax call
                stopPolling();
        
                // insert into #output our new status
                var getText=jQuery("[name='Status']").val();
                $('#output').append('<div>'+getText+'</div>');
        
                // post status into server
                $.ajax({                                      
                    url: location.href, 
                    data: {ajax: 1, status: $("[name='Status']").val()}, 
                    dataType: 'json',  
                    type: "POST",
                    success: function(result)        
                    {
                        // parse result and insert into #output here
                        // ...
        
                        // restart fetching data
                        startPolling();
                    } 
                });     
            });
        
            // start fetching data
            startPolling();
        });
        

        这是 phpfiddle 上该 javascript(带有工作 xhr 请求)的简单演示: http://phpfiddle.org/lite/code/hn0-0e1

        但我想知道每个请求会获取多少个状态?将已经获取的状态存储在一个变量中并加载那些比我们已经拥有的最后一个更新的状态不是更好吗?就像 facebook 一样 - 当你打开你的墙时,它不会每 X 秒重新加载整个墙,而只是获取自上次调用以来添加的状态。

        只是一个快速的想法:

        $(function(){
        
        
            // interval reference and jQuery XHR object
            var ajaxInterval, jqxhr;
            var statuses = [];
        
            // initialize fetching data from server
            function startPolling() {
                stopPolling();
                ajaxInterval = setInterval( function() {
        
                    // get the newest stored id
                    var lastStatusId = 0;
                    if(statuses.length)
                        lastStatusId = statuses[0].id;
        
                    jqxhr = $.ajax({                                      
                        url: location.href, 
                        data: {ajax: 1, lastStatusId: lastStatusId}, 
                        dataType: 'json',  
                        type: "GET",
                        success: function(result)        
                        {
                            if(result.updateStatuses) {
                                // prepending the latest statuses to our variable
                                statuses = result.statuses.concat(statuses);
                                // merge repaint output
                                displayStatuses();
                            }
                        } 
                    });     
                }, 1000);
            }
        
            // clear interval and abort xhr request
            function stopPolling() {
                if(ajaxInterval)
                    clearInterval(ajaxInterval);
                if(jqxhr)
                    jqxhr.abort();
            }
        
        
            function displayStatuses() {
                var $output = $('#output');
                $output.empty();
        
                // parse statuses array of objects and 
                // insert the result in the #output
                // ...
            }
        
        
            $('input').click(function(){
        
                // this prevents overwriting from old ajax call
                stopPolling();
        
                // insert into #output our new status
                var getText=jQuery("[name='Status']").val();
                $('#output').append('<div>'+getText+'</div>');
        
                // get the newest stored id
                var lastStatusId = 0;
                if(statuses.length)
                    lastStatusId = statuses[0].id;
        
                // post status into server
                $.ajax({                                      
                    url: location.href, 
                    data: {ajax: 1, status: $("[name='Status']").val(), lastStatusId: lastStatusId}, 
                    dataType: 'json',  
                    type: "POST",
                    success: function(result)        
                    {
                        if(result.updateStatuses) {
                            // prepending the latest statuses to our variable
                            statuses = result.statuses.concat(statuses);
                            // merge repaint output
                            displayStatuses();
                        }
        
                        // restart fetching data
                        startPolling();
                    } 
                });     
            });
        
            // start fetching data
            startPolling();
        });
        

        所以你的 php 代码应该是这样的:

            $Query = $DB->prepare("SELECT Statuses.ID, Text, Username FROM statuses, users WHERE Username.ID = statuses.UserID AND statuses.ID > ? ORDER BY Statuses.ID DESC");
            $Query->bind_param('i',intval($_REQUEST['lastStatusId']));
            $Query->execute();
            $Query->bind_result($ID, $Text, $Username);
            $Query->store_result();
            $Array = array();
            while($Query->fetch()){
                 $Array[] = array ('id'=>$ID,'username'=>$Username, 'text'=>$Text);
            }
            $Query->close();
        
            // are there any new statuses?
            $result['updateStatuses'] = false;
            if( count($Array) )
                $result['updateStatuses'] = true;
        
            $result['statuses'] = $Array;
            echo json_encode($Array);
        

        【讨论】:

          【解决方案5】:

          你需要 setInterval 做什么?

          尽可能简单地回答您的问题。要将 textarea 附加到 div 您需要将单击事件绑定到按钮。如果你想轻松地做到这一点,你可以这样写:

          <script>
          $(function (){
            $("#btn_append").click(function (){
               //$("#output").html($("#mytext").val()); //overwrite text
               $("#output").append($("#mytext").val()); //append text
            });
          });
          </script>
          <input type="button" id="btn_append" value="append" />
          <textarea id="mytext"></textarea>
          <div id="output"></div>
          

          看一下文档准备函数$(function (){})我已经在开始时声明了它,而您在 setInterval 中多次声明了它。您还需要查看命名约定,因为您的名称彼此相似,这使得代码难以调试。

          你写了关于延迟的文章。很明显存在延迟,因为这些是 AJAX 所代表的异步方法。你总是可以进行同步调用,你只需要传递给$.ajax(); 参数async:false 但我不推荐它。

          【讨论】:

            【解决方案6】:

            这里可能存在许多问题。我将从一些调试技巧开始这个答案,然后列出要检查的地方。

            一些调试技巧:

            • 在你的代码中加入一些debugger; 语句
            • 在 chrome 中打开开发者工具并让您的 javascript 通过该代码路径,例如单击一个按钮。代码将在调试器语句处停止。
            • 调查传入和传出各种函数的值。确认关于被调用的各种函数以及它们接收到什么信息的假设。

            检查地点:

            • 确保您的 ajax 回调实际上正在运行。服务器的 mime 类型应该是 application/json。如果您的 ajax 回调没有运行,则可能是 mime/response 输入问题或某种服务器故障。
            • 确保 $('#output') 返回一些内容。尝试打开 chrome 控制台并在您暂停使用其中一个 debugger; 语句时输入。您应该取回一个 HTML 元素。
            • 您更新的代码并未向我表明在 ajax 调用完成后会发生任何事情。这是故意的吗?如果您希望之后发生某些事情,您应该指定 success 参数。

            【讨论】:

              【解决方案7】:

              您确定在同步或异步 AJAX 请求之间使用了正确类型的请求吗?

              • 对于同步请求,您正在等待服务器的回复。因此,在某些情况下,您可能会超时而没有响应。
              • 对于异步请求,您无需等待回复。响应将在服务器回复时进行处理。

              查看其他帖子:jQuery: Performing synchronous AJAX requests

              希望对您有所帮助。

              【讨论】:

                【解决方案8】:

                苏菲。

                首先,看看这个sn-p。

                window.setInterval(function()
                {
                  $(function () 
                  {
                      ...   
                  });
                 }, 1000);
                

                我猜这是 jQuery :) 这个结构

                $(function() { somecode(); }); 
                

                用于执行 somecode();当 DOM 达到“就绪”状态时。这意味着 - somecode() 只会在文档的“就绪”事件上执行一次,而这里的 setInterval 只是为该事件绑定函数执行。

                你应该改用这个结构:

                $(function () 
                {
                    window.setInterval(function()
                    {
                
                        somecode();
                
                    }, 1000);
                });
                

                第二:

                include "../PHP/Database.php";
                 $Array = array();
                        $Query = $DB->prepare("SELECT UserID, Text FROM statuses Order BY ID DESC");
                        $Query->execute();
                        $Query->bind_result($ID, $Text);
                        $Query->store_result();
                        while($Query->fetch()){
                            $Second_Query = $DB->prepare("SELECT Username FROM users WHERE ID=?");
                            $Second_Query->bind_param('i',$ID);
                            $Second_Query->execute();
                            $Second_Query->bind_result($Username);
                            $Second_Query->fetch();
                                $Array[] = array ($Username, $Text);
                            $Second_Query->close();         
                        }
                        $Query->close();
                

                这实际上并没有发送任何响应。如果这是所有代码,那么您应该添加

                echo json_encode($Array); 
                

                至少,得到任何回应。

                第三:

                $.ajax({  
                    url: 'Ajax/AjaxStatuses.php', data: "", dataType: 'json', ....
                

                dataType: 'json' 表示您应该从服务器发送一个有效的 JSON 字符串,否则 - “成功”函数将不会执行。

                如果这没有帮助,您应该检查所有数据流以找到它们被破坏的地方。使用浏览器中的开发者控制台查看 ajax 请求中的服务器和来自服务器的内容以定位问题,然后您将能够轻松解决问题。

                另外我有一些建议给你,让你的代码更干净:

                尝试为这样的事情制作更具体的选择器:

                $('input').on('click', function () {
                

                只需为相应的输入添加一个 id (或类,如果你有很多按钮)属性,然后像这样:

                $('#id').on('click', function () { ...
                

                $('.class').on('click', function () { ...
                

                另外))尝试提取如下内容:

                <input type='hidden' name='UserID' value="<?=$_SESSION['UserID']; ?>">
                

                超出 HTML 结构,如果这不在表单内或者您使用 ajax。我明白了,你在 js 中使用了 UserID,所以这里会有更好的解决方案

                <script type="text/javascript">
                   var UserID = "<?=$_SESSION['UserID']; ?>";
                </script>
                

                请注意,这只是更好,但当然不是最佳的。谷歌“将变量从 php 传递到 js”并选择最佳解决方案:)

                最后一个: 尝试发出单个 SQL 请求以从数据库中获取数据。例如:

                "SELECT UserID, Text FROM statuses Order BY ID DESC" 
                

                "SELECT Username FROM users WHERE ID=?" 
                

                您可以替换为:

                "SELECT statuses.UserID, statuses.Text, users.Username
                FROM statuses 
                INNER JOIN users ON users.ID = statuses.UserID
                Order BY ID DESC" 
                

                这将通过减少数据库请求的数量来提高性能。

                【讨论】:

                  【解决方案9】:

                  当您调用 statusupdate 查询时,您应该返回以 JSON 编码的用户和状态, 然后你的函数 JQuery 中的回调允许解码 JSON 并附加到你的 div 中

                  1) 在 statusupdate.php 中

                  return json_encode('status:{'.$Array.'});
                  

                  2) JQuery 中的回调

                  $.ajax{(
                  )}.done(function(status) {
                    var status = jQuery.parseJSON(status);
                    Userstatus = status.text;
                    UserName = status.username;
                  });
                  

                  3)$('#output').append('&lt;div class="status"&gt;&lt;span&gt;'+User +':&lt;/span&gt;&lt;a href="#"&gt;'+UserName+'&lt;span&gt;&lt;strong&gt;'+Userstatus+'&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;');

                  【讨论】:

                    【解决方案10】:

                    不要让表单“点击时”自动提交(您可以从表单属性中删除操作字段)。让 AJAX 调用发生并添加 $("#YourFormIdHere").submit(); 作为 ajax 调用中成功回调函数的最后一行(此处为 for 循环之外)。它应该可以工作。

                    【讨论】:

                    • 这不是使用提交。 HTML 输入甚至不在 &lt;form&gt; 标记中,因为这是通过 ajax/json 排序的
                    • 好吧,它们不需要在表格中。您始终可以使用$('#&lt;your wrapping div&gt;').serialize(); 来获取所有 HTML 输入的 post 格式值。然后用 AJAX 发送。通过将serialize() 的结果分配给data 字段
                    【解决方案11】:

                    您似乎没有读取要附加的正确数据。您正在从输入元素读取,但您应该从 textarea 读取。

                    看看这个,非常基本的: http://jsfiddle.net/ABFV9/

                    所以你想要的是通过以下方式从 textarea 中获取提交的数据:

                    var getText=jQuery("[name='Status']").val();
                    

                    【讨论】:

                    • 这不会附加到我的输出中。请阅读 cmets,我认为与 ajax 刷新有关
                    • 它附加到元素#output。我想我在这里没有得到任何东西。
                    • 正如我所说,我有一个恒定的 AJAX 调用,使用:window.setInterval 附加到同一个 DIV.. 所以我认为这就是问题所在
                    • 正如您在我的小提琴中看到的那样,您可以通过重复调用 $('#output').append 来添加任意数量的内容。我想告诉你的是,在你上面的脚本中,你正在调用 var Status = $(this).val();这里的'this'指的是输入元素,它没有值,而不是textarea。 '
                    • 我已经告诉过你,这仍有一点延迟。我的代码设置见pastebin.com/PExM7wjZ
                    【解决方案12】:

                    似乎$('#output') 不见了。添加到您的 HTML 中:

                    <div id="output"></div>
                    

                    如果出现这种情况,您会注意到开发者控制台中存在 JavaScript 错误。

                    【讨论】:

                    • 开发者控制台中是否有任何 JavaScript 错误? $('#output') 是在加载 jQuery 后初始化的吗?提示:使用document.ready
                    • 您能进一步解释一下吗?并且 $('#output') 被初始化,因为这也是我的 ajax 调用中附加的内容
                    • 试试console.log($('#output')。它是未定义的吗?用document.ready包围所有jQuery代码
                    猜你喜欢
                    • 1970-01-01
                    • 2015-11-25
                    • 2011-02-14
                    • 1970-01-01
                    • 2016-06-08
                    • 2014-09-03
                    • 2014-01-03
                    • 2013-08-19
                    • 1970-01-01
                    相关资源
                    最近更新 更多