При использовании
blockquote>window.onbeforeunload
(или$(window).on("beforeonload")
) можно ли отображать пользовательское сообщение в этом всплывающем окне?Больше не нужно. Все основные браузеры начали игнорировать фактическое сообщение и просто показать свои собственные.
Изучая существующие ответы, я чувствую, что это было возможно в прошлом с использованием таких вещей, как
blockquote>confirm
илиalert
илиevent.returnValue
, но теперь кажется, что они больше не работают.Исправить. Давным-давно вы могли использовать
confirm
илиalert
, в последнее время вы можете вернуть строку из обработчикаonbeforeunload
, и эта строка будет отображаться. Теперь содержимое строки игнорируется и рассматривается как флаг.При использовании jQuery's
on
вам действительно нужно использоватьreturnValue
в исходном событии:$(window).on("beforeunload", function(e) { // Your message won't get displayed by modern browsers; the browser's built-in // one will be instead. But for older browsers, best to include an actual // message instead of just "x" or similar. return e.originalEvent.returnValue = "Your message here"; });
или старый способ:
window.onbeforeunload = function() { return "Your message here"; // Probably won't be shown, see note above };
Это все, что вы можете сделать.
Почему я получаю 0 вместо значения мусора (рассмотрим в точке A, мы должны получить целочисленное значение, равное последним 3 байтам первого [i] + байта [1])
blockquote>Потому что написанный вами код этого не делает. У вас есть массив
int
, к которому вы обращаетесь с помощью указателя на символ. Итак,*(p+0)
собирается дать вам первый байт.*(p+1)
второй и тд. Вы преобразуете вint
ненужное (оно только конвертирует полученное число вint
), это происходит слишком поздно. Вам необходимо изменить значение указателя:std::cout << *(int*)(p+1);
Обратите внимание, что это неопределенное поведение.
Почему я получаю 0 вместо значения мусора
blockquote>Почему вы думаете, что 0 не является значением мусора? Нет никакой гарантии, что значение мусора не равно 0. 0 является абсолютно допустимым значением для мусора.
Тем не менее, вы не печатаете ничего, что имеет мусорное значение. Между элементами массива нет заполнения, и сам элемент
int
не содержит заполнения, и в массиве нет неинициализированных объектов.
int
состоит из одного или нескольких байтов. В вашей системе это 4 байта.p+0
указывает на первый байт,p+1
указывает на второй байт,p+4
указывает на первый байт второго целого числа. Если ни первый, ни второй байт не имеют значения 0, то целое число не может быть равно 1.чтение значений между двумя индексами
blockquote>Между элементами массива нет пробела, поэтому читать нечего. Вы читаете разные части элемента в массиве.
(рассмотрим в точке A, мы должны получить целочисленное значение, равное последним 3 байтам первого байта [i] + a [1]).
blockquote>Вы можете добиться этого следующим образом:
int i; std::memcpy(&i, p + 1, sizeof i); std::cout << i;
Во-первых, 0 является совершенно допустимым «значением мусора».
Но это спорный вопрос, потому что вы на самом деле не конвертируете 4 байта в целое число & mdash; Вы извлекаете один байт, а затем конвертируете его в целое число. Вы должны были бы интерпретировать char*
как int*
(затем разыменовывать его), чтобы делать то, что вы говорите, что делаете, и тогда мы приходим к:
Такое манипулирование памятью имеет неопределенное поведение . Все может произойти, если вы попытаетесь сделать вид, что не int
является int
.
Процесс перевода абстрактной программы, которую вы описали с использованием слов C ++, в реальную практическую программу, понятную компьютеру, невероятно сложен . Компилятор не берет ваши строки по одной и просто наивно переписывает их в код, который одинаков, но на машинном языке. Он читает весь ваш исходный код, понимает, что вы хотите, чтобы программа, которую он описывает для вас, затем создает совершенно новую программу на совершенно другом, не связанном, отдельном языке, который дает тот же результат. Для того, чтобы сделать это быстро, нужны также ярлыки.
Когда вы пишете программу, поведение которой не определено, вы нарушаете этот процесс. Вы просто не можете предположить, что «мы должны получить целочисленное значение, равное 3 последним байтам первого байта [i] + a [1]». Вероятнее всего, это было правдой в 1970-х годах, но компьютеры действительно сложные, современные больше, чем старинные.
Короткая версия: не делай этого.