Я пишу плагин jquery, который должен обрабатывать дополнительную информацию о ссылках для указания открытого поведения.Плагин jQuery для применения также к динамически созданным элементам
Например, я хочу поддерживает разметку, как:
<a href="somewhere" data-openmode="NewWindow" class="openmode" />
<a href="somewhere" data-openmode="Modal" class="openmode" />
<a href="somewhere" class="openmode" /> <!-- Not specified -->
Первый должен открываться в новом окне, то второй в модальном диалоге , третье должно открыться с помощью собственного поведения (любая цель была установлена в теге).
Я хотел бы создать плагин для такого поведения как можно более общего. Я написал сейчас:
(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);
Этот код позволяет мне звонить из любой страницы что-то вроде:
$(function(){
$(".openmode").myOpenMode();
});
Это работает для статически сгенерированных тегов. Однако мои приложения могут генерировать разметку динамически (большую часть времени использует jsRender, но это не имеет значения).
Но поскольку это поведение настраивается один раз, когда загружается файл javascript, он не будет принимать динамически генерируемые объекты.
Что мне делать, чтобы удовлетворить мои требования?
Я пытался использовать метод
on
контролировать событие загрузки, но это не работает:$(function(){ $(document).on("load",".openmode", function() { $(this).myOpenMode(); }); });
Я понимаю, это не работает, потому что это событие «нагрузка» не пузырь
Я думал о том, чтобы модифицировать свой плагин, чтобы поместить «включено» внутри плагина, но мне не нравится эта идея, потому что она вводит некоторые изменения в режиме видимости в плагине
Я могу также вызывать плагин каждый раз, когда создается динамический узел, но он также вводит зависимости в другие части. Мой плагин не будет таким автономным, как хотелось бы.
Есть ли у кого-нибудь предложения по работе с моим требованием, сохраняя мой плагин как можно более изолированным?
[править] Это должно работать с IE8, а затем (и в идеале с другими браузерами)
[править] вот jsFiddle, иллюстрирующая проблему (просто нажмите на Add
и попробуйте нажать на вновь созданный элемент).
.on() для обработчиков событий, а не плагин.Вы должны вызывать плагин каждый раз, когда создается динамический узел, или с помощью наблюдателей, чтобы проверить, когда в DOM добавлен новый конкретный элемент (.openmode) и закодируйте свою логику в соответствии с этим. Конечно, наблюдатели могут получить некоторые проблемы с производительностью. –
внутри плагина вы не используете .on(). –
@roasted: Я не поклонник использования 'on()' внутри плагина. Однако, насколько я понимаю мои поисковые запросы Google, наблюдатели не существуют с IE и являются убийцами производительности. –