2009-07-24 1 views
13

tôi áp dụng:Tại sao trình xử lý nhấp chuột jQuery của tôi xuất hiện để chạy nhiều lần cho một số mục tiêu của nó?

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
}); 

On này:

<span id="contents"> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content1" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content3" class="content study"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
<span id="content4" class="content category"> 
</span> 
<input class="newContentLink" type="submit" style="width: 100%;" value="CREATE A NEW CONTENT"/> 
</span> 

Tại sao khi tôi bấm vào 2 nút đầu tiên nó sẽ thêm 111, vào nút bên cạnh thêm 11, và người cuối cùng thêm 1?

+1

thử apending một "

" thay vì chỉ "1", –

+0

đâu #test? Có lẽ nó là một cái gì đó với mã số – MacAnthony

Trả lời

20

Không thể sao chép. Tôi nghi ngờ rằng bạn đang trình bày sai số — đơn giản hóa, chủ yếu là — tình huống của bạn. Để chính xác, tôi tin rằng bạn đang tự động thêm các yếu tố đó và gọi số $(".newContentLink").click(...) mỗi lần —, một cách tự nhiên, tiếp tục áp dụng các bản sao bổ sung của trình xử lý nhấp chuột cho mỗi .newContentLink trong trang.

Vì vậy, dữ liệu nhập gần đây nhất bạn đã tạo có một bản sao của trình xử lý nhấp chuột và nối thêm một 1. Lần thứ hai gần đây nhất có hai bản sao và nối thêm 11. Thứ ba có ba và gắn thêm 111 vv

Để ngăn chặn điều này, áp dụng các handler nhấp chuột để tử DOM mới được tạo ra, chứ không phải $(".newContentLink") (mà luôn luôn có nghĩa là mỗi.newContentLink).

+4

Yup, nó gần như chắc chắn trình xử lý 'click' được thêm một lần nữa và một lần nữa. – Blixt

+2

Hoặc sử dụng phương thức .live() để tự động thêm sự kiện – MacAnthony

1

Thử đặt các tên khác nhau cho các yếu tố đầu vào gửi của bạn.

+0

Tôi muốn nhưng họ được hình thành trong một vòng lặp của kịch bản của tôi (tôi chỉ đặt những gì tôi hy vọng là một phần có liên quan của mã lên đó). – Eliyahu

+1

Tôi chỉ quan tâm nó có thể có một cái gì đó để làm với định nghĩa kiểm soát thành công. – EFraim

2

Không phải là một lỗi jQuery - Working Demo

Có phải là một vấn đề với cái gì khác trong mã của bạn. Yếu tố ở đâu với id="test" trong đánh dấu của bạn?

EDIT:

Chỉ cần đọc chaos' answer, mà âm thanh như một lời giải thích chính đáng.

Bằng cách này, id phần tử phải là duy nhất trong HTML markup - đây là một phần của đặc tả HTML và có thể là một lời giải thích có thể

6

Như chaos says, có lẽ bạn đang gọi click() mỗi khi bạn thêm một, và họ đang tích lũy.

Nếu bạn đang thêm các mục này vào tài liệu động và cần đảm bảo rằng chức năng này được thêm vào mỗi mục bạn thêm, cách sử dụng trực tiếp?

$('#contents').on('click', '.newContentLink', function() { 
    $("#test").append("1"); 
}); 

Điều này sẽ đảm bảo quy tắc được áp dụng động một lần cho bất kỳ lớp đủ điều kiện nào trong tài liệu.

+0

Rất tiếc, MacAnthony đã đề xuất điều đó. –

+2

Tôi tin rằng cú pháp nên được .live ('click', function() { – MacAnthony

+0

Mã đó không hoạt động đối với tôi. Tôi đã kiểm tra tài liệu và điều này đã làm: $ (". NewContentLink"). Live ("click ", function() {$ (" # test ") append (" 1 ");}); – Eliyahu

1

Tôi đã có một vấn đề tương tự .... Đã tìm ra rằng tôi đã áp dụng chức năng thay đổi trong một vòng lặp ... tức là. mã trước của tôi là ....

$("table#UserIRTable > tbody > tr").each(function() 
{ 
    .............. 
    .............. 

    $("input[id='thisMonthSupply']").change(function(e){ 
     ...... 
    }); 
    .......... 
    .......... 
} 

mất chức năng thay đổi ra và bingo ... nó làm việc .....

2

Để đảm bảo chức năng chỉ thực hiện một lần vào một cú nhấp chuột kiện bạn có thể sử dụng $ (". newContentLink").một();

$(".newContentLink").one(function() { 
    $("#test").append("1"); 
}); 
7

hoặc bạn có thể unbind sự kiện nhấp chuột mỗi khi bạn thêm một yếu tố mới

$('.newContentLink').unbind('click'); 

$(".newContentLink").click(function() { 
    $("#test").append("1"); 
});