Платформа Client/JS для “Несохраненных Данных” Защита?

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

20
задан tshepang 8 December 2013 в 07:56
поделиться

6 ответов

Одна часть загадки:

/**
 * Determines if a form is dirty by comparing the current value of each element
 * with its default value.
 *
 * @param {Form} form the form to be checked.
 * @return {Boolean} <code>true</code> if the form is dirty, <code>false</code>
 *                   otherwise.
 */
function formIsDirty(form)
{
    for (var i = 0; i < form.elements.length; i++)
    {
        var element = form.elements[i];
        var type = element.type;
        if (type == "checkbox" || type == "radio")
        {
            if (element.checked != element.defaultChecked)
            {
                return true;
            }
        }
        else if (type == "hidden" || type == "password" || type == "text" ||
                 type == "textarea")
        {
            if (element.value != element.defaultValue)
            {
                return true;
            }
        }
        else if (type == "select-one" || type == "select-multiple")
        {
            for (var j = 0; j < element.options.length; j++)
            {
                if (element.options[j].selected !=
                    element.options[j].defaultSelected)
                {
                    return true;
                }
            }
        }
    }
    return false;
}

И другой :

window.onbeforeunload = function(e)
{
    e = e || window.event;  
    if (formIsDirty(document.forms["someFormOfInterest"]))
    {
        // For IE and Firefox
        if (e)
        {
            e.returnValue = "You have unsaved changes.";
        }
        // For Safari
        return "You have unsaved changes.";
    }
};

Оборачивают все это, и что Вы получаете?

var confirmExitIfModified = (function()
{
    function formIsDirty(form)
    {
        // ...as above
    }

    return function(form, message)
    {
        window.onbeforeunload = function(e)
        {
            e = e || window.event;
            if (formIsDirty(document.forms[form]))
            {
                // For IE and Firefox
                if (e)
                {
                    e.returnValue = message;
                }
                // For Safari
                return message;
            }
        };
    };
})();

confirmExitIfModified("someForm", "You have unsaved changes.");

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

19
ответ дан 29 November 2019 в 23:20
поделиться

Если вы используете jQuery, вот простой прием:

$('input:text,input:checkbox,input:radio,textarea,select').one('change',function() {
  $('BODY').attr('onbeforeunload',"return 'Leaving this page will cause any unsaved data to be lost.';");
});

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

$('BODY').removeAttr('onbeforeunload');

... или вы попадете в цикл, где он постоянно спрашивает вас

В моем случае у меня было большое приложение, и я делал location.href, перенаправлял в Javascript, а также отправлял формы, а затем некоторые AJAX-сообщения отправлялись, а затем возвращались с успешным ответом, встроенным в страницу. В любом из этих условий мне приходилось перехватывать это событие и использовать вызов removeAttr ().

13
ответ дан 29 November 2019 в 23:20
поделиться

Хотелось немного расширить Volomike отличный код jQuery.

Таким образом, у нас есть очень, очень крутой и элегантный механизм для достижения цели предотвращения непреднамеренной потери данных путем перехода от обновленных данных перед сохранением, т.е. обновленное поле на странице, затем нажмите кнопку, ссылку или даже кнопку «Назад» в браузере перед тем, как нажать кнопку «Сохранить».

Единственное, что вам нужно сделать, это добавить тег класса «noWarn» ко всем элементам управления (особенно Кнопки «Сохранить»), которые отправляют обратно на веб-сайт, сохраняют или не удаляют обновленные данные.

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

Замечательно! Молодец, Воломике!

Просто имейте следующий код jQuery:

$(document).ready(function() {

    //----------------------------------------------------------------------
    // Don't allow us to navigate away from a page on which we're changed
    //  values on any control without a warning message.  Need to class our 
    //  save buttons, links, etc so they can do a save without the message - 
    //  ie. CssClass="noWarn"
    //----------------------------------------------------------------------
    $('input:text,input:checkbox,input:radio,textarea,select').one('change', function() {
        $('BODY').attr('onbeforeunload',
        "return 'Leaving this page will cause any unsaved data to be lost.';");
    });

    $('.noWarn').click(function() { $('BODY').removeAttr('onbeforeunload'); });

});
7
ответ дан 29 November 2019 в 23:20
поделиться

Как запустить процесс PHP в фоновом режиме:

#!/bin/bash
for ((i=1;i<=40;i+=1)); do
  php /home/calculatedata.php &
done

Вы можете завершить все экземпляры этих фоновых процессов PHP, выдав:

killall php

Убедитесь, что у вас не запущены другие процессы PHP, так как они также будут уничтожены. Если у вас есть много других PHP процессов, то вы делаете что-то вроде:

