可拖动的 jQuery UI 不适用于新创建的 DOM 元素

Posted

技术标签:

【中文标题】可拖动的 jQuery UI 不适用于新创建的 DOM 元素【英文标题】:jQuery UI draggable is not working on newly created DOM element 【发布时间】:2012-04-05 16:26:29 【问题描述】:

我有一些可以使用 jQuery UI 拖动的 DOM 元素。一切正常,但是当我使用 jQuery 创建一些元素时,它们根本不可拖动。即

$('div.draggable').draggable(); //Existing element , it works :)
$('p.draggable').draggable() ; //Newly created paragraph with same class name, it doesnt work at all :(

提前致谢!!!

我正在尝试这个:

<script type="text/javascript">
     $(document).ready(function()
         $('body').append('<p class="draggable">Newly Created Paragraph</p>');
         $('p.draggable').draggable(); **//This is not working**
     );
</script>

但不知何故,这是有效的

    <script type="text/javascript">
     $(document).ready(function()
         $('body').append('<p class="draggable">Newly Created Paragraph</p>')
                 .find('p.draggable').draggable(); **This is working**

     );
</script>

【问题讨论】:

尝试在$('p.draggable').draggable(); 之前和之后设置警报,然后看看哪个最先发生。也不会是$('body') 【参考方案1】:

我知道这已经有一段时间了,但这个问题最近也困扰着我。正如其他人提到的,您必须在新创建的项目上重新运行.draggable(),但如果您在.draggable() 中定义了某些选项,这将不起作用。另外,将$().draggable() 放入一个函数中,然后在创建一个新元素后调用该函数(这个技巧确实适用于重置droppables - 看图)。

无论如何,长话短说 -> 将 $().draggable() 设置放入一个函数中,然后在创建新元素后调用该函数 DID WORK,但我不得不将它从 document ready 函数中取出.....之后我禁用了它,它起作用了。

您可以多次调用该函数,并且它会在每个创建的元素之后继续工作。看来如果它在document.ready 声明中,那么它是一枪交易..

希望对您有所帮助。

【讨论】:

【参考方案2】:

你需要在新创建的元素插入 DOM 后调用 draggable()。

原因是第一行代码只匹配现有元素。第一行中没有选择新创建的元素。

【讨论】:

感谢您的努力,但我也尝试过,我将其保存在 $(document).ready() 中,并尝试在文档末尾写 &lt;script&gt;&lt;/script&gt;。就在&lt;/body&gt; 标签之前,但它不起作用:( 我认为你做的不对。如何在 html/DOM 中插入新创建的段落?创建后,需要在该元素上调用 .draggable()。【参考方案3】:

其实draggable好像有问题。当您附加一些 htmlTag 然后尝试找到它并使其可拖动时,它无法识别它。尝试使用createElement 创建一个新元素,然后附加它。希望有效

var newEle = document.createElement('p');
$(newEle).attr("class","draggable").draggable();
$('body').append($(newEle));

var newEle = document.createElement('p');
$(newEle).attr("class","draggable");
$('body').append($(newEle));
$('p.draggable').draggable();

【讨论】:

感谢您的耐心和努力,但仍然没有运气的尝试:( 我认为$('p.draggable') 选择了所有具有类'draggable' 的'p' 元素,draggable() 一旦应用于一个元素就不会再次应用,而是先前应用的可拖动元素也被破坏了。在任何元素上尝试.draggable().draggable(),然后你就可以看到了。但是,如果您在追加自身之前应用 draggable 然后追加,它只会将 draggable() 应用到该元素并且也只应用一次。【参考方案4】:

我遇到了这个问题,但是在阅读了这个之后我可以解决它。所以你必须在构建新元素后再次调用 draggable() 方法,这是我的代码:

$(".in-browser").each(function()
        $(this).dblclick(function()
            var browseIn = $(this).data("href");
            var browserHTML = '<div class="browser draggable">\
        <ul class="browser-buttons">\
            <li>_   \
            <li>#   \
            <li>x   \
        </ul>\
        <div class="browser-win-container">\
        <div class="addressbar"></div>\
        <iframe class="opening-window" src="'+browseIn+'"></iframe>\
    </div>\
    </div>';
            $("body").append(browserHTML);
            $(".draggable").draggable(); //look at here
        );
    );

【讨论】:

【参考方案5】:

每次调用事件动作时都应该调用 draggable() 函数:

$('body').on('click', '.add-new-table', function () 
 $( ".canvas" ).prepend('<div class="ui-widget-content draggable"><p>Drag me</p></div>');
 $(function()
   $(".draggable" ).draggable(
     containment: "parent"  
   );
 );
);

【讨论】:

【参考方案6】:

您必须在新创建的对象的实例上应用可拖动对象, 重写代码:

<script type="text/javascript">
 $(document).ready(function()
    var newElement = '<p class="draggable">Newly Created Paragraph</p>';
    $('body').append(newElement);
    newElement.draggable(); **//This is working**
 );

它现在应该可以工作了。

【讨论】:

【参考方案7】:

新元素制作完成后,您可以使用 setTimeout 调用可拖动函数。

$('div').click(function()
 $('body').append('<div class="box"></div>');
 setTimeout(function() 
  $('div.box').draggable(
   drag: function( event, ui ) ,
   cursor:'-webkit-grabbing'
  );
 ,1000);
)

【讨论】:

为什么要使用setTimeout?其他更老的解决方案在没有它的情况下也可以工作【参考方案8】:
$(document).on("mouseenter", ".item", () => 
     $('.item').draggable(); ); 

它的工作,因为拖动事件触发 mouseenter

【讨论】:

您好,欢迎来到 Stack Overflow!请拨打tour。感谢您的回答,但您是否还可以添加有关您的代码如何解决问题的解释?查看help center 获取有关如何格式化代码的信息。

以上是关于可拖动的 jQuery UI 不适用于新创建的 DOM 元素的主要内容,如果未能解决你的问题,请参考以下文章

可拖动的 jQuery UI 不适用于动态创建的 div

Jquery UI 单击不适用于拖动的图像。当图像 > 1

jQuery ui 可拖动拖放到 iframe

可拖动的 Jquery 不适用于包含

jQuery.repeater 不适用于可排序的 jQuery Ui

jQuery Safari / Chrome与可拖动的包含属性不兼容