【问题标题】:Accessing data attributes of element with Twitter Typeahead.js使用 Twitter Typeahead.js 访问元素的数据属性
【发布时间】:2024-01-23 02:19:01
【问题描述】:

我使用 Rails 生成表单。我想使用 Twitter Typeahead 自动完成具有模型关联的字段。

以下 CoffeeScript 代码:

console.log $('.typeahead').data('source')

工作并返回:

["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]

我可以从预先输入功能中访问相同的数据吗?以下代码:

$('.typeahead').typeahead(
    name: 'test'
    local: $(this).data('source')
    console.log $(this).data('source'))

不起作用并返回undefined

【问题讨论】:

    标签: jquery ruby-on-rails-4 coffeescript twitter-typeahead


    【解决方案1】:

    最简单的方法是保存对 jQuery 对象的引用并使用它来代替 this

    $input = $ '.typeahead'
    $input.typeahead
        name: 'test'
        local: $input.data 'source'
    

    问题在于$(this).data('source') 在传递给.typeahead() 之前 被评估。此时,this 仍设置为全局范围,没有附加任何数据。

    另一个选项,即使您有多个 .typeahead 元素也有效,它是手动调用 .each() 而不是依靠 .typeahead() 来迭代选定的元素本身:

    $('.typeahead').each ->
        $(this).typeahead
            name: 'test'
            local: $(this).data 'source'
    

    之所以有效,是因为传递给.each() 的函数“在当前DOM 元素的上下文中触发,因此关键字this 指代该元素”(参见docs)。

    【讨论】:

    • 我相信这不会在我的页面中使用多个 .typeahead 类。现在我使用一种解决方法,并为我想要自动完成的每个字段复制具有唯一 id 元素的 js 代码。我必须为整个站点执行此操作,这并不优雅,但现在可以使用。
    • 我添加了一个替代方案,其中有多个 .typeahead 元素。
    • 太棒了。正是我想做的。你摇滚!
    最近更新 更多