ps -ef | grep /home/calculatedata.php | cut_the_pid | kill -9
-121--3842624-

DLL ресурсов такой же, как и любые другие DLL, он просто имеет мало или нет кода в нем, и относительно больше ресурсов.

Microsoft не имеет предопределенного типа ресурсов для файлов PNG, но вы можете определить свой собственный

Самая минимальная возможная библиотека ресурсов - это только скомпилированный файл .rc, переданный компоновщику таким образом.


//save this as resources.rc (supply your own .png file)

#define RT_PNG 99

#define ID_DIGG 1

ID_DIGG  RT_PNG  "image\\digg.png"

Затем выполните эти команды в командной строке.

rc resources.rc
link /dll /noentry /machine:x86 resources.res

Это так. первая команда компилирует resources.rc в resources.res вторая команда превращает resources.res в dll.

Теперь у вас должна быть библиотека resources.dll , содержащая один файл png. На практике, конечно, необходимо поместить # defines в файл заголовка, который используется совместно с кодом, использующим библиотеку DLL.

Чтобы использовать DLL в C++, ваш код будет выглядеть примерно так.

#define RT_PNG   MAKEINTRESOURCE(99)
#define ID_DIGG  MAKEINTRESOURCE(1)

HMODULE hMod = LoadLibraryEx("resources.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
if (NULL != hMod)
{
    HRSRC hRes = FindResource(hMod, RT_PNG, ID_DIGG);
    if (NULL != hRes)
    {
        HGLOBAL hgbl = LoadResource(hMod, hRes)
        void *  pPng = LockResource(hgbl);
        UINT32  cbPng = SizeofResource(hMod, hRes);

        // pPng now points to the contents of your your .png file
        // and cbPng is its size in bytes

    }

    // Don't free the library until you are done with pPng
    // FreeLibrary(hMod);
}
-121--3286629-

В дополнение к ответу Лэнса я только что провел день, пытаясь запустить этот фрагмент. Во-первых, jquery 1.4, похоже, имеет ошибки с привязкой события изменения (по состоянию на 10 февраля). jQuery 1.3 - OK. Во-вторых, я не могу получить jquery, чтобы связать onbeforeunload/beforeunload (я подозреваю, IE7, что я использую). Я пробовал разные селекторы, («тело»), (окно). Я пытался «.bind,» «.attr.» Возврат к чистой js работал (я также видел несколько похожих сообщений на SO об этой проблеме):

$(document).ready(function() {
    $(":input").one("change", function() {
        window.onbeforeunload = function() { return 'You will lose data changes.'; }
    });
    $('.noWarn').click(function() { window.onbeforeunload = null; });
});

Примечание. Я также использовал селектор ': input' вместо перечисления всех типов ввода. Строго перебор, но я думал, что это круто: -)

7
ответ дан 29 November 2019 в 23:20
поделиться

Я сделал еще одно небольшое улучшение в реализации jQuery, перечисленных на этой странице. Моя реализация будет работать, если у вас включена валидация страницы ASP.NET на стороне клиента и используется на странице.

Она позволяет избежать "ошибки" очистки функции onBeforeLeave, когда страница на самом деле не публикуется по щелчку из-за ошибки валидации. Просто используйте класс no-warn-validate для кнопок/ссылки, которые вызывают валидацию. У него все еще есть класс no-warn для использования в элементах управления, у которых CausesValidation=false (например, кнопка "Сохранить как черновик"). Этот шаблон, вероятно, можно использовать и для других фреймворков валидации, отличных от ASP.NET, поэтому я размещаю его здесь для справки.

 function removeCheck() { window.onbeforeunload = null; }

$(document).ready(function() {
    //-----------------------------------------------------------------------------------------
    // Don't allow navigating away from page if changes to form are made. Save buttons, links,
    // etc, can be given "no-warn" or "no-warn-validate" css class to prevent warning on submit.
    // "no-warn-validate" inputs/links will only remove warning after successful validation
    //-----------------------------------------------------------------------------------------
    $(':input').one('change', function() {
        window.onbeforeunload = function() {
            return 'Leaving this page will cause edits to be lost.';
        }
    });

    $('.no-warn-validate').click(function() {
        if (Page_ClientValidate == null || Page_ClientValidate()) { removeCheck(); }
    });

    $('.no-warn').click(function() { removeCheck() });
});
1
ответ дан 29 November 2019 в 23:20
поделиться

Я создал плагин jQuery , который можно использовать для реализации предупреждения о несохраненных изменениях. функция для веб-приложений. Он поддерживает обратные передачи. Он также включает ссылку на информацию о том, как нормализовать поведение события onbeforeunload Internet Explorer.

2
ответ дан 29 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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