Piszę wtyczkę jQuery, która powinna obsługiwać dodatkowe informacje o łączach, aby określić zachowanie otwarte.Wtyczka jQuery do zastosowania również na dynamicznie tworzonych elementach
Na przykład, chcę obsługuje znaczników takich jak:
<a href="somewhere" data-openmode="NewWindow" class="openmode" />
<a href="somewhere" data-openmode="Modal" class="openmode" />
<a href="somewhere" class="openmode" /> <!-- Not specified -->
Pierwszy powinien otworzyć się w nowym oknie, drugi w oknie modalnym Trzeci powinien otwierać się z natywnym zachowaniem (jakikolwiek cel został ustawiony na tagu).
Chciałbym utworzyć wtyczkę dla tego zachowania tak generycznego, jak to tylko możliwe. Pisałem już:
(function ($) {
$.fn.myOpenMode = function() {
return this.mousedown(function() {
var $this = $(this);
var mode = $this.data("openmode");
var href = this.href;
var handled = true;
if (mode) {
switch (mode) {
case "NewWindow":
case "1":
window.open(href, "_blank");
break;
case "Dialog":
case "2":
openAsDialog(href);
break;
// Actually, there are other options, but I removed them for clarity
default:
handled = false;
}
}
else {
handled = false;
}
return !handled;
});
};
})(jQuery);
Ten kod pozwala mi zadzwonić z dowolnego widoku coś takiego:
$(function(){
$(".openmode").myOpenMode();
});
ten pracuje dla statycznie wygenerowanych tagów. Jednak moje aplikacje mogą generować znaczniki dynamicznie (przez większość czasu przy użyciu jsRender, ale to nie ma znaczenia).
Ale ponieważ to zachowanie jest skonfigurowane tylko raz, gdy plik javascript jest załadowany, nie pobiera obiektów generowanych dynamicznie.
Co należy zrobić, aby spełnić moje wymagania?
Próbowałem użyć metody
on
do monitorowania zdarzeń obciążenia, ale to nie działa:$(function(){ $(document).on("load",".openmode", function() { $(this).myOpenMode(); }); });
Rozumiem to nie działa, ponieważ zdarzenie „obciążenie” nie propaguje
Zastanawiam się nad modyfikacją wtyczki, aby umieścić "na" w wtyczce, ale nie podoba mi się ten pomysł, ponieważ wprowadza pewne zachowanie poza zakresem w wtyczce
Mogę też wywoływać wtyczkę za każdym razem, gdy tworzony jest węzeł dynamiczny, ale także wprowadzać zależności do innych części. Moja wtyczka nie będzie tak autonomiczna, jak bym chciał.
Czy ktoś ma sugestię, aby obsłużyć moje wymagania, utrzymując moją wtyczkę tak odizolowany, jak to możliwe?
[edytuj] Powinno to działa z IE8 i później (a najlepiej z innych przeglądarek)
[edytuj] o to jsFiddle które ilustrują problem (wystarczy kliknąć na Add
i spróbuj kliknąć na nowo utworzony element).
.Na() służy do obsługi zdarzeń, a nie wtyczki.Musisz wywoływać wtyczkę za każdym razem, gdy tworzony jest węzeł dynamiczny lub za pomocą obserwatorów, aby sprawdzić, kiedy nowy element (.openmode) zostanie dodany do DOM i zakodować logikę zgodnie z tym. Oczywiście obserwatorzy mogą mieć problem z wydajnością. –
wewnątrz wtyczki, której nie używasz .on(). –
@roasted: Nie jestem fanem używania 'on()' wewnątrz wtyczki. Jednakże, o ile rozumiem moje wyszukiwania google, obserwatorzy nie istnieją z IE i są zabójcami wydajności. –