【问题标题】:jQuery autocomplete initialized only for first dynamically inserted elementjQuery自动完成仅针对第一个动态插入的元素初始化
【发布时间】:2014-10-25 23:04:10
【问题描述】:

这是我们为动态插入的元素初始化自动完成(jQuery)的方式:

$(function() {
  setTimeout(function(){
    $("[id^='requisition_material_items_attributes_'][id$='_item_name_autocomplete']").each(function (){
       $(this).autocomplete({
        minLength: 1,
        source: $(this).data('autocomplete-source'),
        select: function(event, ui) {
            $(this).val(ui.item.value);
        }
      });
    });
  }, 5000);
});

这里setTimeout(5 秒延迟)允许对第一个动态插入的元素进行自动完成初始化。但是,初始化不适用于第二个插入的元素,并且自动完成不适用于第二个元素。如何修复上面的 JS 代码以使其适用于第二个元素及其他元素?

更新

jQuery autocomplete for dynamically created inputs(所谓的重复案例)提供的解决方案在这里不起作用,因为它是针对不同的问题。在重复的情况下,通过在使用 JavaScript 生成新元素时添加自动完成的初始化来解决问题。在我们的例子中,新元素是由 Rails 生成的,并且在生成时不能使用自动完成初始化代码插入其中。在我们的例子中,自动完成适用于第一个插入的元素,而不适用于第二个元素。我们的问题是对第二个元素进行自动完成初始化。

更新

item_name_autocomplete 的 Rails 视图:

<%= f.input :item_name_autocomplete, :label => t("Item Name"), :input_html => { data: {autocomplete_source: SUBURI + base_materialx.autocomplete_parts_path}},:placeholder => t("Enter Part Name Keyword"), :required => true  %>

【问题讨论】:

  • 我们应该为新插入的元素绑定自动完成
  • 请提供更多上下文。如何使用 Rails 生成元素?你在使用 AJAX 吗?你能提供一个重现问题的非工作演示吗?
  • @user938363 能否请您提供示例代码链接。
  • @@chanchal,我们没有在线代码。 html源代码会有帮助吗?

标签: javascript jquery ruby-on-rails-3 autocomplete


【解决方案1】:

setTimeout 在指定的延迟后调用该函数,它没有设置间隔,您可以使用setInterval 函数,但在这种情况下这是一个糟糕的主意。您应该在生成目标元素时选择它们,然后在这些特定元素上调用该方法。没有可靠/好的方法来处理这个问题。

【讨论】:

  • 新元素的id在插入之前是未知的。
  • @user938363 如何生成元素?
  • 该元素是由 Rails (3.2) 生成和插入的,而不是由 jquery 完成的。我们正处于初始化新插入元素的自动完成的步骤。
  • 这是在 Rails 视图中为元素添加自动完成的代码: t("Item Name"), :input_html => { data: { autocomplete_source: SUBURI + base_materialx.autocomplete_parts_path}},:placeholder => t("Enter Part Name Keyword"), :required => true %>
  • @user938363 好吧,在这种情况下,没有动态生成的元素(client-side-wise)。准备好的文件就够了。只需向元素添加一个通用类名,然后 $('.aClassName').autocomplete( ... )
【解决方案2】:

您的脚本需要从 setTimeout 更改提取函数回调

我用下面的例子说明了你的情况,可能有助于得到一个想法

function registerAutoComplete(elements) {
    return elements.each(function () {
        $(this).autocomplete({
            minLength: 1,
            source: $(this).data('autocomplete-source'),
            select: function (event, ui) {
                $(this).val(ui.item.value);
            }
        });
    });
}

//if you create new autocomplete element with some function 
function createAutocompleteElement() {
    var $control = $('<input />').data('autocomplete-source', [
        "Add the Data Source object here", "Value 1", "Source Value 2", "Source Value 3"]);

    return registerAutoComplete($control);
}

$(function () {
    //this below function sufficient to register autocomplete with specified selector
    registerAutoComplete($("[id^='requisition_material_items_attributes_'][id$='_item_name_autocomplete']"));

    /*// below setTimeout delay call back not required as it runs after dom ready.
    setTimeout(function () {
        registerAutoComplete($("[id^='requisition_material_items_attributes_'][id$='_item_name_autocomplete']"));
    }, 5000);
    */
});

【讨论】:

  • 在 Rails (3.2) 中生成和插入 html 代码(带有自动完成数据源)。该视图是通过 Rails 局部视图 (.html.erb) 渲染插入的。我想我们可以跳过函数 createautocompleteElement()。我们正处于为新插入的元素初始化自动完成的步骤。
  • 您可以通过将&lt;script&gt;$(function () {registerAutoComplete('your--element--selector')});&lt;/script&gt; 放在局部视图的末尾来运行registerAutoComplete,以便它将自动完成注册到指定的选择器匹配元素。
  • 有什么例子可以看看吗?我们以前没有在 Rails 局部视图中使用脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多