【问题标题】:Twitter Typeahead.js with Yahoo Finance in AJAX在 AJAX 中使用 Yahoo Finance 的 Twitter Typeahead.js
【发布时间】:2013-07-31 04:38:45
【问题描述】:

我正在尝试将Typeahead.js 的新版本与需要从 AJAX 中提取的 JSON 结合使用,而不是像他们在示例中那样从 JSON 文件中提取。我只是无法让它工作,我不想缓存 JSON 结果或任何东西,我想从 Yahoo 实时提取它。

我的 HTML 输入是 <input type="text" id="symbol" name="symbol" autofocus autocomplete="off" placeholder="Symbol" onkeyup="onSymbolChange(this.value)" />

我的 AJAX/PHP 文件有这个来检索数据(这部分工作,我用 Firebug 测试过)

header('Content-type:text/html; charset=UTF-8;');

$action = (isset($_GET['action'])) ? $_GET['action'] : null;
$symbol = (isset($_GET['symbol'])) ? $_GET['symbol'] : null;

switch($action) {
    case 'autocjson':
        getYahooSymbolAutoComplete($symbol);
        break;
}

function getYahooSymbolAutoCompleteJson($symbolChar) {
    $data = @file_get_contents("http://d.yimg.com/aq/autoc?callback=YAHOO.util.ScriptNodeDataSource.callbacks&query=$symbolChar");

    // parse yahoo data into a list of symbols
    $result = [];
    $json = json_decode(substr($data, strlen('YAHOO.util.ScriptNodeDataSource.callbacks('), -1));

    foreach ($json->ResultSet->Result as $stock) {
        $result[] = '('.$stock->symbol.') '.$stock->name;
    }

    echo json_encode(['symbols' => $result]);
}

JS 文件(这是我苦苦挣扎的地方)

function onSymbolChange(symbolChar) {
    $.ajax({
        url: 'yahoo_autocomplete_ajax.php',
        type: 'GET',
        dataType: 'json',
        data: {
            action: 'autocjson',
            symbol: symbolChar
        },
        success: function(response) {
            $('#symbol').typeahead({
                name: 'symbol',
                remote: response.symbols
            });
        }
    });
}

我不认为我应该在 AJAX 成功响应中附加一个预输入,但是我没有看到太多关于 AJAX 的示例(除了先前版本的预输入)...我看到了 JSON 响应输入字符后使用 Firebug,但输入反应不佳。任何指导都将不胜感激,我目前正在做一个概念证明......同样值得知道我正在使用 AJAX,因为我在 HTTPS 中,并且使用直接 http 到 Yahoo API 提供了各种帮助Chrome 和新 Firefox 的不安全页面问题。

更新

为了让它工作,感谢 Hieu Nguyen,我不得不将 AJAX JSON 响应从 echo json_encode(['symbols' => $result]); 修改为 echo json_encode($result);,并修改 JS 文件以使用此处建议的代码:

$('#symbol').typeahead({
    name: 'symbol',
    remote: 'yahoo_autocomplete_ajax.php?action=autocjson&symbol=%QUERY'
});

【问题讨论】:

    标签: bootstrap-typeahead typeahead.js


    【解决方案1】:

    我必须反过来做,即:在 typeahead remote 处理程序中挂钩 ajax 调用。你可以试试:

    $('#symbol').typeahead({
        name: 'symbol',
        remote: '/yahoo_autocomplete_ajax.php?action=autocjson&symbol=%QUERY'
    });
    

    您不必创建 onSymbolChange() 函数,因为 typeahead 已经处理好了。

    您还可以使用以下方法过滤和调试来自后端的响应:

    $('#symbol').typeahead({
        name: 'symbol',
        remote: {
            url: '/yahoo_autocomplete_ajax.php?action=autocjson&symbol=%QUERY',
            filter: function(resp) {
                var dataset = [];
                console.log(resp); // debug the response here
    
                // do some filtering if needed with the response          
    
                return dataset;
            }
        }
    });
    

    希望对你有帮助!

    【讨论】:

    • 感谢您的帮助,我按照您所说的方式完成了它,但它还没有完全工作,我总是将“未定义”作为唯一可能的选择显示,但我确实在 Firebug 中看到了 JSON 响应,我的 JSON 格式正确吗?
    • 谢谢它确实有帮助,我想知道您从哪里获得这些信息或能够使用 url 和过滤器等等?我想在最后使用他们的模板,但我还没有......顺便说一句,我返回了一个 JSON 符号数组:{"symbols":["(GOOG)...", "(GO..."]...} 但我必须传递一个数组格式,所以在报废 symbols 对象之后有效。谢谢
    • 我在 SO 上回答有关 typeahead.js 的问题已经有一段时间了,所以我可以记住这些细节。您可以在此处查看文档:github.com/twitter/typeahead.js#remote
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 2018-08-11
    相关资源
    最近更新 更多