jQuery插件也适用于动态创建的元素

前端之家收集整理的这篇文章主要介绍了jQuery插件也适用于动态创建的元素前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个jQuery插件,应该处理链接上的额外信息以指定开放行为.

例如,我想支持如下标记

>< a href =“某处”data-openmode =“NewWindow”class =“openmode”/>
>< a href =“某处”data-openmode =“Modal”class =“openmode”/>
>< a href =“某处”class =“openmode”/> <! - 未指定 - >

第一个应该在新窗口中打开,第二个在一个模态对话框中打开,第三个应该使用本机行为打开(无论目标在标签上设置).

我想为这个行为创建一个插件,尽可能的通用.我现在写的:

  1. (function ($) {
  2. $.fn.myOpenMode = function () {
  3. return this.mousedown(function () {
  4. var $this = $(this);
  5.  
  6. var mode = $this.data("openmode");
  7. var href = this.href;
  8. var handled = true;
  9. if (mode) {
  10. switch (mode) {
  11. case "NewWindow":
  12. case "1":
  13. window.open(href,"_blank");
  14. break;
  15. case "Dialog":
  16. case "2":
  17. openAsDialog(href);
  18. break;
  19.  
  20. // Actually,there are other options,but I removed them for clarity
  21.  
  22. default:
  23. handled = false;
  24. }
  25. }
  26. else {
  27. handled = false;
  28. }
  29. return !handled;
  30. });
  31. };
  32. })(jQuery);

代码允许我从任何页面调用如下:

  1. $(function(){
  2. $(".openmode").myOpenMode();
  3. });

这适用于静态生成标签.但是,我的应用程序可能动态生成标记(大部分时间使用jsRender,但这并不重要).

但是,因为这个行为是在javascript文件被加载时设置一次,所以不会采取动态生成的对象.

我应该怎么处理我的要求?

>我试图使用on方法监视加载事件,但这不起作用:

  1. $(function(){
  2. $(document).on("load",".openmode",function() { $(this).myOpenMode(); });
  3. });

我明白这不行,因为“加载”事件不起泡
>我正在考虑修改我的插件,将“on”放在插件中,但是我不喜欢这个想法,因为它在插件中引入了一些超出范围的行为
>我也可以在创建动态节点时调用插件,但也会将依赖关系引入其他部分.我的插件不会像我想要的一样自主.

有没有人有建议来处理我的要求,保持我的插件尽可能隔离?

这应该适用于IE8和更高版本(最好与其他浏览器)

这里是一个说明问题的jsFiddle(只需点击添加并尝试点击新创建的元素).

解决方法

添加到$.fn的插件应仅适用于列出的元素,而不适用于任何未来的元素.

您应该专注于让您的插件提供机制,例如:

  1. (function($) {
  2.  
  3. $.fn.openmode = function(cmd) {
  4. cmd = cmd || 'on';
  5.  
  6. switch (cmd) {
  7.  
  8. case 'click':
  9. // read props,open windows,etc
  10. break;
  11.  
  12. case 'on':
  13. this.addClass('openmode');
  14. break;
  15.  
  16. case 'off':
  17. this.removeClass('openmode');
  18. break;
  19. }
  20. });
  21.  
  22. })(jQuery);

然后允许插件用户注册触发该机制的事件处理程序,必要时使用事件委派:

  1. $(document).on('click','a.openmode',function() {
  2. $(this).openmode('click');
  3. });

后一个代码也可以放在jQuery命名空间中,作为一个效用函数

  1. (function($) {
  2. $.openmode = function(cmd) {
  3. cmd = cmd || 'on';
  4.  
  5. switch (cmd) {
  6.  
  7. case 'on':
  8. $(document).on('click.openmode',function() {
  9. $(this).openmode('click');
  10. });
  11. break;
  12.  
  13. case 'off':
  14. $(document).off('click.openmode','a.openmode');
  15. break;
  16. }
  17. };
  18. })(jQuery);

这样只要打电话:

  1. $.openmode();

将为每个当前(和将来).openmode元素启用插件所需的所有工作.

猜你在找的jQuery相关文章