2012-04-11 68 views
0

我使用ajax隨着數量的增加產生圖書價格。我遇到的唯一問題是當我嘗試生成總數(請參閱JS代碼)並且導致了一些問題(值將連接而不是添加)。我通過舍入變量'amount'來解決問題。但我試圖理解爲什麼連接發生。這裏是我的PHP代碼:爲什麼我必須再次舍入這個值?

if(isset($_GET["amount1"])) 
{ 
    $amount1 = $_GET["amount1"]; 

    $error=""; 

    if($amount1 == "" || !preg_match("/^[0-9]+$/", $amount1)) 
    { 
     $error .= "Please enter a valid number"; 
     echo $error; 
    } 
    else{ 
     echo round($amount1*16.65, 2); 
    } 
} 

這是JS代碼:

 if(xhr.status == 200 && xhr.readyState == 4) 
     { 
     var res = xhr.responseText; 

     if(res.match(/\d+/)== null){ 
      document.getElementById("err3").innerHTML = res; 
      document.getElementById("book3").innerHTML = ""; 
      total(0,3); 
     } 

     else{ 
      document.getElementById("book3").innerHTML = res; 
      document.getElementById("err3").innerHTML = ""; 
      total(res,3); 
      } 
     } 


var book1 = 0; 
var book2 = 0; 
var book3 = 0; 

function total(amount, book) 
{ 
// amount = Math.round(amount*100)/100; --> this is what solved it but I don't  
//know why I need it since amount was rounded by PHP code 
if(book == 1) 
    book1 = amount; 

if(book == 2) 
    book2 = amount; 

if(book == 3) 
    book3 = amount; 

var total = book1 + book2 + book3; 

document.getElementById("total").innerHTML = total; 

} 

感謝

回答

4

res是文本。在使用前將其轉換爲數字。

js> parseFloat("3.14") 
3.14 
+0

很明顯,更重要的一點。就像快速註釋一樣,使用Number()會根據字符串將字符串設置爲int或float,而解析float將四捨五入爲int值,但將額外的內存保存爲float。 – Anthony 2012-04-11 04:52:03

0

的原因,它的串聯是因爲+運營商同時用於字符串連接和添加,這讓我發瘋。但更具體地說,這是因爲值輸入到輸入字段或從服務器傳遞到瀏覽器沒有某種包裝(json或xml)總是作爲字符串通過JavaScript處理,並且,不像PHP,JavaScript不支持類型雜耍(至少不在數字和字符串之間)。

因爲這是被從PHP通過AJAX發送回,並且由於PHP處理數驗證,你真的只需要以JSON格式返回的值,並更新JavaScript才能使用返回的對象,像這樣:

首先,PHP,有輕微的調整上驗證:現在

// 1. Using ctype_digit function to confirm value is >= 0. Much faster than regex 
// 2. No need to round, as integer * float is always same or less precision, and 
// PHP sets product to appropriate numeric type. 
// 3. Pushing values into array for json encoding 
// 4. Setting both values (empty if invalid) so that javascript can easily confirm 
// response. 
// 5. Updated Error, as negative numbers and floats are valid, 
// just not in this case 

$amount1 = $_GET["amount1"]); 
$response["amount1"] = (ctype_digit($amount1)) ? $amount1 * 16.65 : ""; 
$response["error"] = (ctype_digit($amount1)) ? "" : "Please enter a valid quantity"; 

echo json_encode($response); 

,javascript的具有響應字符串反序列化到一個對象,使用eval(),並獲得總和諸如此類的東西:

ja vascript(再次,一些小的調整,這次沒有說明)現在

if(xhr.status == 200 && xhr.readyState == 4) 
{ 
    var res = eval("(" + xhr.responseText + ")"); 

    amount1 = (!isNaN(res.amount1)) ? res.amount1 : "";  

    document.getElementById("err3").innerHTML = res.error; 
    document.getElementById("book3").innerHTML = res.amount1; 
    document.getElementById("total").innerHTML = total(Number(res.amount1),3); 
} 

var book1 = 0; 
var book2 = 0; 
var book3 = 0; 

function total(amount, book) 
{ 
switch (book) { 
    case 1: 
     book1 = amount; 
     break; 
    case 2: 
     book2 = amount; 
     break; 
    case 3: 
     book3 = amount; 
     break; 
} 

return book1 + book2 + book3; 
} 

,你可能會注意到,當我amount1價值最終傳遞給total功能,我居然把它包在​​功能,幾乎可以解決這個問題而不使用JSON。理論上,如果PHP總是返回一個數值,我不需要這樣做。下面是我將它轉換爲數字類型的原因,儘管這樣的:

  1. 因爲JS不會做數字型雜耍,這僅僅是一個好主意。你永遠不知道PHP會在糟糕的一天返回什麼,驗證應該發生在通信的兩端。

  2. 這允許PHP返回值的空字符串,您可以輸出給用戶,然後​​將設置空字符串爲0爲總功能。

  3. 如果您決定跳過ajax方法並執行定價計算瀏覽器端,則必須始終使用​​來投射該值,因此在處理時需要一個很好的(雖然令人討厭的)習慣。來自任何外部來源的數值。

我會後在幾個一的jsfiddle與我怎麼會接近你的總體目標,您可以忽略或竊取最終版本,我只是覺得多達這樣做。

相關問題