Onclick добавить текстовое поле в div

В настоящее время у меня есть вызов ajax после того, как пользователь нажимает button на моей веб-странице.

Проблема заключается в том, что после отправки есть небольшая задержка (поскольку второй вызов ajax необходимо завершить, чтобы показать DIV), чтобы избежать небольшого запаздывания. Мне было интересно, можно ли добавить содержимое в 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 после нажатия кнопки, чтобы мой script не мог ждать ответа от недавно опубликованного статуса?


Update. Когда кнопка отправляется, она вызывает следующий код:

$(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

Ответ 1

Софи.

Сначала просмотрите этот фрагмент.

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

Я думаю, это jQuery:) Эта конструкция

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

служит для выполнения somecode(); когда DOM достигает "готового" состояния. Это означает, что somecode() будет выполняться только один раз, в событии документа "ready", а 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 с сервера, если нет - функция "success" не будет выполняться.

Если это не помогает, вы должны проверить все потоки данных, чтобы найти место, где они сломаны. Используйте консоль разработчика в своем браузере, чтобы узнать, что происходит с сервером и сервером в запросах ajax, чтобы найти проблему, а затем вы сможете легко устранить проблему.

Также у меня есть некоторые советы, чтобы сделать ваш код более чистым:

Попробуйте сделать более конкретные селектора для таких вещей:

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

Просто добавьте атрибут id (или класс, если у вас есть много кнопок) для соответствующего ввода, и сделайте так:

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

или

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

Также)) Попробуйте извлечь такие вещи, как:

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

из структуры HTML, если это не внутри формы или вы используете ajax. Я вижу, что вы используете UserID в js, поэтому лучшее решение здесь будет

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

Обратите внимание, что это лучше, но не оптимально. Google для "pass variable from php to 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" 

Это улучшит выполнение, уменьшив количество запросов БД.

Ответ 2

Кажется, что $('#output') отсутствует. Добавьте в свой HTML:

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

Вы заметите, что в консоли разработчика есть ошибка JavaScript, если это так.

Ответ 3

Кажется, вы не читаете правильные данные для добавления. Вы читаете элемент ввода, но вы должны читать из текстового поля.

Взгляните на это, просто очень просто: http://jsfiddle.net/ABFV9/

Итак, вы хотите получить предоставленные данные из текстового поля:

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

Ответ 4

Не позволяйте форме автоматически отправлять "по щелчку" (вы можете удалить поле действия из атрибутов формы). Пусть происходит вызов AJAX и добавьте $("#YourFormIdHere").submit(); в качестве последней строки вашей функции обратного вызова успеха в вызове ajax (Out здесь для вашего цикла). Он должен работать.

Ответ 5

Когда вы вызываете запросы statusupdate, вы должны возвращать пользователя и статус, закодированные в JSON, то функция callBack в вашей функции JQuery позволяет декодировать JSON и добавлять в ваш div

1) в statusupdate.php

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

2) callBack в JQuery

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

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

Ответ 6

Вы уверены, что используете правильный тип запроса между синхронными или асинхронными запросами AJAX?

  • С синхронными запросами вы ожидаете ответа сервера. Поэтому в некоторых случаях вы можете отключиться и не отвечать.
  • С асинхронными запросами вы не ожидаете ответа. Ответ будет обработан, когда сервер ответит.

Отметьте этот пост: jQuery: Выполнение синхронных запросов AJAX

Надеюсь, что это поможет.

Ответ 7

Для чего вам нужно setInterval?

Отвечая на ваш вопрос так просто, как я могу. Чтобы добавить текстовое поле в div, вам нужно привязать событие click к кнопке. Если вы хотите сделать это легко, вы можете написать вот так:

<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>

Взгляните на функцию reaady документа $(function (){}) Я объявил ее в начале, и вы в своем setInterval объявите ее несколько раз. Вам также нужно взглянуть на соглашение об именах, потому что ваши имена похожи друг на друга, и это затрудняет отладку кода.

Вы писали о задержке. Очевидно, что есть задержка, потому что это асинхронные методы, как AJAX. Вы всегда можете сделать синхронный вызов, вам просто нужно перейти к $.ajax(); param async:false, но я не рекомендую его.

Ответ 8

Сколько статусов возвращено из базы данных?

Я предполагаю, что у вас есть правильный код (сочетающий предыдущие ответы, которые были отправлены здесь), и все же существует задержка. Это может быть вызвано вызовом ajax, сделанным в setInterval, после добавления нового статуса в #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();
});

Вот простая демонстрация этого javascript (с рабочими xhr-запросами) на phpfiddle: 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);

Ответ 9

Я сделал рабочую демонстрацию из вашего кода. Надеюсь, он может решить вашу проблему. В любом случае, я бы порекомендовал вам потратить немного времени, чтобы прочитать о стиле 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/

(Вы должны изменить URL-адрес для запросов AJAX, чтобы заставить их работать)

Ответ 10

Здесь может быть несколько проблем. Я собираюсь начать этот ответ с некоторых советов по отладке, затем список мест для проверки.

Некоторые советы по отладке:

  • выведите несколько операторов debugger; в свой код
  • в chrome откройте инструменты разработчика и сделайте свой javascript пройденным через этот путь кода, например, нажмите кнопку. Код будет остановлен в операторах отладчика.
  • Исследуйте значения, переданные и выходящие из различных функций. Подтвердите предположения о том, какие вызовы вызываются и какая информация они получают.

Места для проверки:

  • убедитесь, что ваши обратные вызовы ajax на самом деле запущены. Тип mime с вашего сервера должен быть application/json. Если ваш обратный вызов ajax не запускается, его либо проблема с типом/ответом, либо отказ сервера какого-либо рода.
  • убедитесь, что $('# output') возвращает что-то. Попробуйте открыть консоль хром и введите ее, когда вы приостановили использование одного из этих операторов debugger;. Вы должны вернуть HTML-элемент.
  • Ваш обновленный код не указывает мне, что все происходит после завершения вызова ajax. Это намеренно/нормально? Вы должны указать аргумент success, если вы хотите, чтобы что-то произошло потом.

Ответ 11

Pajax - это простое решение для обновления содержимого на странице с помощью ajax-ответа, это позволит избежать многих повторных шагов, просто проверьте ниже ссылки

Также рассмотрите возможность использования шаблонов для генерации html, они являются красивым и более коротким способом заполнения html данными json.

Ответ 12

Извините, если я неправильно понял ваш вопрос, но это кажется относительно легким для меня. В #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 Если вам нужна дополнительная помощь, если я неправильно понял вопрос, lemme знаю в комментариях:)

Приветствия

Pranay