我正在编写一个jQuery插件,用于处理链接上的额外信息以指定打开方式。
例如,我想支持如下的标记:
<a href="somewhere" data-openmode="NewWindow" class="openmode" />
<a href="somewhere" data-openmode="Modal" class="openmode" />
<a href="somewhere" class="openmode" /> <!-- 没有指定 -->
第一个应该在新窗口中打开,第二个应该在模态对话框中打开,第三个应该使用本机行为打开(无论标签上设置了什么目标)。
我希望创建一个尽可能通用的插件来实现这种行为。到目前为止,我已经写了:
(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
方法监视load事件,但这无效:$(function(){ $(document).on("load",".openmode", function() { $(this).myOpenMode(); }); });
我知道这不可行,因为"load"事件不能冒泡。
我考虑修改我的插件,将"on"放在插件内部,但我不喜欢这个想法,因为它会在插件中引入一些超出范围的行为。
我也可以在创建动态节点时每次调用插件,但它也会在其他部分引入依赖。我的插件不会像我想象的那样独立。
有人有建议可以满足我的要求,并尽可能保持我的插件独立吗?
[编辑] 这应该可以在IE8及更高版本(最好还支持其他浏览器)中使用。
[编辑] 这里是一个jsFiddle,说明了这个问题(只需点击"Add",然后尝试单击新创建的元素)。
on()
。然而,据我所了解,观察者在IE中不存在,并且会影响性能。 - Steve Bmousedown
事件,而是应该捕获click
事件。如果使用键盘导航访问链接,此代码将失败。 - Alnitak