使用 Typeahead 和 Bloodhound 时如何在请求正文中发送数据?
How to send data in request body when using Typeahead & Bloodhound?
我正在尝试实现一个 typeahead,其来源是一个 API,它需要一个带有数据主体的 GET 请求,而不是 url 编码数据。我在 'prepare' 对象中尝试了一些不同的东西,但无法将其设置为 url 编码参数。 typeahead 或通常的 jquery 是否有可能让它不这样做?我有一种感觉 jquery 可能只是不允许你这样做,因为它会被认为是 'bad practice',但更改 API 并不是一个真正的选择!
这是我的代码:
$(document).ready(function(){
var people = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'apiUrl',
prepare: function (query, settings) {
settings.type = "GET";
settings.contentType = "application/json";
settings.DataType = "json";
settings.processData = false;
settings.data = JSON.stringify({"search":"people","query":query});
return settings;
}
}
});
$('.typeahead').typeahead(null, {
source: people
});
})
我正在使用 jquery 1.11.3 & typeahead.js 0.11.1。
谢谢!
尝试使用 typeahead.js substringMatcher
函数、.on()
、input
事件
的最小修改版本
var substringMatcher = function(strs, q, cb) {
return (function(q, cb, name) {
var matches, substrRegex;
// an array that will be populated with substring matches
matches = [];
// regex used to determine if a string contains the substring `q`
substrRegex = new RegExp(q, 'i');
// iterate through the pool of strings and for any string that
// contains the substring `q`, add it to the `matches` array
$.each(strs, function(i, str) {
if (substrRegex.test(str)) {
// the typeahead jQuery plugin expects suggestions to a
// JavaScript object, refer to typeahead docs for more info
matches.push(name(str));
}
});
cb(matches);
}(q, cb, function(res) {
return res
}));
};
$("#typeahead").on("input", function(e) {
$.ajax({
url: "https://gist.githubusercontent.com/guest271314/"
+ "ffac94353ab16f42160e/raw/"
+ "aaee70a3e351f6c7bc00178eabb5970a02df87e9/states.json",
processData:false,
data: JSON.stringify({
"search": "people",
"query": e.target.value
})
})
.then(function(json) {
if (e.target.value.length) {
substringMatcher(JSON.parse(json), e.target.value, function(results) {
$("#results ul").empty();
$.map(results, function(value, index) {
$("#results ul")
.append($("<li />", {
"class": "results-" + index,
"html": value
}))
})
})
} else {
$("#results ul").empty();
}
}, function err(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
})
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<input type="text" id="typeahead" placeholder="search" />
<br />
<div id="results">
<ul>
</ul>
</div>
我正在尝试实现一个 typeahead,其来源是一个 API,它需要一个带有数据主体的 GET 请求,而不是 url 编码数据。我在 'prepare' 对象中尝试了一些不同的东西,但无法将其设置为 url 编码参数。 typeahead 或通常的 jquery 是否有可能让它不这样做?我有一种感觉 jquery 可能只是不允许你这样做,因为它会被认为是 'bad practice',但更改 API 并不是一个真正的选择! 这是我的代码:
$(document).ready(function(){
var people = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: 'apiUrl',
prepare: function (query, settings) {
settings.type = "GET";
settings.contentType = "application/json";
settings.DataType = "json";
settings.processData = false;
settings.data = JSON.stringify({"search":"people","query":query});
return settings;
}
}
});
$('.typeahead').typeahead(null, {
source: people
});
})
我正在使用 jquery 1.11.3 & typeahead.js 0.11.1。
谢谢!
尝试使用 typeahead.js substringMatcher
函数、.on()
、input
事件
var substringMatcher = function(strs, q, cb) {
return (function(q, cb, name) {
var matches, substrRegex;
// an array that will be populated with substring matches
matches = [];
// regex used to determine if a string contains the substring `q`
substrRegex = new RegExp(q, 'i');
// iterate through the pool of strings and for any string that
// contains the substring `q`, add it to the `matches` array
$.each(strs, function(i, str) {
if (substrRegex.test(str)) {
// the typeahead jQuery plugin expects suggestions to a
// JavaScript object, refer to typeahead docs for more info
matches.push(name(str));
}
});
cb(matches);
}(q, cb, function(res) {
return res
}));
};
$("#typeahead").on("input", function(e) {
$.ajax({
url: "https://gist.githubusercontent.com/guest271314/"
+ "ffac94353ab16f42160e/raw/"
+ "aaee70a3e351f6c7bc00178eabb5970a02df87e9/states.json",
processData:false,
data: JSON.stringify({
"search": "people",
"query": e.target.value
})
})
.then(function(json) {
if (e.target.value.length) {
substringMatcher(JSON.parse(json), e.target.value, function(results) {
$("#results ul").empty();
$.map(results, function(value, index) {
$("#results ul")
.append($("<li />", {
"class": "results-" + index,
"html": value
}))
})
})
} else {
$("#results ul").empty();
}
}, function err(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
})
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<input type="text" id="typeahead" placeholder="search" />
<br />
<div id="results">
<ul>
</ul>
</div>