我正在编写一个 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(); }); });
我知道这不起作用,因为“加载”事件不会冒泡
我正在考虑修改我的插件以将“on”放在插件中,但我不喜欢这个想法,因为它在插件中引入了一些超出范围的行为
我也可以在每次创建动态节点时调用插件,但它也会将依赖项引入其他部分。我的插件不会像我想要的那样自主。
有没有人建议处理我的要求,让我的插件尽可能隔离?
[编辑]这应该适用于 IE8 及更高版本(理想情况下适用于其他浏览器)
[编辑]这是一个说明问题的jsFiddle(只需单击Add
并尝试单击新创建的元素)。