5

私は数行の Javascript を作成 (およびコピー) しましたが、それは私の目的を十分に果たしています。しかし、これを行うためのより良い方法 (クロスブラウザーとパフォーマンスの向上) を見つけようとしています。関数を友人からコピーしましたisIntegerが、次の条件で文字列値をチェックする理由がわかりません。

if (((c < "0") || (c > "9"))) return false;

上記の条件は正常に機能しますが、数値に対してチェックするように変更すると、機能が壊れます。入力フィールドは、アルファベット文字の受け入れを開始します。変更するとこんな感じ。

if ((( c < 0 ) || ( c > 9 ) return false;

何が起こっているのかを理解できるように、セクションをコメントアウトしようとしました。また、このコードにセキュリティ ホールはありますか? 1innerHTML1 メソッドはいくつかのセキュリティ ホールを開く可能性があるため、それを使用して「クリーン」操作を実行する必要があると読みました。したがって、jQuery の.htmlメソッドを使用することにしました (JavaScript は初めてです)。

問題のページ: http://thehotdeal.net/clients/wehtmlit/index.php?order/

$(document).ready(function() {
  var total = 0;
  function calcTotal() {
  /* fetching some values from PHP variables and then performing calculations.
    essentially this is multiplying number of pages by price per page
  */
  /* <![CDATA[ */
    var total_price_main_pages = ($("#pages").attr("value")) * (<?php echo $main_price; ?>),
    total_price_sub_pages = ($("#subpages").attr("value")) * (<?php echo $sub_price; ?>);
    /*  ]] > */
    $("input.calculate:checked").each(function() {
    // This happens for each checked input field
    // These are few additional otions available to the user. If selected then
    // the price stored in their "data" attribute is added to the total
      var value = $(this).attr("data");
      total += parseInt(value); 
    });
    total += (parseInt(total_price_main_pages)) + (parseInt(total_price_sub_pages));
    $("#total").html("Total: <strong>" + total + "</strong>");
  }
  // This happens when the page loads
  calcTotal();
  $("input.calculate").click(function() {
    total = 0;
    calcTotal();
  });
  // function to check if an input is positive number(s). returns true if [ 0 <= s <= 9 ]
  function isInteger(s) {
    var i;
    for (i = 0; i < s.length; i++) {
      var c = s.charAt(i);
      if (((c < "0") || (c > "9"))) return false;
    }
    return true;
  }
  // Checking the mainpage input (default value 1)
  // (valid value is greater than or equal to 1 and less than 10)
  $("#pages").keyup(function() {
    var page = $(this).val();
    // if user deletes the value in this input (blank)
    // then just display a warning message and do nothing
    if(page == ""){
      this.value = "";
      $("#pageError").html("Please enter a value equal or greater than 1.");
      return false;
    }
    // if value is less than or equal to zero then
    // then set 1 as the new value, remove the error message and call the calcTotal function
    else if(page <= 0){
      this.value =1;
      $("#pageError").empty();
      total = 0;
      calcTotal();
    }
    // check if value is not a positive integer by calling the isInteger function
    // if not a positive integer then set 1 as the new value,
    //remove the error message and call the calcTotal function
    else if(!isInteger(page)){
      this.value =1;
      $("#pageError").empty();
      total = 0;
      calcTotal();
    }
    // if value does not fall in any of the if statements i.e. value is acceptable
    // remove the error message and call the calcTotal function
    $("#pageError").empty();
    total = 0;
    calcTotal();
  });
  // check if value is not empty when user exits the input
  // if empty then set value as 1, remove error message and call calcTotal function
  $("#pages").blur(function() {
    var page = $(this).val();
    if(page == ""){
      this.value = 1;
      $("#pageError").empty();
      total = 0;
      calcTotal();
    }
  });
  // Checking the subpage input (default value 0)
  // (valid value is greater than or equal to 0 but less than 10)
  $("#subpages").keyup(function() {
    var page = $(this).val();
    if(page == ""){
      this.value = "";
      return false;
    } else if(!isInteger(page)){
      this.value = 0;
      total = 0;
      calcTotal();
    }
    total = 0;
    calcTotal();
  });
  $("#subpages").blur(function() {
    var page = $(this).val();
    if(page == ""){
      this.value = 0;
      total = 0;
      calcTotal();
    }
  });
});
4

2 に答える 2

15

次の条件で文字列値をチェックする理由がわかりません

cは文字 (実際には 1 文字の文字列) であるため、それがString.charAt返されるためです。とはいえ、isInteger関数は正規表現を使ってもっと簡単に書くことができます:

function isPositiveInteger(s)
{
    return !!s.match(/^[0-9]+$/);
    // or Rob W suggests
    return /^\d+$/.test(s);
}

または、別のアプローチを取ることもできます: 文字列を数値に変換し、それが正であることを確認し、数値の下限が元の数値と同じであることを確認します (したがって、整数です)。

function isPositiveInteger(s)
{
    var i = +s; // convert to a number
    if (i < 0) return false; // make sure it's positive
    if (i != ~~i) return false; // make sure there's no decimal part
    return true;
}
于 2012-11-04T15:29:47.337 に答える
0

どうでしょう..

if( +inputString > 0 ) {
}

入力が正の整数であるかどうかを調べるだけの場合。小数点/浮動小数点値を含む数値も許可したくない場合は、次のような入力フィールドの検証を行う必要があります

<input type="text" pattern="\d+" required/>

これにより、入力フィールドに数値のみが表示されます。フラグはオプションです。存在する場合、すべてのパターンが満たされない限り、送信ボタンを続行requiredできません。

于 2012-11-04T15:32:20.887 に答える