Выполнить код JavaScript после запроса $_POST в php

Я хочу разместить маркер на карте с геокодированием. Я получил рабочий код для этого:

$(document).ready(function(){
    $('#submit').click(function(){
        var address = document.getElementById("address").value + ", CH";
        geocoder.geocode(
            {'address': address},
        function(results, status){          
            if(status == google.maps.GeocoderStatus.OK)
                {
                    map.setCenter(results[0].geometry.location);
                    var marker = new google.maps.Marker(
                    {
                        map: map,
                        position: results[0].geometry.location,
                        title: 'Sie suchten nach:' + ' ' + address
                    });
                }

            else if(status == google.maps.GeocoderStatus.ZERO_RESULTS){
                window.alert = function(){}
            }

            else
            {
                alert("An unknown error occured. Refresh the page or contact the IT team! Error: '" + status + "'");
            }
    });
});

И я получил эту форму HTML:

<form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
    <input type="text" id="address" name="address" placeholder="Enter a zip code" style="width:250px;" onkeypress='filterTextbox(event)' />
    <input type="submit" id="submit" name="submit" value="Submit" />
</form>

Если я ударил submit он должен отправить мой запрос на сервер с $_POST а затем пришлите мне ответ. После этого я хочу выполнить JavaScript код. Итак, я сделал это:

<?php
    if(isset($_POST['submit'])){
            echo "<script>
            $(document).ready(function(){
                var address = document.getElementById('address').value + ', CH';
                geocoder.geocode(
                {'address': address},
                function(results, status){          
                    if(status == google.maps.GeocoderStatus.OK){
                        map.setCenter(results[0].geometry.location);
                        var marker = new google.maps.Marker({
                            map: map,
                            position: results[0].geometry.location,
                            title: 'Sie suchten nach:' + ' ' + address
                        });
                    }

                    else if(status == google.maps.GeocoderStatus.ZERO_RESULTS){
                        window.alert = function(){}
                    }

                    else{
                        alert('An unknown error occured. Refresh the page or contact the IT team! Error: '' + status + ''');
                    }
                });
            });
        </script>";
        }
    }
?>

Он отправляет мне ответ (обновление страницы из-за action) но тогда он не выполняет JavaScript код. JavaScript Код предназначен для размещения маркера на месте того, что пользователи набрали в текстовом поле. И это работает нормально, если я выполню это "нормально".

Надеюсь, вы понимаете, о чем я

4 ответа

У вас есть синтаксические ошибки

alert('An unknown error occured. Refresh the page or contact the IT team! Error: '' + status + ''');

должно быть

alert('An unknown error occured. Refresh the page or contact the IT team! Error: \'' +  status + '\'');

Другой вероятной причиной является то, что функция геокодера еще не была инициализирована к моменту готовности документа.

Где-то ранее на странице вы должны иметь код, который выглядит примерно так:

google.maps.event.addDomListener(window, 'load', initialize);
function initialize() {
  geocoder = new google.maps.Geocoder();
}

Вы должны запустить свой сценарий в этот момент.

Вы можете убедиться, что ваш скрипт будет запущен так:

// Where you load geocoder
var race_won = false;
var load_php_script = function() {
  race_won = true;
};
google.maps.event.addDomListener(window, 'load', initialize);
function initialize() {
  geocoder = new google.maps.Geocoder();
  load_php_script();
}

// Replace document.ready with this:
var php_script = function() {
  // .. your old document ready code here ..
}
if (race_won) {
  php_script();
}
else {
  load_php_script = php_script;
}

Вы уверены, что включили JQuery в ответ? Вы уверены, что элемент id="address" существует? Консоль разработчика браузера сообщает об ошибке? Используйте точки останова и посмотрите, что происходит.

Используйте ajax-запрос и запустите ваш JS-код после успешного выполнения этого запроса.

Вы используете jQuery, поэтому вы можете использовать:

$('#yourform-id').on('submit', function(event) {
    $.ajax('/your/url/here', {
        type: 'post',
        data: { zipcode: $('#address').val() }
    }).done(function() {
        /* your JS code after successful request goes here */
    });

    event.stopPropagation();
}

РЕДАКТИРОВАТЬ: Вы можете сделать это также без запроса AJAX. Но важно зарегистрировать .on('submit', function(event) { /* your geocode JS code here */ event.stopPropagation(); } событие в вашей форме, поэтому форма не отправляется.

event.stopPropagation() останавливает вашу форму от перезагрузки страницы и отправки данных формы через HTTP. В более ранних версиях jQuery вы вернулись false но это не рекомендуется сейчас.

Поэтому добавьте этот код в файл HTML, где находится и ваша форма:

$(function() { // on ready
    $('#yourform-id').on('submit', function(event) {
        var address = document.getElementById('address').value + ', CH';
        geocoder.geocode({'address': address}, function(results, status){          
            if(status == google.maps.GeocoderStatus.OK){
                map.setCenter(results[0].geometry.location);
                var marker = new google.maps.Marker({
                    map: map,
                    position: results[0].geometry.location,
                    title: 'Sie suchten nach:' + ' ' + address
                });
            } else if(status == google.maps.GeocoderStatus.ZERO_RESULTS){
                window.alert = function(){}
            } else{
                alert('An unknown error occured. Refresh the page or contact the IT team! Error: '' + status + ''');
            }
        });

        event.stopPropagation();
    });
});

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

Объяснение: при нажатии кнопки "Отправить" больше не будет обновляться страница, а адрес из поля ввода будет отправлен на geocode функция, которая сделает вызов AJAX и при успехе status == google.maps.GeocoderStatus.OK выполнит код из того, если.

<div>
     <input type="text" id="address" placeholder="Enter a zip code" style="width:250px;" onkeypress='filterTextbox(event)' />
      <input type="button" id="submit" value="Submit" />
</div>


 $('#submit').click(function(){
            var address = document.getElementById('address').value + ', CH';
            geocoder.geocode(
            {'address': address},
            function(results, status){          
                if(status == google.maps.GeocoderStatus.OK){
                    map.setCenter(results[0].geometry.location);
                    var marker = new google.maps.Marker({
                        map: map,
                        position: results[0].geometry.location,
                        title: 'Sie suchten nach:' + ' ' + address
                    });

                    // save the address in database

                       $.ajax ({
                           url: "saveAddress.php",
                           data: {'address': address},
                           success: function() {  //
                                 alert("Should be saved in database");
                           }
                       });


                }

                else if(status == google.maps.GeocoderStatus.ZERO_RESULTS){
                    window.alert = function(){}
                }

                else{
                    alert('An unknown error occured. ');
                }
            });
        });
Другие вопросы по тегам