Я пишу плагин 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(); }); });
Я понимаю, что это не работает, потому что событие "load" не пузырится
-
Я подумывал о модификации моего плагина, чтобы поместить "on" внутри плагина, но мне не нравится эта идея, потому что она вводит некоторые из нестандартного поведения в плагине
-
Я могу также вызывать плагин каждый раз, когда создается динамический node, но он также вводит зависимости в другие части. Мой плагин не будет таким автономным, как хотелось бы.
Есть ли у кого-нибудь предложение для моего требования, сохраняя мой плагин как можно более изолированным?
[edit] Это должно работать с IE8 и более поздними версиями (и в идеале с другими браузерами)
[edit] здесь jsFiddle, которые иллюстрируют проблему (просто нажмите Add
и попробуйте нажать на вновь созданный элемент).