根据选择的单选值进行特定查询
Make a specific query based on the chosen radio value
我有这样的表格:
<form>
<input type="text" id="searchedWord" class="form-control form-control-lg" value="words here"/>
<button type="submit" id="findWord" class="btn btn-primary">Search</button>
<div>
<input type="radio" value="exact match" id="exact-match">
<label for="exact-match" class="checked" checked>Exact match</label>
<input type="radio" value="all matches" id="all-matches">
<label for="all-matches">All matches</label>
</div>
</form>
因为我不能在这个项目中使用 name=""
作为单选按钮,所以我制作了一个脚本来使用 class.
来切换它们
let radioBtns = document.querySelectorAll('input[type="radio"]');
function toggleCheck() {
radioBtns.forEach(function (radioBtn) {
radioBtn.classList.toggle('checked');
radioBtn.classList.contains('checked') ? radioBtn.checked = true : radioBtn.checked = false;
});
}
radioBtns.forEach(function (radioBtn){
radioBtn.addEventListener('click', toggleCheck, false);
});
let anyMatch = document.getElementById('all-matches').classList.contains('checked');
console.log(anyMatch);
let exactMatch = document.getElementById('exact-match').classList.contains('checked');
console.log(exactMatch);
根据所选的无线电,我必须进行不同的查询。
如果我选择 exact match
,输入的单词将包含引号 (queryWithQuotes
)。
如果我选择 all matches
,输入的单词不包含引号 (queryWithoutQuotes
)。
let pageUrl = window.location.protocol + "//" + window.location.host;
const searchTerm = document.getElementById("searchedWord").value.replace("'", "''");
if (exactMatch === true) {
let queryWithQuotes = pageUrl + "/_api/search/query?querytext='" + '"' + searchTerm + '"' + "'&selectproperties='Path%2cUrl'&sourceid='xxxxx'";
console.log(`queryWithQuotes variable is: ${queryWithQuotes }`);
$.ajax(
{
url: queryWithQuotes,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: success,
error: error
}
);
} else if (anyMatch === true) {
let queryWithoutQuotes = pageUrl + "/_api/search/query?querytext='" + searchTerm + "'&selectproperties='Path%2cUrl'&sourceid='xxxxx'";
console.log(`queryWithoutQuotes variable is: ${queryWithoutQuotes }`);
$.ajax(
{
url: queryWithoutQuotes,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: success,
error: error
}
);
} else {
console.log('There is an error');
}
由于某些原因,搜索只考虑了 exact match
。即使我切换到 All matches
,搜索也会继续 Exact match
。
这是什么原因?
我清理了代码,这在 jsfiddle 和 SO 代码片段中工作正常。我不知道你是否遗漏了重要的东西,但也许这会有助于更好地理解你的问题出在哪里。我已经评论了我所做的所有更改;随意忽略任何只是在这里发帖的结果。
let radioBtns = document.querySelectorAll('input[type="radio"]');
function toggleCheck() {
radioBtns.forEach(function (radioBtn) {
radioBtn.classList.toggle('checked');
radioBtn.checked = radioBtn.classList.contains('checked') ? true : false; // I fixed this ternary operator.
});
}
radioBtns.forEach(function (radioBtn){
radioBtn.addEventListener('click', toggleCheck, false);
});
function doSearch() {
// I suspect this is the key issue that you had. The checks for anyMatch and exactMatch need to be inside the function for them to update.
let anyMatch = document.getElementById('all-matches').classList.contains('checked');
let exactMatch = document.getElementById('exact-match').classList.contains('checked');
console.log('exact match:', exactMatch, '; any match:', anyMatch);
// ... do the actual code here where you check anyMatch and exactMatch
}
<input type="text" id="searchedWord" class="form-control form-control-lg" value="words here"/>
<button type="button" onclick="doSearch()" id="findWord" class="btn btn-primary">Search</button> <!-- I changed this button from submit to regular button since you're handling everything in javascript anyway -->
<div>
<input type="radio" value="exact match" id="exact-match" class="checked" checked> <!-- I gave one of the radio buttons a "checked" by default -->
<label for="exact-match" class="checked" checked>Exact match</label>
<input type="radio" value="all matches" id="all-matches">
<label for="all-matches">All matches</label>
</div>
我有这样的表格:
<form>
<input type="text" id="searchedWord" class="form-control form-control-lg" value="words here"/>
<button type="submit" id="findWord" class="btn btn-primary">Search</button>
<div>
<input type="radio" value="exact match" id="exact-match">
<label for="exact-match" class="checked" checked>Exact match</label>
<input type="radio" value="all matches" id="all-matches">
<label for="all-matches">All matches</label>
</div>
</form>
因为我不能在这个项目中使用 name=""
作为单选按钮,所以我制作了一个脚本来使用 class.
let radioBtns = document.querySelectorAll('input[type="radio"]');
function toggleCheck() {
radioBtns.forEach(function (radioBtn) {
radioBtn.classList.toggle('checked');
radioBtn.classList.contains('checked') ? radioBtn.checked = true : radioBtn.checked = false;
});
}
radioBtns.forEach(function (radioBtn){
radioBtn.addEventListener('click', toggleCheck, false);
});
let anyMatch = document.getElementById('all-matches').classList.contains('checked');
console.log(anyMatch);
let exactMatch = document.getElementById('exact-match').classList.contains('checked');
console.log(exactMatch);
根据所选的无线电,我必须进行不同的查询。
如果我选择 exact match
,输入的单词将包含引号 (queryWithQuotes
)。
如果我选择 all matches
,输入的单词不包含引号 (queryWithoutQuotes
)。
let pageUrl = window.location.protocol + "//" + window.location.host;
const searchTerm = document.getElementById("searchedWord").value.replace("'", "''");
if (exactMatch === true) {
let queryWithQuotes = pageUrl + "/_api/search/query?querytext='" + '"' + searchTerm + '"' + "'&selectproperties='Path%2cUrl'&sourceid='xxxxx'";
console.log(`queryWithQuotes variable is: ${queryWithQuotes }`);
$.ajax(
{
url: queryWithQuotes,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: success,
error: error
}
);
} else if (anyMatch === true) {
let queryWithoutQuotes = pageUrl + "/_api/search/query?querytext='" + searchTerm + "'&selectproperties='Path%2cUrl'&sourceid='xxxxx'";
console.log(`queryWithoutQuotes variable is: ${queryWithoutQuotes }`);
$.ajax(
{
url: queryWithoutQuotes,
method: "GET",
headers: { "Accept": "application/json; odata=verbose" },
success: success,
error: error
}
);
} else {
console.log('There is an error');
}
由于某些原因,搜索只考虑了 exact match
。即使我切换到 All matches
,搜索也会继续 Exact match
。
这是什么原因?
我清理了代码,这在 jsfiddle 和 SO 代码片段中工作正常。我不知道你是否遗漏了重要的东西,但也许这会有助于更好地理解你的问题出在哪里。我已经评论了我所做的所有更改;随意忽略任何只是在这里发帖的结果。
let radioBtns = document.querySelectorAll('input[type="radio"]');
function toggleCheck() {
radioBtns.forEach(function (radioBtn) {
radioBtn.classList.toggle('checked');
radioBtn.checked = radioBtn.classList.contains('checked') ? true : false; // I fixed this ternary operator.
});
}
radioBtns.forEach(function (radioBtn){
radioBtn.addEventListener('click', toggleCheck, false);
});
function doSearch() {
// I suspect this is the key issue that you had. The checks for anyMatch and exactMatch need to be inside the function for them to update.
let anyMatch = document.getElementById('all-matches').classList.contains('checked');
let exactMatch = document.getElementById('exact-match').classList.contains('checked');
console.log('exact match:', exactMatch, '; any match:', anyMatch);
// ... do the actual code here where you check anyMatch and exactMatch
}
<input type="text" id="searchedWord" class="form-control form-control-lg" value="words here"/>
<button type="button" onclick="doSearch()" id="findWord" class="btn btn-primary">Search</button> <!-- I changed this button from submit to regular button since you're handling everything in javascript anyway -->
<div>
<input type="radio" value="exact match" id="exact-match" class="checked" checked> <!-- I gave one of the radio buttons a "checked" by default -->
<label for="exact-match" class="checked" checked>Exact match</label>
<input type="radio" value="all matches" id="all-matches">
<label for="all-matches">All matches</label>
</div>