2012-02-10 33 views
5

tl; dr: Làm cách nào để có được một phần tử DOM được hiển thị bởi trình xử lý nhấp chuột phần tử trước khi đóng của body ngay cả khi các yếu tố được tạo động được thêm vào?jQuery - tạo thành phần tử cuối cùng trong DOM (trước khi đóng phần thân) ngay cả sau các phần tử được tạo động

Về cơ bản, tôi muốn có lần nhấp mở phần tử cũng di chuyển nó trong DOM để cuối cùng trước khi cơ thể đóng ngay cả sau khi một số yếu tố động đã được nối.


Sự cố của tôi bắt nguồn từ một phương thức đang được mở trong một phương thức khác trong khi có nhiều phương thức trên một trang. Một bắt là các submodals tồn tại trong DOM khi tải trang trong khi các modals chính đang được khởi tạo onclick (các submodals sử dụng mã khác nhau để tạo ra trong khi các submodals sử dụng jQuery UI dialog).

Nếu bạn mở một phương thức và sau đó mở tất cả các submodal là tốt. Nếu bạn mở một phương thức thứ hai, sau đó đóng nó lại khi bạn mở lại phương thức đầu tiên, submodal sẽ không xuất hiện khi nó được ẩn bên dưới phương thức thứ hai. Nếu tôi gắn các submodals này vào cơ thể, do đó đặt chúng sau khi bất kỳ phương thức được tạo nào chúng xuất hiện tốt (nhưng điều đó tạo ra các vấn đề khác). Mặc dù có vẻ như đây không phải là vấn đề chỉ mục z (tôi đã thử mọi thứ liên quan đến điều đó mà không có may mắn), nó dường như liên quan đến nơi các modals này được định vị trong DOM.

Mã có thể rõ ràng hơn:

Đây là những gì html trông giống như trên tải trang:

<div id='submodal_1' class='submodal'>foo</div> 
<div id='submodal_2' class='submodal'>bar</div> 
</body> 

Sau khi bạn nhấp vào để mở cửa sổ modal tiểu học đầu tiên:

<div id='submodal_1'>subfoo</div> 
<div id='submodal_2'>subbar</div> 
<div id='primary_modal_1' class='ui-dialog' style='display:block'>foo</div> 
</body> 

Sau bạn bấm vào để mở modal của submodal tôi phải di chuyển submodal để được dưới các phương thức chính nếu không nó sẽ không xuất hiện (và một lần nữa, z-index không ảnh hưởng đến việc chặn này):

$('#submodal_1').insertAfter('#primary_modal_1'); 

Tại thời điểm này nếu bạn đóng số #primary_modal_1 nó sẽ bị ẩn nhưng vẫn còn trong DOM. Nếu bạn mở một giây mã bây giờ sẽ trông giống như:

<div id='submodal_2' class='submodal'>subbar</div> 
<div id='primary_modal_1' class='ui-dialog' style='display:none'>foo</div> 
<div id='submodal_1' class='submodal'>subfoo</div> 
<div id='primary_modal_2' class='ui-dialog' style='display:block'>bar</div> 
</body> 

Tại thời điểm này nếu bạn mở lại các phương thức chính đầu tiên và cố gắng mở submodal của nó submodal sẽ không xuất hiện. Tuy nhiên, nếu bạn di chuyển mô hình con xuống dưới phương thức chính cuối cùng, như vậy:

<div id='submodal_2' class='submodal'>subbar</div> 
<div id='primary_modal_1' class='ui-dialog' style='display:block'>foo</div> 
<div id='primary_modal_2' class='ui-dialog' style='display:none'>bar</div> 
<div id='submodal_1' class='submodal'>subfoo</div> //<-- moved this line 
</body> 

Submodal sẽ phát hiện chính xác. Tôi muốn đảm bảo rằng các submodals luôn luôn là cuối cùng trong DOM, bất kể có bao nhiêu modals chính được nối thêm.

Trả lời

6

Phương pháp nối thêm của JQuery "Chèn nội dung, được chỉ định bởi tham số, vào cuối mỗi phần tử trong tập hợp các phần tử phù hợp."

$('body').append(...); 

Bạn sẽ phải di chuyển phần tử mỗi lần một thứ được thêm động.

Kiểm tra JSFiddle này: http://jsfiddle.net/eZ2Dq/

+0

Tính năng này hoạt động tốt đối với các yếu tố đã có trong DOM nhưng không hoạt động đối với các yếu tố được thêm động. Các modals được bổ sung động sẽ là cuối cùng trong DOM khi chúng được tạo. – Stuart

+0

Tôi đang làm việc trên một JSFiddle ... – FMaz008

+0

Xong, bạn có thể kiểm tra JSfiddle cho một POC :) – FMaz008

1

Bạn có thể luôn clone các yếu tố, append clone để cuối của thẻ <body>, sau đó remove các yếu tố gốc.


Rob W đã chỉ ra rằng nhân bản không cần thiết, do việc gọi thêm vào phần tử hiện có sẽ tự động xóa nó khỏi vị trí trước đó. Với ý nghĩ đó, bạn có thể mở rộng mã của bạn để mở một cửa sổ modal mới để làm một cái gì đó như thế này:

$('.submodal').appendTo('body'); 

mà nên (giả sử tôi đã hiểu được một cách chính xác API) xáo trộn tất cả các yếu tố submodal (được xác định bởi lớp submodal) đến cuối thẻ <body>.

+0

Nhân bản là không cần thiết. Khi nối thêm một phần tử, nó sẽ bị xóa khỏi vị trí trước đó. –

+0

@RobW Tốt để biết, cảm ơn. Tôi không thể nói rằng tôi đã bao giờ cần phải chắp thêm một yếu tố đã tồn tại trước đây vì vậy nó không phải cái gì tôi đã thực sự nhìn vào. –

Các vấn đề liên quan