2012-07-19 26 views
55

Tôi đã có một yếu tố a cho cách gọi phương thức:Làm cách nào để lấy phần tử invoker của Twitter Bootstrap Modal?

<a class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" >Launch Modal</a> 

Và, nói rằng đây là phương thức của tôi:

<div class="modal hide" id="myModal"> 
    <div class="modal-header"> 
    <button type="button" class="close" data-dismiss="modal">×</button> 
    <h3>Modal header</h3> 
    </div> 
    <div class="modal-body"> 
    <p>One fine body…</p> 
    </div> 
    <div class="modal-footer"> 
    <a href="#" class="btn" data-dismiss="modal">Close</a> 
    <a href="#" class="btn btn-primary">Save changes</a> 
    </div> 
</div> 

tôi có thể liên kết các chức năng với các sự kiện bị sa thải bởi phương thức:

$('#myModal').on('hidden', function() { 
    // do something… 
}) 

Câu hỏi của tôi là: Làm cách nào tôi có thể truy cập vào phần tử a -những gì đã gọi phương thức - từ chức năng người đăng ký sự kiện của tôi?

+0

'$ (" a [href = '# myModal '] ")' sẽ chọn thẻ 'a' đó. Đó là những gì bạn đang tìm kiếm? – sachleen

+0

Không, nó không thực sự. Bởi vì nó có thể là bất cứ thứ gì thay vì #mymodal. Những gì tôi đang tìm kiếm là như: event.relatedTarget hoặc event.OriginalTarget hoặc một cái gì đó như thế. – cnkt

+0

Nó không phải là '# mymodal' cho nó để khởi động phương thức' mymodal'? Bạn có thể thay thế "mymodal" bằng một biến chứa ID của phần tử có sự kiện bạn đang nhập. – sachleen

Trả lời

91

Nó đã được giải quyết trong Bootstrap 3.0.0 nhờ event.relatedTarget.

$('#your-modal').on('show.bs.modal', function (e) { 
    var $invoker = $(e.relatedTarget); 
}); 
+5

và điều gì sẽ xảy ra nếu tôi muốn biết nguyên tố đã gọi ẩn của phương thức? – axel

+0

Trục câu hỏi tốt, hiện tại có vẻ như không có gì cho điều đó. –

+2

Có công việc nào cho việc này trong bootstrap 2.3 không? – Ashimema

1

Hiện tại, nó không có sẵn ngoài hộp. Có một yêu cầu tính năng cho nó và một work-around nếu bạn muốn tự mình chỉnh sửa mã bootstrap-modal.

Xem here

+1

Đã có [yêu cầu kéo] (https://github.com/twitter/bootstrap/pull/6256) được gửi nhưng bị từ chối vì một số lý do. Đây là một tính năng tôi rất muốn xem. – Bojangles

1

tôi đã có một tình huống mà tôi đã để ràng buộc một số dữ liệu liên quan đến việc "Invoker", giống như bạn nói. tôi đã quản lý để giải quyết nó bằng cách gắn một sự kiện "click" vào nó và làm việc với các dữ liệu như thế này:

Các Invoker

<img id="element" src="fakepath/icon-add.png" title="add element" data-toggle="modal" data-target="#myModal" class="add"> 

Các JS để bắt dữ liệu liên quan đến Invoker (Chỉ một số ví dụ về mã)

$('#element').on('click', function() { // Had to use "on" because it was ajax generated content (just an example) 
    var self = $(this); 
}); 

Như thế này, bạn có thể xử lý dữ liệu liên quan đến người gọi của mình dù bạn muốn.

16

Bạn cần phải nghe:

$('[data-toggle="modal"]').on('click', function() { 
    $($(this).attr('href')).data('trigger', this); 
}); 
$('.modal').on('show.bs.modal', function() { 
    console.log('Modal is triggered by ' + $(this).data('trigger')); 
}); 

Bạn có thể thay thế tất nhiên show.bs.modal với shown.bs.modal hoặc bất kỳ sự kiện khác mà họ sa thải. Lưu ý rằng đây là dành cho Bootstrap 3.0.0. Nếu bạn đang sử dụng 2.3.2, bạn cần phải loại bỏ .bs.modal (Tôi nghĩ).

Điều tôi thích về giải pháp này: bạn không cần phải nhớ ai là , tự, rằng và các giải pháp proxy khác.

Tất nhiên, bạn phải kiểm tra xem thuộc tính href không phải là một liên kết thực (tùy chọn tải phương thức động).

+0

Các tùy chọn tốt nhất cho trường hợp của tôi. Và, vâng, trong 2.3.2 bạn cần phải loại bỏ .bs.modal. –

+0

Giải pháp tuyệt vời thông minh! Tôi ước tôi có thể upvote giải pháp này nhiều lần. Vấn đề của tôi là một phương thức được kích hoạt từ nhiều phần tử và tôi muốn phần tử kích hoạt khi nhấp vào một nút trong phương thức. Mặc dù, đường dẫn thông thường của việc sử dụng 'show.bs.modal' và' event.relatedTarget' là có thể, nhưng tôi sẽ kết thúc việc thực hiện các cuộc gọi 'unbind()' không cần thiết và/hoặc thỏa hiệp với hiệu suất. Chúc mừng một lần nữa! – Fr0zenFyr

6

Phần tử phương thức có đối tượng dữ liệu có tên modal để lưu tất cả các tùy chọn được chuyển. Bạn có thể đặt thuộc tính dữ liệu 'nguồn' trên phần tử kích hoạt phương thức, đặt nó thành ID của nguồn và sau đó truy xuất thuộc tính sau từ biến số options.

Trigger sẽ là:

<a id="launch-modal-1" class="btn" data-toggle="modal" data-target="#myModal" href="http://some-url" data-source="#launch-modal-1">Launch Modal</a> 

Trong callback sự kiện, nhận đối tượng modal dữ liệu, và nhìn vào source tùy chọn:

$('#myModal').on('hidden', function() { 
    var modal = $(this).data('modal'); 
    var $trigger = $(modal.options.source); 
    // $trigger is the #launch-modal-1 jQuery object 
}); 
+2

Điều này ban đầu dường như phù hợp với tôi, nhưng ngay sau khi tôi có nhiều nguồn thì nó ngừng hoạt động. Có vẻ như phương thức giữ các tùy chọn từ lần đầu tiên nó được gọi, vì vậy bất cứ cái neo nào bạn bấm đầu tiên, nó sẽ sử dụng nguồn dữ liệu từ nguồn đó trong tất cả các hoạt động tiếp theo. – izak

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