【发布时间】:2013-05-14 12:00:20
【问题描述】:
我正在编写一个 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”放在插件内部,但我不喜欢这个想法,因为它在插件中引入了一些超出范围的行为
我也可以在每次创建动态节点的时候调用插件,但是也会给其他部分引入依赖。我的插件不会像我希望的那样自主。
有没有人建议处理我的要求,让我的插件尽可能隔离?
[edit]这应该适用于 IE8 及更高版本(理想情况下适用于其他浏览器)
[编辑]这是一个说明问题的jsFiddle(只需单击Add 并尝试单击新创建的元素)。
【问题讨论】:
-
.on() 用于事件处理程序,而不是插件。每次创建动态节点时都必须调用插件,或者使用观察者检查何时将新的特定元素 (.openmode) 添加到 DOM 并根据此编写逻辑。当然,观察者可能会遇到一些性能问题。
-
在插件内部你没有使用 .on()。
-
@roasted:我不喜欢在插件中使用
on()。但是,据我了解我的谷歌搜索,IE 不存在观察者,并且是性能杀手。 -
不是一个很好的实现恕我直言 - 您不应该捕获
mousedown事件,而是捕获click事件。如果使用键盘导航访问链接,此代码将失败。 -
@Alnitak:你说得对,我会在我的实际代码中更改它
标签: jquery jquery-plugins