【问题标题】:Is it possible to use a jquery function such as delegate to listen to jquery ui events?是否可以使用委托等jquery函数来监听jquery ui事件?
【发布时间】:2012-06-28 17:12:45
【问题描述】:

我想知道是否可以使用.delegate().on() 之类的函数或任何可以侦听 jquery UI 事件(例如draggable)的函数。我有以下内容:

HTML:

  <div id="wrapper"></div>​

javaScript:

$(function(){

  var addMe='<div id="draggable" class="ui-widget-content"><p>Drag me around</p></div>'

  $( "#wrapper" ).delegate('#draggable','draggable',function(){
       console.log('its something!');
  });

  //$(".draggable").draggable();
  $("#wrapper").append(addMe) 
})

将成为draggable 的元素是动态添加的,因此我想使用delegateon

还请注意,我知道How do I add draggable List Items from the result of a .ajax GET?,即使该解决方案对我有用,我也必须修改 .post() 函数,这不是我要问的。

这里是problem

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-draggable


    【解决方案1】:

    这是一个很常见的问题......如何使用委托来调用插件,并且没有像on()这样的圣杯。在几乎所有 jQueryUI 小部件的情况下,所涉及的远不止简单的绑定事件,还需要构造 html 和元素数据。

    虽然没有委托方法,但如果它适合您的应用程序,您可以使用 $.ajaxComplete() 作为全局处理程序来初始化插件。它可以绑定到任何元素,允许在处理程序中使用this

     $('#content').ajaxComplete(function(e, xhr, settings){
         /* url conditional*/
          if (settings.url == 'getMoreDraggables.php') {
                $(this).find('.newDraggable').removeClass('newDraggable').draggable()
          }
          /* element conditional */
         if( $(this).find('.newDraggable').length){  
            /* run code for true*/
         }
    
    });
    

    也可以基于xhr对象添加条件

    【讨论】:

    • 谢谢!我不知道这个ajaxComplete()。虽然默认情况下它会在任何 ajaxComplete 事件完成时触发,但我想知道为什么你不能 jail 将它发送给选择器,使用条件来查看它是否适用听起来像是在浪费计算时间。
    • 这是灵活性的一部分,甚至可以将其绑定到文档。或者可以为不同的元素附加几个。也是跨浏览器友好的,而我认为其他解决方案不需要并且需要垫片。而不是全局,每次都不要运行它自己使用 ajax 回调
    • 对不起,我不是说你不能,我的意思是每次 ajax 完成时都会触发 ajaxComplete,它不会仅在附加的选择器完成时触发。或者至少文件是这么说的。
    • 然后使用实际调用的回调或延迟。可以设置一个触发页面加载元素的自定义事件,然后在 ajax 中使用trigger 做同样的事情success
    【解决方案2】:

    无法使用事件委托来自动创建 jQuery UI 小部件。您最好的选择是明确地销毁和重新创建。

    $('.draggable').draggable('destroy');
    $('.draggable').draggable();
    

    http://jsfiddle.net/hTCLB/

    【讨论】:

    • 嗯,不确定这是不是真的。 jsfiddle.net/hTCLB/2 将其放在 `$('#wrapper').append(addMe) 上方不起作用。随着 dom 终于准备就绪,您的解决方案似乎最终会奏效。
    • @EH_warch 是的,我的意思是 OP 的要求是不可能的。小提琴表明您只需要在 DOM 更改完成后显式调用这两行。
    【解决方案3】:

    您不能在 Ajax 请求的回调中执行一个调用 .draggable() 的函数吗?

    否则,您可以使用DOM Mutation Observer 观察包装器,并在添加新元素时使用匿名函数调用.draggable()。正如你所问的,它与事件委托非常相似,但我不确定这对旧版本的 IE 有多好。

    使用观察者的示例代码:

    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
    
    var observer = new MutationObserver(function (mutations) {
        mutations.forEach(function (mutation) {
            if (mutation.type === 'childList' && mutation.addedNodes.length) {
                $("#draggable").draggable();
            }
        });
    });
    observer.observe($('#wrapper')[0], { attributes: false, childList: true, characterData: true });
    

    JSFiddle with DOM Mutation Observer

    Reference

    此外,如果您不能为此使用 Ajax 调用的回调,那么您的应用程序中可能存在逻辑/设计缺陷。我建议在作为 DOM Mutation Observer 推倒黑客之前先看一下。

    【讨论】:

    • 至于第一段 nop,这是我在我的问题中提到的帖子中得到的答案。但我会关注你提供的链接,你有例子吗?
    • JSFiddle 对我来说真的很慢 atm,但我应该有一些例子——尽管 MDN 页面已经有几个。 =]我会看看我的示例文件夹。
    • @EH_warch 我在我的文件夹中找不到任何东西,所以我从头开始写了一个,看看它是否有帮助。
    猜你喜欢
    • 2018-11-12
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多