2011-11-29 29 views
9

Làm thế nào để tạo ra vấn đề:jquery .Trên (nghe tiếng 'click', func) chức năng không làm công việc của mình

  1. nhấp chuột vào các đường link kích hoạt hiện tại - một cái gì đó xảy ra (pass)
  2. nhấp chuột vào "add kích hoạt "nút, mà gắn thêm một liên kết kích hoạt mới w/cùng lớp
  3. nhấp chuột vào liên kết mới được tạo ra, và nó không làm điều tương tự như 2 liên kết 1 đã tồn tại ngay từ đầu (không)

Đây là ví dụ của tôi -: http://jsbin.com/equjig/3/edit

Tôi nghĩ rằng chức năng .on('click', func) là tốt cho việc thêm sự kiện vào các yếu tố hiện tại trong dom, mà còn cho các yếu tố tương lai được thêm vào dom?

Đây là javascript hiện tại của tôi:

$(document).ready(function() { 
    $(".link").on('click', function(e) { 
    e.preventDefault(); 
    $("#out").append("clicked<br/>"); 
    }); 

    $("#b1").on('click', function() { 
    $("#p1").append("<a href='#' class='link'>new trigger</a>"); 
    }); 

đây là HTML

<button type="button" id="b1">add trigger</button> 
    <p id="p1"> 
    <a href="#" class="link">trigger 1</a> 
    <a href="#" class="link">trigger 2</a> 
    </p> 
    <div id="out"></div> 

Note - im sử dụng jQuery 1,7

Cảm ơn!

+7

Ồ, dường như không ai biết rằng jQuery 1.7 không dùng nữa. Không còn câu trả lời trực tiếp nào nữa! – mrtsherman

+0

@mrtsherman Hoặc không ai cảm thấy nó hợp lý để đi đến jsbin, kiểm tra phiên bản jQuery OP đang sử dụng, và phân biệt nó với ba phiên bản khác cũng được tải. Tôi đoán là một số ít người biết, nhưng có xu hướng dựa vào những câu hỏi hoàn chỉnh hơn - mà tôi tin là hợp lý. Các câu hỏi nên bao gồm các phiên bản và mã, đặc biệt khi nó ngắn. –

+2

@ DᴀᴠᴇNᴇᴡᴛᴏɴ - Tôi nghĩ nó khá rõ ràng. 'On' thậm chí không tồn tại trước 1.7 nên anh ta phải sử dụng nó. Anh ta cung cấp mã mà anh ta sử dụng '.on ('click', func)' – mrtsherman

Trả lời

15

Bạn đang ở gần đó với trên ...

dụ làm việc: http://jsbin.com/equjig/6/edit

$(document).ready(function() { 
    $('#p1').on('click','.link', function(e) { 
     e.preventDefault(); 
     $("#out").append("clicked<br/>"); 
    }); 
}); 

này sẽ làm việc - bạn nên chọn một div mẹ của .link yếu tố (i đã sử dụng $('#p1') đây, giống như trong jsbin của bạn)

+0

@Jasper - cảm ơn bạn đã cập nhật – ManseUK

0

Sự kiện onclick chỉ áp dụng cho các phần tử đã tồn tại. Bạn cần sử dụng chức năng .live.

+2

trực tiếp không được chấp nhận vào ngày – mrtsherman

+0

@mrtsherman: Cảm ơn bạn đã thông tin! Không biết. – EmCo

4

.on() cũng có thể cư xử như .delegate() được sử dụng như thế này:

//#p1 is the context and .link is what will be bound to as long as the .link element is a descendant of #p1 
$('#p1').on('click', '.link', function(e) { 
    e.preventDefault(); 
    $("#out").append("clicked<br/>"); 
}); 

Dưới đây là tài liệu cho .on(): http://api.jquery.com/on

+4

+1 - rất nhiều câu trả lời sai khó để tìm ra câu trả lời đúng cho +! – mrtsherman

4

Theo các tài liệu api cho on chữ ký .on('click', func) tái tạo hành vi .bind 's - đó là để nói, nó liên kết người nghe với mỗi phần tử hiện tại trong bộ sưu tập.

Để có được .delegate hành vi - có nghĩa là, để ràng buộc với nhau và mỗi sự kiện mà có nguồn gốc từ một loại cụ thể của nguyên tố (trẻ em), bao gồm một selector:

$("parent-selector").on('click', 'your-selector', func) 
+0

@Ian Davis - tất nhiên, bạn sẽ cần phải chắc chắn rằng bạn đang sử dụng 1,7 - 'on' không tồn tại trong các phiên bản trước của jQuery. –

+2

+1 - câu trả lời hay. Trong trường hợp của OP, một cái gì đó như thế này sẽ hoạt động - '$ (" # p1 "). On ('click', '.link', function (e)' – mrtsherman

+1

Anh ta .... kiểm tra jquery hes bằng cách sử dụng ->/*! jQuery v1.7.1 jquery.com | jquery.org/license */ – ManseUK

-2

Thay đổi .Trên() để. sống()

$(document).ready(function() { 
    $(".link").live('click', function(e) { 
    e.preventDefault(); 
    $("#out").append("clicked<br/>"); 
    }); 

    $("#b1").on('click', function() { 
    $("#p1").append("<a href='#' class='link'>new trigger</a>"); 
    }); 
}); 
+4

'.ive()' được khấu hao như của jQuery 1.7. – Jasper

2

Bạn có thể sử dụng .on() từ phiên bản 1.7, và nó cũng phần nào thay thế cũ .live() ngoại trừ cách bạn cung cấp cú pháp.

Sử dụng .on() bạn có thể ủy sự kiện để bất kỳ yếu tố phụ huynh như thế này:

$(document.body).on('click','.link',function() { 
    // handler for all present and future .link elements inside the body 
}); 

Bằng cách này, nó cũng sẽ làm việc cho các yếu tố tương lai mà được thêm vào bên trong cơ thể mà có className 'link'.

Tôi đã thực hiện một sửa đổi nhỏ đối với lint của bạn hoạt động theo cách bạn mong đợi: http://jsbin.com/adepam. Và đây là mã:

$(document).ready(function() { 
    $(document.body).on('click', '.link', function(e) { 
    e.preventDefault(); 
    $("#out").append("clicked<br/>"); 
    }); 
    $("#b1").on('click', function() { 
    $("#p1").append("<a href='#' class='link'>new trigger</a>"); 
    }); 
}); 
Các vấn đề liên quan