Làm cách nào để liên kết Sự kiện trên Nội dung được tải Ajax?


96

Tôi có một liên kết, myLinkcó thể chèn nội dung được tải bằng AJAX vào một div(phụ kiện) của trang HTML của tôi. Vấn đề là clicksự kiện mà tôi đã ràng buộc với jQuery không được thực thi trên nội dung mới được tải được chèn vào appendContainer. Sự clickkiện được ràng buộc trên các phần tử DOM không được tải bằng hàm AJAX của tôi.

Tôi phải thay đổi điều gì để sự kiện sẽ bị ràng buộc?

HTML của tôi:

<a class="LoadFromAjax" href="someurl">Load Ajax</a>
<div class="appendedContainer"></div>

JavaScript của tôi:

$(".LoadFromAjax").on("click", function(event) {
    event.preventDefault();
    var url = $(this).attr("href"),
        appendedContainer = $(".appendedContainer");

    $.ajax({
    url: url,
    type : 'get',
    complete : function( qXHR, textStatus ) {           
        if (textStatus === 'success') {
            var data = qXHR.responseText
            appendedContainer.hide();
            appendedContainer.append(data);
            appendedContainer.fadeIn();
        }
      }
    });

});

$(".mylink").on("click", function(event) { alert("new link clicked!");});

Nội dung được tải:

<div>some content</div>
<a class="mylink" href="otherurl">Link</a>

1
Lưu ý: Cách sau không hoạt động. Bạn bị thiếu .cho bộ chọn lớp.
không xác định

Đây là một lỗi đánh máy! Nó vẫn không hoạt động.
confile

1
Xem phương thức jquery .load () . $ ('# target'). load ('source.html');
km6zla

Load () có làm điều gì đó khác biệt không?
confile

Câu trả lời:


218

Sử dụng ủy quyền sự kiện cho các phần tử được tạo động:

$(document).on("click", '.mylink', function(event) { 
    alert("new link clicked!");
});

Điều này thực sự hoạt động, đây là một ví dụ mà tôi đã thêm một liên kết với lớp .mylinkthay vì data- http://jsfiddle.net/EFjzG/


Đây là những gì tôi đã viết mà tôi đã làm.
confile

@confile Thật không? Tôi đã đọc câu hỏi của bạn hai lần và không thấy nó bằng văn bản hay mã?
dsgriffin

@confile .. Xem câu trả lời agian .. điều đó khác với những gì bạn có
Mohammad Adil

2
@confile Câu trả lời của tôi không hoạt động !! đây là một ví dụ về nó - jsfiddle.net/EFjzG
dsgriffin

1
Xin chào, câu trả lời này đang hoạt động tốt. Sự kiện được đính kèm trên toàn bộ tài liệu, vì vậy về cơ bản mọi nhấp chuột trên trang đều kích hoạt sự kiện, nhưng sau đó, bộ chọn '.mylink' được áp dụng để lọc các sự kiện nhấp chuột mà chúng tôi cần. Kỹ thuật tuyệt vời.
Emir

23

Nếu nội dung được thêm vào sau khi .on () được gọi, bạn sẽ cần tạo sự kiện được ủy quyền trên phần tử mẹ của nội dung đã tải. Điều này là do trình xử lý sự kiện bị ràng buộc khi .on () được gọi (tức là thường khi tải trang). Nếu phần tử không tồn tại khi .on () được gọi, thì sự kiện sẽ không bị ràng buộc với nó!

Vì các sự kiện lan truyền thông qua DOM, chúng tôi có thể giải quyết vấn đề này bằng cách tạo một sự kiện được ủy quyền trên một phần tử mẹ ( .parent-elementtrong ví dụ bên dưới) mà chúng tôi biết là tồn tại khi trang tải. Đây là cách thực hiện:

$('.parent-element').on('click', '.mylink', function(){
  alert ("new link clicked!");
})

Một số bài đọc thêm về chủ đề này:


3
Tôi thích câu trả lời này hơn câu trả lời của @lifetimes, bởi vì nó yêu cầu tôi đặt trình xử lý thành một số phần tử mẹ có mặt tại thời điểm tải, không nhất thiết phải tất cả các tài liệu . Điều này làm cho bộ chọn trong đối số thứ hai onít bị khớp ngoài ý muốn hơn.
R. Schreurs

Nếu ajax tải lớp html cũng mẹ phần tử sau đó nó không làm việc
Jafar pinjar

6

nếu câu hỏi của bạn là "cách liên kết các sự kiện trên nội dung được tải ajax", bạn có thể làm như sau:

$("img.lazy").lazyload({
    effect : "fadeIn",
    event: "scrollstop",
    skip_invisible : true
}).removeClass('lazy');

// lazy load to DOMNodeInserted event
$(document).bind('DOMNodeInserted', function(e) {
    $("img.lazy").lazyload({
        effect : "fadeIn",
        event: "scrollstop",
        skip_invisible : true
    }).removeClass('lazy');
});

vì vậy bạn không cần đặt cấu hình của mình cho mọi mã ajax của bạn


2

Kể từ jQuery 1.7, .live()phương thức này không được dùng nữa. Sử dụng .on()để đính kèm các trình xử lý sự kiện.

Thí dụ -

$( document ).on( events, selector, data, handler );

1

Đối với những người vẫn đang tìm kiếm giải pháp, cách tốt nhất để làm điều đó là liên kết sự kiện trên chính tài liệu và không ràng buộc với sự kiện "sẵn sàng" Ví dụ:

$(function ajaxform_reload() {
$(document).on("submit", ".ajax_forms", function (e) {
    e.preventDefault();
    var url = $(this).attr('action');
    $.ajax({
        type: 'post',
        url: url,
        data: $(this).serialize(),
        success: function (data) {
            // DO WHAT YOU WANT WITH THE RESPONSE
        }
    });
});

});


1

Nếu phản hồi ajax của bạn chứa các đầu vào biểu mẫu html chẳng hạn, thì điều này sẽ rất tuyệt:

$(document).on("change", 'input[type=radio][name=fieldLoadedFromAjax]', function(event) { 
if (this.value == 'Yes') {
  // do something here
} else if (this.value == 'No') {
  // do something else here.
} else {
   console.log('The new input field from an ajax response has this value: '+ this.value);
}

});

0

sử dụng jQuery.live () để thay thế. Tài liệu tại đây

ví dụ

$("mylink").live("click", function(event) { alert("new link clicked!");});

9
.live()không được dùng nữa và bị loại bỏ trong phiên bản jquery mới nhất.
Mohammad Adil

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.