Как отменить событие в window.beforeunload? [Дубликат]

Прежде всего,

У вас может быть много параметров для функции mail () ... У вас может быть 5 макс. mail(to,subject,message,headers,parameters); Что касается переменной $from, которая должна автоматически поступать с вашего веб-хостинга, если вы используете linux cPanel. Он автоматически исходит из вашего имени пользователя и ip-адреса cPanel.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = 'contact@yoursite.com'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Также убедитесь, что у вас есть правильный порядок переменных в вашей функции mail (). mail($to,$subject,$message,etc.) в этом порядке, иначе есть шанс, что он не сработает. Дайте мне знать, если это поможет ...

2
задан NightOwl888 21 February 2016 в 13:33
поделиться

3 ответа

Это возможно, но только если пользователь нажимает гиперссылку на странице. Если пользователь использует браузер для перехода от страницы, он получит диалоговое окно браузера по умолчанию, в котором нет возможности сохранить.

Dirty Forms автоматически присоединяет (и удаляет обработчик) beforeunload, поэтому ваша попытка создать другой обработчик событий, безусловно, потерпит неудачу. Вы никогда не должны делать этого при использовании Dirty Forms.

Вы не указали, какую модальную структуру диалога вы хотели использовать, поэтому я просто покажу пример с использованием диалогового окна JQuery UI. Интеграция других диалоговых фреймворков аналогична. Для этого вы можете проверить исходный код существующих предварительно построенных диалогов .

Кроме того, ваш случай использования немного кратковременен. Что делать, если пользователь хочет уйти и игнорировать изменения? Я добавил пример, который включает в себя дополнительную возможность сделать именно это.

<html>
<head>
    <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/jquery.ui/1.11.3/jquery-ui.min.css" />
</head>
<body>

    <script type="text/javascript" src="//cdn.jsdelivr.net/g/jquery@1.11.3,jquery.ui@1.11.3,jquery.dirtyforms@2.0.0"></script>
    <script type="text/javascript">
    $(document).ready(function() {
        // This is required by jQuery UI dialog
        $('body').append('<div id="dirty-dialog" style="display:none;" />');

        // This must be called before the first call to .dirtyForms
        $(document).bind('bind.dirtyforms', function (ev, events) {
            var originalOnRefireClick = events.onRefireClick;

            events.onRefireClick = function (ev) {
                if (saveForm) {
                    // TODO: Replace this with your AJAX function
                    // to save the form.
                    alert('saving form...');
                }
                originalOnRefireClick(ev);
            };
        });

        // Flag indicating whether or not to save the form on close.
        var saveForm = false;

        $('.mainForm').dirtyForms({
            dialog: {
                // Custom properties to allow overriding later using 
                // the syntax $.DirtyForms.dialog.title = 'custom title';

                title: 'Are you sure you want to do that?',
                proceedAndSaveButtonText: 'Save Changes & Continue',
                proceedAndCancelButtonText: 'Cancel Changes & Continue',
                stayButtonText: 'Stay Here',
                preMessageText: '<span class="ui-icon ui-icon-alert" style="float:left; margin:2px 7px 25px 0;"></span>',
                postMessageText: '',
                width: 650,

                // Dirty Forms Methods
                open: function (choice, message) {
                    $('#dirty-dialog').dialog({
                        open: function () {
                            // Set the focus on close button. This takes care of the 
                            // default action by the Enter key, ensuring a stay choice
                            // is made by default.
                            $(this).parents('.ui-dialog')
                                   .find('.ui-dialog-buttonpane button:eq(2)')
                                   .focus();
                        },

                        // Whenever the dialog closes, we commit the choice
                        close: choice.commit,
                        title: this.title,
                        width: this.width,
                        modal: true,
                        buttons: [
                            {
                                text: this.proceedAndSaveButtonText,
                                click: function () {
                                    // Indicate the choice is the proceed action
                                    choice.proceed = true;

                                    // Pass a custom flag to indicate to save the data first
                                    // in the onRefireClick event
                                    saveForm = true;

                                    $(this).dialog('close');
                                }
                            },
                            {
                                text: this.proceedAndCancelButtonText,
                                click: function () {
                                    // Indicate the choice is the proceed action
                                    choice.proceed = true;
                                    // Pass a custom flag to indicate not to save the data
                                    // in the onRefireClick event
                                    saveForm = false;

                                    $(this).dialog('close');
                                }
                            },
                            {
                                text: this.stayButtonText,
                                click: function () {
                                    // We don't need to take any action here because
                                    // this will fire the close event handler and
                                    // commit the choice (stay) for us automatically.
                                    $(this).dialog('close');
                                }
                            }
                        ]
                    });

                    // Inject the content of the dialog using jQuery .html() method.
                    $('#dirty-dialog').html(this.preMessageText + message + this.postMessageText);
                },
                close: function () {
                    // This is called by Dirty Forms when the 
                    // Escape key is pressed, so we will close
                    // the dialog manually. This overrides the default
                    // Escape key behavior of jQuery UI, which would
                    // ordinarily not fire the close: event handler 
                    // declared above.
                    $('#dirty-dialog').dialog('close');
                }
            }
        });
    });
    </script>

    Change one of the fields below, then click "Go to Google" to try to navigate away.

    <form class="mainForm" action="jqueryui.html">
        First name: <input type="text" name="fname"><br>
        Last name: <input type="text" name="lname"><br>
        <input type="submit" value="Submit">
    </form>

    <a href="http://www.google.com/">Go to Google</a>

