Я пытаюсь отлаживать скрипт на сайте WordPress, что позволяет динамически фильтровать списки заданий (через Jobvite.) Когда страница изначально загружается без какого-либо URL-адреса прикрепленные параметры - например site.com/jobs/all-positions
- фильтры работают нормально; однако, когда страница загружена/перезагружена с прилагаемыми параметрами - например. site.com/jobs/all-positions#country=united-states&city=minneapolis
, фильтры не работают на всех, и я вижу следующее сообщение об ошибке JQuery в консоли:Настройка состояния страницы из хеша URL-адреса - синтаксическая ошибка (jQuery)
Синтаксис ошибка, непризнанное выражение:
#country%3Dunited-states%26city%3Dminneapolis
Кажется, что компоненты URI не являются правильно закодированы, и мне интересно, если есть ошибка я не вижу в сценарии плагин, который обрабатывает фильтрации, которые я в том числе ниже (?):
// Update Filter hash
function updateFilterHash() {
var filterHash = '#';
if (selectedCountryFilters.length !== 0) {
filterHash += "country=" + selectedCountryFilters.join(",") + "&";
}
if (selectedCityFilters.length !== 0) {
filterHash += "city=" + selectedCityFilters.join(",") + "&";
}
if (selectedCategoryFilters.length !== 0) {
filterHash += "category=" + selectedCategoryFilters.join(",") + "&";
}
console.log(filterHash);
$.History.go(filterHash);
}
// Set page state from URL hash
if (location.hash.length !== 0) {
// Set Req detail view
if (location.hash.indexOf("#req-") !== -1) {
var reqId = encodeURIComponent(location.hash.slice(1));
$(".all-requisitions").hide();
$(".all-open-positions-title").hide();
$(".breadcrumbs").append("<span> > " + $("[data-id='" + reqId + "'] h1").text() + "</span>");
$(".requisition-detail[data-id='" + reqId + "']").fadeIn();
}
// Set Filters
if (location.hash.indexOf("&") !== -1) {
var hashParts = encodeURIComponent(location.hash.slice(1)).split("%26");
// Activate Filters
for (var i = 0; i < hashParts.length; i++) {
if (hashParts[i] !== "") {
var hashPairs = hashParts[i].split("%3D");
hashName = hashPairs[0],
hashValues = hashPairs[1].split("%2C");
for (var j = 0; j < hashValues.length; j++) {
$("a[href='#" + hashName + "-" + hashValues[j] + "']").addClass("selected");
// Update appropriate Filter arrays and perform other Filter-specific actions
switch (hashName) {
case "country":
selectedCountryFilters.push(hashValues[j]);
// If Filter is a Country, reveal the Cities too
updateCityFilters();
break;
case "city":
selectedCityFilters.push(hashValues[j]);
// If Filter is a city, activate the Country too
var hashCountry = $("a[href='#" + hashName + "-" + hashValues[j] + "']").data("country");
$("a[href='#country-" + hashCountry + "']").addClass("selected");
selectedCountryFilters.push(hashCountry);
break;
case "category":
selectedCategoryFilters.push(hashValues[j]);
break;
default:
break;
}
}
}
}
updateReqs();
updateCategoryHeadings();
}
}
Это только часть сценария которые обрабатывают s хэш-компоненты URI, и я думаю, что проблема должна лежать где-то здесь. Что действительно расстраивает, так это то, что страница/сценарий отлично работает на тестовом сервере (и, следовательно, на другой установке WordPress), но не на промежуточном сервере. Тем не менее, обе имеют одинаковые версии WP и загружают одни и те же версии jQuery. Есть ли идеи относительно того, почему сценарий не будет правильно анализировать компоненты URI?
ошибки сообщают вам, где их бросают. Где в этом коде генерируется эта ошибка? я подозреваю, что это связано с переходом в селектора jQuery. Почему вы используете 'encodeURIComponent()' для обработки того, что исходит от URL-адреса? помогло бы, если бы вы уменьшили это до минимального представления проблемы – charlietfl
спасибо за ответ @charlietfl - консольная ошибка просто перечисляет 'jquery.js? ver = 1.12.4: 2', таким образом, не сам скрипт плагина. Я сам на самом деле не писал этот скрипт, поэтому я не уверен, почему был использован 'encodeURIComponent()'. Должен ли я попытаться удалить эту функцию из переменных 'reqId' и' hashParts'? – nickpish
хорошо, мне нечего кодировать, а нужно декодировать, если вы передаете это в селектора. Альтернативой может быть использование jQuery 'filter()' вместо использования селекторов. – charlietfl