За последние 24 часа нас посетил 18601 программист и 1688 роботов. Сейчас ищут 1636 программистов ...

При ajax запросе не видно dom элемента

Тема в разделе "JavaScript и AJAX", создана пользователем askanim, 31 мар 2017.

  1. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    HTML:
    1.     <title>REGISTER</title>
    2.     <script src="/Template/script/jquery-3.2.0.min.js"></script>
    3.  
    4. </head>
    5.     Имя
    6.     <input name="name" type="text" /><br />
    7.     <hr />
    8.     почта
    9.     <input name"email" type="text" /><br />
    10.     <hr />
    11.     Пароль
    12.     <input name="password" type="password" /><br />
    13.     <hr />
    14.     Повторите пароль
    15.     <input name="d_password" type="password" /><br />
    16.     <hr />
    17.  
    18.     <input type="submit" value="Регистрация"><br />
    19. </form>
    20. <div id="results">
    21.      <p>привет клуша</p>
    22. </div>
    23.     $("form").on("submit", function (event) {
    24.         event.preventDefault();
    25.         var msg = $('form').serialize();
    26.  
    27.         $.ajax({
    28.             type: 'POST',
    29.             url: 'http://matronet.com/register-welc',
    30.             data: msg,
    31.             dataType: "html",
    32.             success: function(data) {
    33.                 alert(data)// Это отрабатывает
    34.                 $('#results').html(data);  // Не работает
    35.                 document.getElementById("results").innerHTML = data; // Не работает
    36.                 document.getElementById("results").innerHTML = 'ДЕБИЛ ЧТОЛИ?'; // Не работает
    37.             },
    38.             error:  function(xhr, str){
    39.                 alert('Возникла ошибка: ' + xhr.responseCode);
    40.             }
    41.         });
    42.  
    43.  
    44.  
    45. <hr>
    46. Досвидания робокоп
    47. </body>
    48.  
    49. </html>
    Не отрабатывают метода вставки html какого - то хрена...
     
    #1 askanim, 31 мар 2017
    Последнее редактирование: 31 мар 2017
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @askanim ты обратился к id через # а надо для класса . (точку) и смотри, классов может быть несколько
     
  3. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @denis01 Ой не изменил сук... Но не в этом дело, результат тот же
    --- Добавлено ---
    А ещё угадайте в каком порядке отработают алерты )
    Код (Javascript):
    1.  function ajaxF(url, msg) {
    2.         alert(2);
    3.         $.ajax({
    4.             type: 'POST',
    5.             url: url,
    6.             data: msg,
    7.             dataType: "html",
    8.             success: function(data) {
    9.                 alert(3);
    10.                 alert(data);
    11.                 return data;
    12.             },
    13.             error:  function(xhr, str){
    14.                 alert('Возникла ошибка: ' + xhr.responseCode);
    15.             }
    16.         });
    17.     }
    18.     $("form").on("submit", function (event) {
    19.         event.preventDefault();
    20.         var msg = $('form').serialize();
    21.         var html = ajaxF('http://matronet.com/register-welc', msg);
    22.         alert(1);
    23.         /*alert(html);
    24.         $("#results").html(html);*/
    25.     });
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    2, 1, 3. Угадал?
     
    askanim нравится это.
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Правильно поулчается success отрабатывает у якса после прочтения всего html документа ?
    Я подозреваю моя проблема связана с тем что нужно обновить dom элемент, но как это сделать ?
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    success отрабатывается после окончания запроса к серверу, причем завершившегося удачно. Добро пожаловать в чудный, асинхронный мир )
     
    Fell-x27 и askanim нравится это.
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @romach то есть у меня html отрабатывается быстрее чем идёт запрос к серверу. Точно это же асинхронный запрос. Как я мог забыть.
     
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    а в консоли на что ругается?
     
  9. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @romach но суть не в этом как заставить эту магию работать ? :D
    --- Добавлено ---
    @romach он не ругается в консоли он просто не выводит в комментариях же в первом коде написал что работает а что нет)
    --- Добавлено ---
    @denis01 я просто пробовал ещё классы и сюда случайно добавил не изменив класс, на id, сюда выложил уже по не внимательности :D
     
  10. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
  11. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @romach а мне тут один фронт енд щик с конторы подсказал) И получилось хотите на результат посмотреть ?
    --- Добавлено ---
    @romach а ты мой скрипт попробуй :D
    --- Добавлено ---
    HTML:
    1.     <title>REGISTER</title>
    2.     <script src="/Template/script/jquery-3.2.0.min.js"></script>
    3.  
    4. </head>
    5.     Имя
    6.     <input name="name" type="text" /><br />
    7.     <hr />
    8.     почта
    9.     <input name"email" type="text" /><br />
    10.     <hr />
    11.     Пароль
    12.     <input name="password" type="password" /><br />
    13.     <hr />
    14.     Повторите пароль
    15.     <input name="d_password" type="password" /><br />
    16.     <hr />
    17.  
    18.     <input id="cli" type="submit" value="Регистрация"><br />
    19. </form>
    20. <div id="results">
    21.      <p>привет клуша</p>
    22. </div>
    23.     var data;
    24.     function ajaxF(url, msg) {
    25.         $.ajax({
    26.             type: 'POST',
    27.             url: url,
    28.             data: msg,
    29.             dataType: "html",
    30.             success: function(data) {
    31.                
    32.                 data = data;
    33.                 $("#results").html(data);
    34.             },
    35.             error:  function(xhr, str){
    36.                 alert('Возникла ошибка: ' + xhr.responseCode);
    37.             }
    38.         });
    39.     }
    40.     $("#cli").on("click", function (event) {
    41.  
    42.         event.preventDefault();
    43.         var msg = $('form').serialize();
    44.         ajaxF('http://matronet.com/register-welc', msg);
    45.        
    46.     });
    47.  
    48.  
    49.  
    50. <hr>
    51. Досвидания робокоп
    52. </body>
    53.  
    54. </html>
    --- Добавлено ---
    А вот и работающий скрипт тададададададаа
    --- Добавлено ---
    @romach только при указании внешной переменной робит)
     
  12. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    https://jsfiddle.net/cae5mca0/1/ - всё работает.

    блеать! Вот чую скоро придут Сурикат с Ганзалом и назовут всех нас идиотами.
    --- Добавлено ---
    ща, напишу в чем твой косяк ) и фронтендщика )
     
    eldor нравится это.
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Все дело в асинхронности.

    Пост: https://php.ru/forum/threads/pri-ajax-zaprose-ne-vidno-dom-ehlementa.62895/#post-510431
    Код (Javascript):
    1. function ajax() {
    2.   $.ajax({..., success: function(response) {
    3.     return response;
    4.   }})
    5. }
    6.  
    7. var result = ajax();
    Тут ты ожидаешь, что функция вернет тебе результат, но этого никогда не произойдет. Потому как success выполнится после завершения запроса и return уйдет в никуда, т.к. к этому моменту ajax() уже давно выполнился и вернул пустоту. Если же сделать return $.ajax - то все равно ничего не выйдет, вернется promise, а не результат запроса. Собственно это правильно, альтернатива - повесить процесс в ожидании запроса, что естественно делать ни кто не будет.

    В последнем варианте фронтендщик предложил тебе поднять область видимости переменной, правда криво, т.к. на самом деле ничего не изменилось и function(data) перекрыла ту data что выше. Очевидно где-то у него это проканало, примерно так:
    Код (Javascript):
    1. var foo;
    2. function set(bar) {
    3.    foo = bar;
    4. }
    5. set(5);
    6. console.log(foo);
    Так вот, если тайминги сойдутся и боги асинхронности в хорошем настроении, то всё вроде как прокатит: данные передались и обработались. Если же нет - то получим веселый и трудноуловимый глюк. Как-то вот так:
    Код (Javascript):
    1. var foo;
    2. function set(bar) {
    3.    foo = bar;
    4. }
    5. setTimeout(set.bind(this, 5), 1);
    6. setTimeout(function() { console.log(foo) }, 2);
    7. // 5
    8. setTimeout(set.bind(this, 4), 2);
    9. setTimeout(function() { console.log(foo) }, 1);
    10. // 5
    11. setTimeout(function() { console.log(foo) }, 3);
    12. // 4
    Почему стало работать? Потому что в последнем примере $("#results").html(data); выполняется сразу после получения данных.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Я тебе больше скажу, даже если бы произошло, результат возвращается в success-коллбэк и там же помирает. Ретурны вне коллбэков вообще ничего не дадут. По этому и накостылили они внешнюю переменную. А ведь можно было просто почитать документацию по JQuery ajax, чтобы понять, что там за коллбэки, когда вызываются, как работают, что принимают.

    А еще лучше почитать вообще документацию по AJAX и асинхрону. Коллбэки, промисы, это вот все.
     
  15. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @Fell-x27, ну собсно да, просто я как-то коряво это процесс описал )

    p.s. как хорошо с реактом, собрал данные, сделал setState() и оно перерисовалось где нужно. ми-ми-ми
     
  16. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Ненавижу js
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1)Коллбэки были не в JS придуманы. Это один из самых древних способов написания асинхронного кода.
    2)Тот факт, что AJAX асинхронен, как бы следует из его аббривеатуры.
    3)То, что ты это не знал, не проблема JS.
    4)Сначала изучи язык, потом пользуйся.
    5)Ты еще и JS-а то не видел. Так, чуток в замочную скважину заглянул, одним глазком. Мельком. Да и то через розовые копипастовые очки JQuery, хехе.
    6)Вот когда дорастешь до замыканий хотя бы,а, конкретнее, до сознательного их применения и понимания, тогда поговорим.
     
  18. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    к слову, caolan/async делает эти ваши асинхронности очень даже удобными )
     
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Можно в двух словах, чем оно удобнее нативного промиса? Или оно появилось еще до того, как промисы завезли прост?
     
  20. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    @Fell-x27 промисы - это когда тебе надо выполнить последовательность действий. caolan/async же полезен когда тебе нужно выполнить ряд таких последовательностей в цикле и желательно в несколько потоков. Тогда ты делаешь async.eachLimit(items, 4, function i(item, callback) {// do stuff}, function() {//complete}) и не паришься )

    Впрочем, я не представляю как это может быть полезно на фронте )
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Да, такие же мысли появились. Но все равно, спасибо, мб пригодится когда-нибудь, когда у меня руки дойдут до ноды.
     
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    в php я использую замыкания :)
    И это я использовал в php.
    Но я про другое, в js страдает логика, как вот в примере который я приводил, но я сужу только потому как работает вообще в принципе логика) Ведь алгоритмы строятся на логике)
     
  23. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @Fell-x27 Я как бы про них знаю читал видел, использовал. Но я не совсем понимаю почему замыкание, почему callback можешь объяснить. Асинхронность я понимаю что такое. Это выполнения действия паралельно (Ну как то так если своими словами). Кэлбэк функция - это вызов функции по завершении . замыкание как я вижу из php это передача в функцию внешних переменных. Но я опять же не догоняю их предназначения что замыкания что callback вызовов. Если можешь объясни пожалуйста. Ну в асинхроне понятно зачем кэлбэк нужен. У нас получается как пошёл запрос а код ушёл дальше. Всё логично. А потом по завершению запроса сработал callback. И в теории он должен выполнится.
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    В примере, который ты привел, логика крепче, чем Эйфелева Башня.

    1) Послать запрос.
    2) Если успешен - вызвать succsess-коллбэк.
    3) Если пофейлен - вызвать error-коллбэк.
    4) Если указан финализирующий коллбэк - вызвать его в конце работы, независимо от результатов.

    Я хз, что нелогичного ты тут нашел. Это же обычная событийная модель. А каждый коллбэк - это обработчик события. Нелогично то, что ты пытался там творить.

    Ты же даже в php умудряешься юзать замыкания(зачем??7??7??, может ты их с анонимными функциями путаешь?) и коллбэки. Но при этом не знаешь, что это?
    Нет. Не обязательно. Параллелизм - это распределение задачи по разным потокам. Асинхронизм же может работать и в одном потоке без проблем. JS в браузере, к примеру, по умолчанию однопоточный. Суть асинхронного кода в том, что, при выполнении некоторой инструкции, система не будет ждать ее завершение, а сразу перейдет к следующей. При этом процессорное время асинхронных задач смешивается и перемежается. Благодаря этому у нас есть в JS такой инструмент как setTimeout(function(){},0); Он ставит некую переданную инструкцию(анонимную функцию, в данном случае), в самый конец очереди задач в потоке. Новичок посмотрит на этот сетТаймаут, и подумает, что это глупость, потому что какой смысл указывать его нулевым, если можно просто сделать (function(){})(). Опытный же JS-ник значет, что эта конструкция значит не "выполни прямо сейчас", а "выполни, как только появится свободное процессорное время, но не ранее того, и без задержек от того момента, пожалуйста". Это часто очень пригождается.

    Коллбэк вызывается не обязательно по завершению чего-либо. Коллбэк - это просто некая функция, которая дергается в процессе работы. При этом она не прописана жестко и, обычно, является параметром. Есть же всякие array_функции, которые принимают callback в качестве параметра и используют его для каждого элемента массива. Некий код, который ты отдаешь куда-то с целью его выполнения при определенных условиях.

    То есть в случае:
    Код (Javascript):
    1. function foo(){
    2. alert("pewpew");
    3. }
    4.  
    5. function bar(){
    6. //do something
    7. foo();
    8. }
    9.  
    10. bar(); //alert "pewpew"
    Функция foo не является коллбэком. Хоть она и вызывается после чего-то там. Это просто функция. Она просто вызвана в другой функции.

    А вот другой случай:
    Код (Javascript):
    1. function bar(variable, callback){
    2. //do something
    3. if (variable>1){
    4.   callback();
    5. }
    6. }
    7.  
    8. bar(2,function(){
    9. alert("pewpew");
    10. });
    Вот тут уже работаем с коллбэком. Он не зашит в теле вызываемой функции. Мы можем его указать отдельно для каждого вызова.

    Передача в функцию внешних переменных - это вызов функции с параметрами.

    Замыкания - это создание функции, которая сохраняет при этом свой local scope. В JS это жизненная необходимость в силу специфики его работы. В PHP, если тебе нужно замыкание, то у тебя, скорее всего, что-то пошло не так, ИМХО.
     
    askanim и mahmuzar нравится это.
  25. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    насколько я знаю в php замыкание, это использование use. Да я это и имел ввиду просто не правильно объяснил. Но спасибо благодаря тебе я понял больше. Но тут складывается зачем все framework используют замыкания. Это например пример из slim, причём пример из доки.
    PHP:
    1. $app->group('/admin', function () use ($app) {
    2.  
    3.         $app->get('/date', function (Request $request, Response $response) {
    4.             return $response->getBody()->write(date('Y-m-d H:i:s'));
    5.         });
    6.         $app->get('/time', function (Request $request, Response $response) {
    7.             return $response->getBody()->write(time());
    8.         });
    9.     })->add(function (Request $request, Response $response, $next) {
    10.         if(!isset($_SESSION['user_id'])) {
    11.             return $response->withStatus(302)->withHeader('Location', '/login');
    12.         }
    13.         $response->getBody()->write('It is now ');
    14.         $response = $next($request, $response);
    15.  
    16.         $response->getBody()->write('. Enjoy!');
    17.  
    18.         return $response;
    19.     });
    При чём этот пример использует в php как замыкание так и функцию обратного вызова, callback а именно $next()

    Кэлл бэки я использвал, просто я не знал что это называется кэлл бэком.
    Я с помощью кэлл бэка реализовал в своём движке функцию групп маршрутов. Как в принципе она реализована во многих framework или по другому если я всё правильно понимаю middleware