【问题标题】:Multiple jQuery plugin instances in ajax-loaded htmlajax 加载的 html 中的多个 jQuery 插件实例
【发布时间】:2014-08-12 13:45:18
【问题描述】:

我在 ajax 加载的 html 中使用多个 Blueimp File Upload 插件:

$('.edit').click(function(){
    $( "#details" ).show();
    $('#details div').html(ajax_spinner).load(script.php, "parameters");
});

因此,当您单击 class="edit" 时,会显示一个新的 div id="details"(但它在 document.ready 时 在 DOM 中)并且 script.php 返回一个表单 ID ="upload"(它从不在“查看源代码”中可见,尽管它在页面中..?

处理 document.ready 之后添加的 html 的规则/良好做法是什么?

所以现在这个“虚拟 DOM”中有一个新元素:

<form id="upload" method="post" action="other_script.php" enctype="multipart/form-data">

  <div id="drop">
    DROP HERE <small>Image .png or .jpg</small>
    <a class="btn mr_button">Browse</a>
    <input type="file" name="upl" />
  </div>
  <ul id="mr_uploaded_files_ul">
    <!-- The global progress bar -->
    <div id="progress" class="progress">
      <div class="progress-bar progress-bar-success"></div>
    </div>
    <!-- The file uploads will be shown here -->
  </ul>
</form>

当我尝试对 DOM 的这个“不可见”部分采取行动时:

$('#drop a').click(function(){
    alert('Nope. Nothing');
});

只有当我

$(document).on('click', '#drop a', function() {
    alert('Ah, this works');
});

但我需要的不仅仅是警报。整个$('#upload').fileupload({ ... }) 回调套件没有被执行,可能是因为这个DOM“存在”问题。顺便说一句,我在其他页面中使用这个实现,在普通的现有 DOM 上,它可以工作。

我如何处理那些新生成的 DOM 元素?

【问题讨论】:

    标签: javascript jquery ajax blueimp


    【解决方案1】:

    为您的load 调用添加一个回调函数,然后初始化您的表单。

    $('#details div').html(ajax_spinner).load(script.php, "parameters", function() {
        $('#upload').fileupload({ ... });
    });
    

    当您使用 jQuery 选择器时,例如 $('#upload'),这些元素必须已经存在。上传表单在加载之前不存在,因此选择器在加载完成之前返回空。

    警报起作用的原因

    $(document).on('click', '#drop a', function() {
        alert('Ah, this works');
    });
    

    是由于事件委托。在这里阅读更多:http://learn.jquery.com/events/event-delegation/

    【讨论】:

    • 嗨,狂怒。我试过了,在 add: 回调之后无法让它返回任何东西......它很可能是插件本身......为什么我什至在 FireBug 控制台中都看不到任何东西?请注意,当我从回调中调用插件时,源代码没有任何变化......
    • 您能否详细说明“返回”的含义?这是一个异步操作,因此它不会向外部代码返回任何内容。该插件也可能被破坏--
    • 好吧,如果我放一个 console_log('something');在 fileupload({ ... }) 函数的 add: 回调中,如果表单未加载 ajax,我会看到它。并且将此函数放在 html 加载回调中不会改变这一点。我非常希望它会。
    • 我猜,因为只有事件委托有效,我现在的问题是“我怎样才能委托整个 $('#upload').fileupload({ ... }); 函数?”跨度>
    • 不能,只能捕获委托事件。如果插件正常运行,您必须在加载新的 dom 元素之后初始化上传插件。如果你能提供一个完整的例子,我可以稍后再看,帮助解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多