0

変更を追跡したいフォームがあります。現在、ユーザーがページを終了すると、フォームに加えられた変更の数を示す警告ボックスが表示されるように設定しています。しかし、それは 0 を登録し続けます。inputChanges 関数にアラートを追加してテストしたところ、変更が発生してアラートが発生したことを通知されましたが、ページを終了してもカウントは 0 として登録されています...

これが私のスクリプトです:

window.onload = function() {
    var totalChanges = "";
    var inputHandles = 0;
    var selectHandles = 0;
    var textAreaHandles = 0;

window.onbeforeunload = function(){
    alert("Total Form Changes:" + totalChanges);
}//onbeforeunload

   var totalChanges = inputHandles + selectHandles + textAreaHandles;

   function inputChanges() {
   inputHandles++; 
   alert("Change");
   }

   var inputs = document.getElementsByTagName("input"); 
   for (i = 0; i < inputs.length; i++){
    inputs[i].onchange = inputChanges;
   }    

   function selectChanges(){
   selectHandles++;
   }

   var selects = document.getElementsByTagName("select");
   for (i = 0; i < selects.length; i++){
   selects[i].onselect = selectChanges;
  }

  function textAreaChanges(){
   textAreaHandles++;
  }

   var textAreas = document.getElementsByTagName("textarea");
  for (i = 0; i < textAreas.length; i++){
   textAreas[i].onchange = textAreaChanges;
  }
}//Onload
4

2 に答える 2

2

ここで宣言しtotalChangesます:

var totalChanges = "";

...そして、ここで再宣言します。

var totalChanges = inputHandles + selectHandles + textAreaHandles;

...その時点で、あなたが合計しているものはすべて0です。

値が必要な時点でその計算を行う必要があります。

window.onbeforeunload = function(){
    totalChanges = inputHandles + selectHandles + textAreaHandles;
    alert("Total Form Changes:" + totalChanges);
}

またはtotalChanges = 0、最初に設定してから、他の変数が変更されるたびにインクリメントしますが、それは扱いにくいです。

また、最初の値とは異なる値を持つフィールドの数を集計しているのではなく、個々の編集の数を集計していることにも注意してください。したがって、ユーザーがフィールドを 2 回変更し、2 回目の変更が元の値に戻った場合、コードはそれを 2 回の変更として追跡します (論理的には変更がゼロの場合)。

于 2013-08-04T04:24:26.037 に答える
0

ユーザーは値を元に戻すことができるので、すべてinput.valueを比較しinput.defaultValueて確認することをお勧めしますselect.options[select.selectedIndex]defaultSelected

また、} とアラートを変更の合計の後に移動することもできます

このようなもの

window.onload = function() {
  var totalChanges = 0;


  window.onbeforeunload = function(){
    var inputs = document.getElementsByTagName("input"); // ditto for "textarea"
    for (var i = 0; i < inputs.length; i++){
      totaChanges +=  inputs[i].value != inputs[i].defaultValue;
    }    
    var selects = document.getElementsByTagName("select");
    for (var i = 0; i < selects.length; i++){
      totalChanges += !selects[i].defaultSelected;
   }

    alert("Total Form Changes:" + totalChanges);
  }//onbeforeunload
}
于 2013-08-04T04:24:41.870 に答える