Я хочу показать сообщение, когда пользователь закроет кнопку браузера [duplicate]

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

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

46
задан Thomas 2 June 2015 в 17:55
поделиться

10 ответов

Вы пробовали этот код?

window.onbeforeunload = function (event) {
    var message = 'Important: Please click on \'Save\' button to leave this page.';
    if (typeof event == 'undefined') {
        event = window.event;
    }
    if (event) {
        event.returnValue = message;
    }
    return message;
};

$(function () {
    $("a").not('#lnkLogOut').click(function () {
        window.onbeforeunload = null;
    });
    $(".btn").click(function () {
        window.onbeforeunload = null;
});
});

Вторая функция является необязательной, чтобы избежать запроса при нажатии на элементы #lnkLogOut и .btn.

Еще одна вещь, Пользовательская подсказка не будет работать в Firefox (даже в последней версии). Для получения дополнительной информации об этом перейдите в этот поток .

52
ответ дан Community 24 August 2018 в 10:26
поделиться

Обращаясь к различным статьям и выполняя некоторые пробные и пробные проверки, я, наконец, разработал эту идею, которая отлично работает для меня.

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

$(window).on('mouseover', (function () {
    window.onbeforeunload = null;
}));
$(window).on('mouseout', (function () {
    window.onbeforeunload = ConfirmLeave;
}));
function ConfirmLeave() {
    return "";
}
var prevKey="";
$(document).keydown(function (e) {            
    if (e.key=="F5") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "W" && prevKey == "CONTROL") {                
        window.onbeforeunload = ConfirmLeave;   
    }
    else if (e.key.toUpperCase() == "R" && prevKey == "CONTROL") {
        window.onbeforeunload = ConfirmLeave;
    }
    else if (e.key.toUpperCase() == "F4" && (prevKey == "ALT" || prevKey == "CONTROL")) {
        window.onbeforeunload = ConfirmLeave;
    }
    prevKey = e.key.toUpperCase();
});

Функция ConfirmLeave выдаст всплывающее сообщение по умолчанию, если есть любой необходимости настроить сообщение, а затем вернуть текст, который будет отображаться вместо пустой строки в функции ConfirmLeave () .

32
ответ дан Homer 24 August 2018 в 10:26
поделиться

Попробуйте выполнить следующий код для меня в среде Linux chrome. Перед запуском убедитесь, что jquery прикреплен к документу.

$(document).ready(function()
{
    $(window).bind("beforeunload", function() { 
        return confirm("Do you really want to close?"); 
    });
});

Для простого выполните следующие шаги:

  1. открыть http://jsfiddle.net/
  2. введите что-то в html, css или javascript box
  3. попытайтесь закрыть вкладку в chrome

Он должен показать следующее изображение:

enter image description here [/g1]

10
ответ дан Khamidulla 24 August 2018 в 10:26
поделиться

Как сказал Феникс, используйте метод jQuery .bind, но для большей совместимости с браузером вы должны вернуть String,

$(document).ready(function()
{
    $(window).bind("beforeunload", function() { 
        return "Do you really want to close?"; 
    });
});

более подробную информацию можно найти по адресу: developer.mozilla.org

3
ответ дан Macondo 24 August 2018 в 10:26
поделиться

Возможно, лучше использовать мышь с обнаружением пути.

В BrowserClosureNotice у вас есть демонстрационный пример и чистая библиотека javascript для этого.

It не является совершенным, но избегает проблем с документами или событиями мыши ...

0
ответ дан manufosela 24 August 2018 в 10:26
поделиться

Следующий сценарий даст сообщение в Chrome и IE:

<script>
window.onbeforeunload = function (e) {
// Your logic to prepare for 'Stay on this Page' goes here 

    return "Please click 'Stay on this Page' and we will give you candy";
};
</script>

Chrome enter image description here [/g0]

IE enter image description here [/g1]

в Firefox вы получите общее сообщение

enter image description here [/g2]

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

Ответ на вопрос в комментарии

F5 снова запустит событие, так что Atl + F4.

3
ответ дан Matas Vaitkevicius 24 August 2018 в 10:26
поделиться
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

<script type="text/javascript" language="javascript">

var validNavigation = false;

function endSession() {
// Browser or broswer tab is closed
// Do sth here ...
alert("bye");
}

function wireUpEvents() {
/*
* For a list of events that triggers onbeforeunload on IE
* check http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx
*/
window.onbeforeunload = function() {
  if (!validNavigation) {

            var ref="load";
      $.ajax({
            type: 'get',
            async: false,
            url: 'logout.php',
 data:
            {
                ref:ref               
            },
             success:function(data)
            {
                console.log(data);
            }
            });
     endSession();
  }
 }

// Attach the event keypress to exclude the F5 refresh
$(document).bind('keypress', function(e) {
if (e.keyCode == 116){
  validNavigation = true;
}
});

// Attach the event click for all links in the page
$("a").bind("click", function() {
validNavigation = true;
});

 // Attach the event submit for all forms in the page
 $("form").bind("submit", function() {
 validNavigation = true;
 });

 // Attach the event click for all inputs in the page
 $("input[type=submit]").bind("click", function() {
 validNavigation = true;
 });

}

// Wire up the events as soon as the DOM tree is ready
$(document).ready(function() {
wireUpEvents();  
}); 
</script> 

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

0
ответ дан ramesh kanna 24 August 2018 в 10:26
поделиться

Вы можете попробовать что-то вроде этого.

<html>
<head>
    <title>test</title>
    <script>
        function openChecking(){
            // alert("open");
            var width = Number(screen.width-(screen.width*0.25));  
            var height = Number(screen.height-(screen.height*0.25));
            var leftscr = Number((screen.width/2)-(width/2)); // center the window
            var topscr = Number((screen.height/2)-(height/2));
            var url = "";
            var title = 'popup';
            var properties = 'width='+width+', height='+height+', top='+topscr+', left='+leftscr;
            var popup = window.open(url, title, properties);
            var crono = window.setInterval(function() {
                if (popup.closed !== false) { // !== opera compatibility reasons
                    window.clearInterval(crono);
                    checkClosed();
                }
            }, 250); //we check if the window is closed every 1/4 second
        }   
        function checkClosed(){
            alert("closed!!");
            // do something
        }
    </script>    
</head>
<body>
    <button onclick="openChecking()">Click Me</button>
</body>
</html>

Когда пользователь закрывает окно, обратный вызов будет запущен.

-3
ответ дан Salvador P. 24 August 2018 в 10:26
поделиться
<script type="text/javascript">
window.addEventListener("beforeunload", function (e) {

  var confirmationMessage = "Are you sure you want to leave this page without placing the order ?";
  (e || window.event).returnValue = confirmationMessage;
  return confirmationMessage;

});
</script>

Пожалуйста, попробуйте этот код, это отлично работает для меня. Это настраиваемое сообщение поступает в браузер Chrome, но в Mozilla это сообщение не отображается.

0
ответ дан user2753425 24 August 2018 в 10:26
поделиться

Привет, у меня есть сложное решение, которое работает только в новых браузерах:

просто откройте веб-сайт на вашем сервере, когда пользователь закроет окно, событие onclose будет запущено

3
ответ дан wutzebaer 24 August 2018 в 10:26
поделиться
Другие вопросы по тегам:

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