jQuery Bootstrap - 在从输入中删除事件后更新typeahead

Dav*_*lie 3 jquery typeahead twitter-bootstrap jquery-events

我有一个现有的事件重页,我试图添加先行支持.预先输出功能可以根据需要运行,除了它似乎只能一次附加到输入项目.

问题是,为简单起见,在某些操作之后,现有页面会删除附加到特定输入的所有事件 $('input').off(),然后根据新上下文重新附加新事件处理程序.

这导致了一个问题,即重新连接的先行功能似乎永远不会触发.(这里讨论了一个类似但不同的问题:使用post响应更新Bootstrap的typeahead数据源时遇到麻烦但是这里没有相关性,因为我可以更新源代码 - 我只是不能让类型提前触发无论如何我尝试了什么)

编辑:为了澄清 - 更改源(如在链接的问题中)不是问题 - 实际页面上的源是一个向服务器发出请求的js函数.问题是调用.off()似乎永久地破坏了类型,并且我不能删除调用.off()而不必重写大部分页面....下面的代码和jsfiddle只是我可以设计的最短代码来演示问题

这里有一个工作jsfiddle记录问题:http: //jsfiddle.net/hz5P3/8/

供将来参考,完整代码如下.简要说明:input.workstext_field只有一个先行声明,工作正常.该input.no_works有一个称为预输入功能,则已经$('.no_works').off()呼吁取消对这个输入的所有事件.此功能的重新连接类型无法完成.

有没有办法按预期第二次调用预先输入工作?

谢谢

HTML

<div class="container">
    <div class="hero-unit">
        <h1>Bootstrap jsFiddle Skeleton</h1>
        
         <p>this is a test typeahead that will work</p>         
        <input type="text" class="works" style="margin: 0 auto;">
        
        <p>this is a test typeahead that is updated and will not work</p>
        <input type="text" class="no_works" style="margin: 0 auto;">
    </div>
</diV>?
Run Code Online (Sandbox Code Playgroud)

使用Javascript

$('.no_works').typeahead({
  source: ["cat", "dog", "mouse"]
});
$('.no_works').off();

$('.no_works').typeahead({
  source: ["cat", "dog", "mouse"]
});

$('.works').typeahead({
  source: ["cat", "dog", "mouse"]
});
Run Code Online (Sandbox Code Playgroud)

lah*_*her 7

编辑:好的,我现在明白了.

因此,您需要从该元素的jQuery对象中清除'typeahead'数据.它可能不是100%正确的方法,但它很容易,它的工作原理:

http://jsfiddle.net/feXM3/

$('.no_works').typeahead({
  source: ["cat", "dog", "mouse"]
});

$('.no_works').off();

//amir75 added a line here:
$('.no_works').data('typeahead', (data = null))

$('.no_works').typeahead({
  source: ["frog", "cow", "horse"]
});
Run Code Online (Sandbox Code Playgroud)

我的原始答案: 我不认为'off'方法正在按照您的预期删除旧的预先输出功能.

你可以这样做:

//1. store the typeahead object in a variable
var tah= $('.no_works').typeahead({
  source: ["cat", "dog", "mouse"]
});

//2. update the data source
tah.data('typeahead').source = ["frog", "cow", "horse"];
Run Code Online (Sandbox Code Playgroud)

更新了jsfiddle:http://jsfiddle.net/Skp5R/