2012-07-19 18 views
55

Mam element a wywoływania modalnym:Jak zdobyć element Invoker na Twitterze Bootstrap Modal?

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

I powiedzieć, że to moja modalne:

<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> 

mogę powiązać funkcje do zdarzeń opalanych modalne:

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

Moje pytanie brzmi: Jak mogę uzyskać dostęp do elementu a, który wywołał modal - z funkcji subskrybowania zdarzeń?

+0

'$ (" a [href = '# myModal '] ")' wybierze ten tag 'a'. Czy tego właśnie szukasz? – sachleen

+0

Nie, to nie jest tak naprawdę. Ponieważ może to być wszystko zamiast #mymodalu. To, czego szukam, to: event.relatedTarget lub event.OriginalTarget lub coś w tym stylu. – cnkt

+0

Czy nie musi to być '# mymodal', aby uruchomić modalny' mymodal'? Możesz zastąpić "mymodal" zmienną zawierającą identyfikator elementu, którego zdarzenie się znajduje. – sachleen

Odpowiedz

91

Został rozwiązany w Bootstrap 3.0.0 dzięki event.relatedTarget.

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

i co jeśli chciałbym poznać element, który odwołał się do ukrycia modalu? – axel

+0

Dobre pytanie, obecnie nic nie wskazuje na to. –

+2

Czy jest jakieś obejście tego w bootstrap 2.3? – Ashimema

1

Obecnie nie jest dostępna po wyjęciu z pudełka. Istnieje żądanie funkcji i obejście, jeśli chcesz samodzielnie zmodyfikować kod bootstrap-modalny.

Zobacz here

+1

Przesłano żądanie [pull request] (https://github.com/twitter/bootstrap/pull/6256), ale z jakiegoś powodu zostało odrzucone. To jest funkcja, którą bardzo chciałbym zobaczyć. – Bojangles

1

miałem sytuację, w której musiałem wiązać pewne dane związane z „wywołał”, tak jak pan powiedział. udało mi się go rozwiązać poprzez wiązanie „kliknięcie” wydarzenie do niego i pracy z danymi tak:

wywołującego

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

JS złapać dane dotyczące wywołującego (Tylko niektóre przykładowy kod)

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

Jak to można obsługiwać dane dotyczące Twojej wywołującego tak chcesz.

16

Trzeba posłuchać:

$('[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')); 
}); 

można oczywiście zastąpić show.bs.modal z shown.bs.modal lub jakiekolwiek inne zdarzenie oni ogień. Należy zauważyć, że dotyczy to Bootstrap 3.0.0. Jeśli używasz 2.3.2, musisz pozbyć się .bs.modal (jak sądzę).


Co podoba mi się w tym rozwiązaniu: nie musisz pamiętać, kto jest ten, self, że i inne rozwiązania zastępcze wywołań.

Oczywiście należy sprawdzić, czy atrybut href nie jest rzeczywistym łączem (opcja dynamicznego ładowania modalnego).

+0

Najlepsze opcje do mojej sprawy. I tak, w 2.3.2 musisz usunąć .bs.modal. –

+0

Niezwykle sprytne rozwiązanie! Chciałbym móc wielokrotnie powtarzać to rozwiązanie. Mój problem polegał na tym, że modal został wywołany z wielu elementów i chciałem element wyzwalający po kliknięciu przycisku w modalu. Chociaż konwencjonalna metoda używania 'show.bs.modal' i' event.relatedTarget' jest możliwa, albo skończyłbym robić niepotrzebne wywołania 'unbind()' i/lub kompromis z wydajnością. Znów na zdrowie! – Fr0zenFyr

6

Element modalna ma obiektu danych o nazwie modal który zapisuje wszystkie opcje, które są przekazywane. Możesz ustawić atrybut danych źródłowych na elemencie, który wyzwala modal, ustawić go na identyfikator źródła, a następnie pobrać go później ze zmiennej options.

Spust byłoby:

<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> 

W zwrotnego zdarzeń, uzyskać obiektu modal danych, i spojrzeć na opcji source:

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

Początkowo wydawało mi się, że to działa, ale jak tylko miałem więcej niż jedno źródło, przestało działać. Wygląda na to, że modal zachowuje opcje od pierwszego uruchomienia, więc niezależnie od tego, którą kotwicę klikniesz jako pierwszą, użyje źródła danych z tego we wszystkich kolejnych operacjach. – izak