</body>
</html>

В примере используется привязка пользовательских событий для присоединения к обработчику событий onRefireClick, который если choice.proceed = true, но не когда false.

2
ответ дан NightOwl888 23 August 2018 в 02:34
поделиться

Мне кажется, вам просто нужно вызвать preventDefault для события.

 $(window).bind('beforeunload', function(e){
        // check if any field is dirty 
        if ($('div.form').dirtyForms('isDirty')) {
            var modalParams = {
                Content: 'You have some unsaved changes, proceed?'
                OnSave: navigateAndSave,
                OnCancel: e.preventDefault();
            }
           ShowModal(modalParams);
        }
    })

function navigateAndSave() {
    // Do stuff
};
-1
ответ дан Phil 23 August 2018 в 02:34
поделиться

Это невозможно.

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

Пожалуйста, просмотрите эту ссылку для получения дополнительной информации : https://developer.mozilla.org/en-US/docs/Web/API/WindowEventHandlers/onbeforeunload

window.onbeforeunload = funcRef
  • funcRef является ссылкой на функцию или выражение функции.
  • Функция должна назначить строковое значение для свойства returnValue объекта Event и вернуть ту же строку.

Пример:

window.onbeforeunload = function(e) {
    return 'Dialog text here.';
};

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

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

Событие beforeunload создано таким образом, чтобы защитить пользователей от вредоносных скриптов.

Если разрешено такое управление, кто-то может заблокировать ваш браузер в

Изменить.:

Мне удалось показать диалоговое окно подтверждения, которое работает почти так же, как вы хотите, присоединение к 2 событиям beforeunload и unload. Он работает в Internet Explorer 11, Firefox 40 и Safari 5.1 для Windows (что я могу подтвердить прямо сейчас):

var alreadyTriggered = false;

function onQuit() {
  if (alreadyTriggered) return true;
  alreadyTriggered = true;

  if (confirm('Sure?')) {
    alert('OK');
  } else {
    alert('Cancel');
  }
}

window.onbeforeunload = onQuit;
window.onunload = onQuit;
You can <a href="javascript: location.reload();">reload the page</a> to test it here.

Это зависит от перерыва в цикле событий JS, который вызывает диалог подтверждения, и нет возможности сделать эту работу с настраиваемыми диалогами, потому что страница изменится или закроется, прежде чем пользователи получат возможность взаимодействовать с ней.

До сих пор нет возможности избежать изменения страницы или закрытия страницы, а также не использовать эту функцию в Chrome. Это также не будет работать в Firefox, событие не было запущено взаимодействием с пользователем.

0
ответ дан rcdmk 23 August 2018 в 02:34
поделиться
  • 1
    можно как-то вызвать «Остаться на этой странице» и автоматически отменить его? – Mefhisto1 19 February 2016 в 15:54
  • 2
    К сожалению, это также невозможно. Имейте в виду, что все это ограничение является преднамеренной мерой безопасности. – rcdmk 19 February 2016 в 15:58
  • 3
    Допустим это, потому что это возможно с помощью Dirty Forms, это невозможно с событием beforeunload. Dirty Forms может показывать графический интерфейс GUI в том случае, если пользователь пытается перемещаться, нажав гиперссылку на странице. – NightOwl888 21 February 2016 в 16:10
  • 4
    Запуск этого с нажатием кнопки " гиперссылка возможна только с помощью JS. Для этого нет необходимости в каких-либо рамках или библиотеке. Перемещение по ссылкам и формам может быть перехвачено, но OP ясно заявил в заголовке вопроса, что он должен быть в событии beforeunload. Я не буду просить вас удалить нисходящее зрение, но я попрошу вас обратить немного больше внимания на то, что написано перед тем, как выложить. – rcdmk 23 February 2016 в 02:05
Другие вопросы по тегам:

Похожие вопросы: