可以合并多个输入,每个输入都使用不同来源的 typeahead.js 吗?

2023-12-19

我有一个包含大量文本输入的表单,我想将其中 10 个文本输入与 Bloodhound 一起使用 typeahead.js。我让它适用于其中的两个 - 它们都包括预取和远程数据源。但是 typeahead/Bloodhound 的每个实例都有相当数量的 jQuery 代码,我很好奇是否有人尝试过“泛化”typeahead/Bloodhound 来处理多个不同的输入元素,每个元素都有不同的数据源?这可能比它的价值更麻烦,但我有点担心页面必须加载的代码量。

我的环境是 Spring/MVC、Hibernate (Oracle db)、Bootstrap。

下面是一个 typeahead/Bloodhound 实例的示例。它位于一个函数中,因为我要动态添加输入行,因此我必须在添加新行后调用此函数,以启用该行中文本输入的预输入功能。

function initIngredientsTA() {
    //set the options
    var ingredBH = new Bloodhound({
        limit: 20,
        datumTokenizer: function(datum) {
            return Bloodhound.tokenizers.whitespace(datum.name);
        },
        queryTokenizer: Bloodhound.tokenizers.whitespace,       
        prefetch: {
            url: '/myapp/resources/ingredients.json',
            cache: false,
            filter: function(data) {
                console.log("data: " + data.ingredients);
                return $.map(data.ingredients, function (ingredient) {
                    return {
                        id : ingredient.id,
                        name : ingredient.name
                    };
                });
            } 
        },
        remote: {
            url: '/myapp/recipe/addRecipe/getIngredients?searchStr=%QUERY',
            cache: false,
            wildcard: '%QUERY',
            filter: function(data) {
                console.log("data: " + data);
                return $.map(data, function (data) {
                    return {
                        id : data.id,
                        name : data.name
                    };
                });
            } 
        }
    });

    //initialize the suggestion Engine
    ingredBH.initialize();

    $('.ingredDesc').typeahead(
    {
        hint: true,
        highlight: true,
        minLength: 1
    },
    {
        name: 'ingredients',
        displayKey: 'name',
        limit: 20,
        source: ingredBH.ttAdapter(),
    })
};

EDIT:我想我真正要问的是是否有人创建了 typeahead/Bootstrap 的“模板”版本,然后可以为每个单独的文本输入实例化它。


抱歉,如果这是一个有明显答案的问题,但我是 Java、Spring/Hibernate、jQuery 等堆栈的新手。使用 Firebug,我能够弄清楚 typeahead 和 Bloodhound 都需要什么,并得出以下结论:

//token and filter functions
function ingredDatumToken(datum) {
    return Bloodhound.tokenizers.whitespace(datum.name);
}

function ingredPrefetchFilter(data) {
    return $.map(data.ingredients, function (ingredient) {
        return {
            id : ingredient.id,
            name : ingredient.name
        };
    });
};

function ingredRemoteFilter(data) {
    return $.map(data, function (data) {
        return {
            id : data.id,
            name : data.name
        };
    });
};

//Bloodhound initialization
function initBloodhound(limit, cache, datumToken, queryToken,prefetchUrl,prefetchFilter, remoteUrl, wildcard, remoteFilter)
{
    var token = Bloodhound.tokenizers.whitespace; 

    var options = {};
    var prefetchOptions = {};
    var remoteOptions = {};

    prefetchOptions['url'] = prefetchUrl;
    prefetchOptions['cache'] = cache;
    prefetchOptions['filter'] = prefetchFilter;

    remoteOptions['url'] = remoteUrl;
    remoteOptions['cache'] = cache;
    remoteOptions['wildcard'] = wildcard; 
    remoteOptions['filter'] = remoteFilter;       

    options['limit'] = limit; 
    options['datumTokenizer'] = datumToken === null ? token : datumToken;
    options['queryTokenizer'] = queryToken === null ? token : queryToken;

    if (prefetchUrl != null)
        options['prefetch'] = prefetchOptions;

    if (remoteUrl != null)
        options['remote'] = remoteOptions;

    return new Bloodhound(options);
};

//create two Bloodhound engines
var ingredBH = initBloodhound(50,false,ingredDatumToken,null,'/myapp/resources/ingredients.json',ingredPrefetchFilter,'/myapp/recipeaddRecipe/getIngredients?searchStr=%QUERY','%QUERY',ingredRemoteFilter);
var measureBH = initBloodhound(20,false,null,null,'/myapp/resources/measures.json',null,null,null,null);
//add more Bloodhound engines here

//typeahead options
function initTypeaheadOptions(hint, highlight, minLength) {

    var options = {};

    options['hint'] = hint;
    options['highlight'] = highlight;
    options['minLength'] = minLength;

    return options;
}

//typeahead dataset
function initTypeaheadDataset(name, displayKey, limit, source) {

    var datasets = {};

    datasets['name'] = name;
    datasets['displayKey'] = displayKey;
    datasets['limit'] = limit;
    datasets['source'] = source;

    return datasets;
}

//initialize a typeahead control    
function initIngredientsTA() {

    var options = initTypeaheadOptions(true,true,1);
    var dataset = initTypeaheadDataset('ingredients', 'name', 20, ingredBH);

    $('.ingredDesc').typeahead(options,dataset);
};

//initialize a typeahead control
function initMeasuresTA() {

    var options = initTypeaheadOptions(true,true,1);
    var dataset = initTypeaheadDataset('measures', null, 20, measureBH);

    $('.ingredQtyType').typeahead(options,datasets);
};

//add more typeahead initialization functions here

//call the initialize functions
initIngredientsTA();
initMeasuresTA();
//call more initialize functions here

