2015-04-17 2 views
0

Я пытаюсь уведомить пользователей, если они покидают страницу формы с несохраненными изменениями в ней.jquery получить все элементы входной формы, включая радио

С помощью следующего сценария я успешно извлекаю все поля ввода, кроме случаев, когда изменилось поле радио.

Как я могу получить поле радио?

JQuery

$(':input').each(function() { 
$(this).data('initialValue', $(this).val()); 
}); 

window.onbeforeunload = function(){ 
    var msg = 'Unsaved data presence'; 
    var isDirty = false; 

    $(':input').each(function() { 
     if($(this).data('initialValue') != $(this).val()){ 
      isDirty = true; 
     } 
    }); 

    if(isDirty == true){ 
     return msg; 
    } 
}; 

HTML

... 
<fieldset class="radio btn-group btn-group-yesno" id="jform_params_admin"> 
    <input type="radio" checked="checked" value="1" name="jform[params][admin]" id="jform_params_admin0"> 
    <input type="radio" value="0" name="jform[params][admin]" id="jform_params_admin1"> 
    <label for="jform_params_admin1" class="btn">No</label> 
</fieldset> 
<input type="text" size="40" class="inputbox" value="text" id="jform_params_text" name="jform[params][admin_text]"> 
... 
+1

где данных InitialValue в радио? – nirmal

ответ

2

EDIT

1.Remove initialValue потому, что вам не нужно.

2.You можно использовать следующую непроверенных код вместо:

window.onbeforeunload = function(){ 
    var msg = 'Unsaved data presence'; 
    var isDirty = false; 

    $(':input').each(function() { 
    var $e = $(this); 
    if(($e.is(':checkbox') || $e.is(':radio')) && $e.prop('defaultChecked') != $e.prop('checked')) { 
     isDirty = true; 
    } else if($e.prop('defaultValue') != $e.val()) { 
     isDirty = true; 
    } 
    }); 

    if(isDirty == true){ 
     return msg; 
    } 
}; 

OLD

Ваш код, чтобы проверить, если вход изменен просто неправильно. Проблема в том, что радио и флажки не меняют value при установке флажка/радои. Они изменяют атрибут checked. Вы можете это исправить, добавив немного другой код для CheckBox/радиоприемников:

$(':input').each(function() { 
    $(this).data('initialValue', $(this).val()); 
}); 

$(':radio').each(function() { 
    $(this).data('initialValue', $(this).checked()); 
}); 

и позже:

$(':input').each(function() { 
    if($(this).data('initialValue') != $(this).val() || $(this).data('initialValue') != $(this).checked()){ 
     isDirty = true; 
    } 
}); 
+0

Это лучше :) –

+0

Нет необходимости цитировать и устанавливать 'initialValue', объекты dom уже содержат соответствующие свойства (' defaultValue' и 'defaultChecked'), которые могут быть использованы и протестированы против – billyonecan

+0

. Я это знаю. Но, может быть, ему нужна обратная совместимость? – Robert

Смежные вопросы