您有幾個表單具有相同的ID。這在HTML DOM中是不允許的:每個id="..."
屬性應該是唯一的,不能使用幾個相同形式的id="add-to-cart"
。當瀏覽器遇到多個具有相同id
的對象時,它會忽略此id
的其他對象,因爲id
應該是唯一的。
您可以改爲使用class="add-to-cart"
。
(此外,刪除您添加按鈕id="add"
,它也是一個重複id
,你可以使用類代替。)
而且,你並不真的需要在你的代碼通過一個ID。你可以使用this
來獲取包含元素的表單,它指向點擊的按鈕(但是,它需要用$
來將DOM對象轉換爲jQuery對象):
所以,你可以使用這個您的表單:
<form method="post" action="/cart/add" class="add-to-cart">
<input type="text" name="id" value="27733468427" class="ppp" />
<input type="submit" name="add"
value="Add to Cart"
onclick="addItem(this); return false;"/>
</form>
這是對<input type="submit" ... />
元素的引用。所以,你可以通過使用.closest
,這樣得到的形式包裝該元素:
function addItem(button) {
var $button = $(button);
var $form = $button.closest('form');
var postData = $form.serialize();
alert(postData);
$.ajax({
type: 'POST',
url: '/cart/add.js',
dataType: 'json',
data: $form.serialize(),
success: addToCartOk,
error: addToCartFail
});
這不是做事的推薦方式,雖然。 onclick="..."
是一種不推薦的做事方式,因爲您正在將JavaScript與HTML混合使用。相反,建議全部刪除onclick="..."
,並在<script>
代碼中綁定事件回調。要做到這一點,只是刪除onclick
在你的形式:
<form method="post" action="/cart/add" class="add-to-cart">
<input type="text" name="id" value="27733468427" class="ppp" />
<input type="submit" name="add"
value="Add to Cart"/>
</form>
並且採用階級add-to-cart
結合的方法(確保你做了它的進級,否則我的代碼將無法正常工作):
$(function() {
$("form.add-to-cart").submit(function() {
var $form = $(this);
var postData = $form.serialize();
alert(postData);
$.ajax({
type: 'POST',
url: '/cart/add.js',
dataType: 'json',
data: $form.serialize(),
success: addToCartOk,
error: addToCartFail
});
return false;
});
上面的代碼執行以下操作:
- 周圍的代碼
$(function() { ... });
確保,當所有的元素加載的代碼只運行。
- 找到所有格式
class="add-to-cart"
$("form.add-to-cart").submit(function() { ... });
增加了一個回調函數。每次帶有class="add-to-cart"
的任何表格都會被調用。
這是推薦替代onclick
。
更新:我的代碼的第一個版本有一個bug:因爲$("form.add-to-cart").submit
連接到形式,而不是按鈕,我們應該用$(this)
來指形式。我們在代碼的第二個版本中不需要closest
。
它不工作,我已經添加了相同的代碼,你也通過添加類添加到購物車 – Barjinder
的形式此外,如果我的代碼觸發了一個錯誤,請發送給我,我會解決它。目前您沒有使用我的代碼,並且我沒有相同的環境來測試我的代碼,所以我不能評論它爲什麼不起作用 –
在onclick中使用addItem(this),然後使用addItem(按鈕){var postData = $(button).closest('。add-to-cart')。serialize(); –