我仍在努力使其更加通用,并且我并不热衷于调用 Bloodhound 初始化函数中的所有参数,但由于我将在页面上拥有大约 10 个或更多启用预输入的控件,因此这将是相当不错的。只需几行代码即可轻松添加其余部分。那些不属于页面上动态创建的行的预输入控件不需要单独的初始化函数,但只需 3 行代码即可初始化。我绝对愿意接受任何改进意见或建议,包括任何认为这是一个愚蠢想法的想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可以合并多个输入,每个输入都使用不同来源的 typeahead.js 吗? 的相关文章

  • jQuery JSONP ajax,未设置身份验证标头

    我正在尝试使用以下设置向 google 联系人 API 发出 ajax 请求 ajax url https www opensocial googleusercontent com api people me all dataType js
  • qTip2 jquery 与 asp.net 文本框

    我怎样才能实现jquery插件qTip2http craigsworks com projects qtip2 http craigsworks com projects qtip2 与 asp net 文本框 鼠标悬停时的优雅工具提示
  • 将 jQuery 与 Selenium WebDriver 结合使用 - 如何将 JSON 对象转换为 WebElement?

    我正在使用 Selenium WebDriver 我想执行 jQuery 代码来查找一些元素 我的代码如下 public function uploadGrantDoc script return itemlist grant file u
  • IE提示打开或保存服务器的json结果

    兼容模式下的Internet Explorer通过ajax回调方法从服务器获取数据 如果我想保存数据或打开数据 会弹出一个对话框 如何摆脱它 客户说 ajax type POST data UIdlgHolder gt form seria
  • 使用 jQuery 从 ASP.Net JSON 服务获取数据

    我正在尝试调用 Google 地图地理编码 API 从纬度 经度对中获取格式化的地址 然后将其记录到控制台 我正在尝试获取为给定位置返回的第一个 formatted address 项目 我很简单无法从 JSON 中提取该项目 我不知道为什
  • 有序 JSON 对象

    我有一个 servlet 它与数据库通信 然后返回有序 按时间排序 对象的列表 在servlet部分 我有 access DB returns a list of User objects ordered ArrayList users M
  • jQuery appendTo(), json 在 IE 6,7,8 中不起作用

    我这两天绞尽脑汁想找到解决办法 我使用 jQuery ajax 从数据库中获取值 以便在另一个框发生更改时更新一个框 php 脚本从数据库中获取值 然后输出 json 它在 FF 中工作正常 但在所有版本的 IE 中 选择框都不会更新 我已
  • 如何将 .attr("id") 存储在变量中

    你们以前非常有帮助 我已经在 stackoverflow 上搜索了一段时间 但找不到答案 希望这是一个简单的问题 我试图将当前悬停的 div 的 id 存储在变量中 然后 我想使用该变量来切换具有相同 id 的图像 您可以看到 我尝试将变量
  • jQuery 的简单日历网格

    我发现的大多数可爱的日历组件对于我的简单要求来说都太复杂了 我需要显示月份网格 并指示是否已预订个别日期 我不需要每天处理多个活动 等等 我想我可以调整其中一个以始终将预订扩展为全天活动 读者对此有何建议 我的目标是显示住宿加早餐预订的日期
  • Ajax 长轮询无法正常工作

    我正在 MVC 2 中使用长轮询开发一个简单的陌生人聊天应用程序 如果我在不同的浏览器中打开应用程序 它在我的开发机器上工作正常 我的意思是 如果我在 IE 和 mozilla 中加载应用程序 它工作正常 如果我在浏览器的两个选项卡 例如
  • 建议文本字段,如 - 谷歌建议 - 使用 AJAX/Jquery

    当我在文本字段中输入字母时 如果它在数据库中有匹配项 它应该显示所有匹配的单词 当我在 Travelfrom 文本字段中输入一些文本 例如 A 时 我应该获取以 A 开头的所有记录 当我输入 Travelfrom 文本字段 时 它会自动完成
  • 在使用 jQuery 拖动时向元素添加 CSS 类

    是否可以在元素被拖动到特定区域时向其添加 CSS 类 并在元素被删除后替换该类 我并不是到处寻找这个功能 而是只在特定区域寻找这个功能 是的 这当然有可能 jQuery UI 提供了一些方便的选项和事件来执行此操作 对于初学者来说 可拖动元
  • javascript函数知道它的名字吗

    我有一个名为 getItem 的函数 我想使用其中的代码读取该函数的名称 这可能吗 function getItem var functionName how do I read the function name alert functi
  • 从对象获取数据 - 我看到数据但无法保存它们

    正如你所看到的 我是新来的 我确实尝试过搜索 但没有找到解决我问题的方法 所以这是我的问题 如果我这样做 console log grid data kendoGrid data 这在控制台中显示如下 所以我明白这一点 有一个数组和一个带有
  • jquery 事件委托

    我正在尝试使用事件委托重写一段代码 希望它能停止与另一个 js 代码段发生冲突 但我已经破解了密码 原来的 to scale up on hover var current h null var current w null piccon
  • 加载 angularjs 路由后运行 javascript 代码

    我需要在 angularjs 加载路线后显示警报 显示警报的代码位于 angularjs 异步加载的视图中 视图加载后 我希望它能够运行 但它没有 我知道我可以广播并告诉它稍后运行等 但我需要一个更通用的解决方案 假设您正在谈论基于以下内容
  • jquery 表单使用 .on() 提交

    我正在尝试发送由 jquery 创建的表单 该表单附加到一个 div 中 下面的变量 data 是使用 php 创建的 我将只发布最重要的 js 代码 我尝试了很多带有和不带 on 的方法 但我未能让警报框显示 1 以便我知道代码块实际上已
  • 数据表导出按钮问题 - 按钮不显示

    我试图在屏幕中央和数据表下方显示一个导出按钮 该按钮根本不显示 我已经下载了数据表文件 它们托管在我的服务器上 因此是本地引用
  • 自动更改 Twitter Bootstrap 选项卡

    我希望 Twitter Bootstrap 选项卡按时间顺序更改 我使用它们有点像旋转木马 我希望选项卡每 10 秒切换到下一个选项卡 这是一个例子 http library buffalo edu http library buffalo
  • 处理延迟对象数组

    自从使用 Deferred我已经遇到过这种情况几次 我有一个值列表 每个值都以某种方式生成一个延迟对象 并且我想在所有延迟对象都解析后执行回调 一个更具体的例子是这样的 var urls foo com bar com baz com qu

随机推荐