2015-05-22 2 views
0

Я работаю над сценарием, где вы передаете ему URL-адрес, например /search?filter1=question-1&filter2=question2, и когда вопрос-1 или вопрос-2 будет изменен, он получит URL-адрес и заменит значение question-x значением вопроса.Как удалить некоторые элементы строки запроса?

Одна вещь, которую я хочу построить, - это если пустое значение, я хочу, чтобы он удалял часть строки запроса. Так, например, если вопрос-1 имеет значение something, но 2 еще не имеет значения, то URL будет /search?filter1=something.

То, что я думал, что будет работать было бы что-то вроде этого

$url.match('/([^?&]*)' + name.toSearch + '/g') // toSearch is a value like question-1 

Но это возвращает нуль. Может ли кто-нибудь помочь мне разобраться, что мне нужно изменить, чтобы получить результат, который мне нужен?

+0

Вы можете взорвать строку запроса, найти переменные, которые вы ожидаете найти, а затем собрать его с теми переменными, с тем, чтобы оставить от пустые Parameters – Drakes

ответ

1

Учитывая URL-адрес/фильтр? = Вопрос-1, мне нужно увидеть, имеет ли элемент с именем вопрос [1] значение, если оно это делает, замените вопрос-1 на значение, а если у него его нет, удалите полную строку фильтра = вопрос-1.

Зная ваши требования лучше от комментариев, я полностью переписал свой ответ, используя части моего первоначального ответа, и некоторые из вашего кода:

// Given url 
var url = '/search?filter1=question-1&filter2=question-2'; 

// Specify the filters so no extra query string noise enters the final url 
var filters = ["filter1", "filter2", "filter3"]; 

// Split the query string parts 
var urlParts = url.split(/([&?])/); 
var reassembled = []; 

// Break the url parts into key:value pairs 
var qs = (function(a) { 
    if (a === "") return {}; 
    var b = {}; 
    for (var i = 0; i < a.length; ++i) 
    { 
    var p=a[i].split('=', 2); 
    if (p.length == 1) 
     b[p[0]] = ""; 
    else 
     b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " ")); 
    } 
    return b; 
})(urlParts); 

// This include a param:value in the reassembled array 
function includeQSParam(param, value) { 
    if(qs[param]) { 
    reassembled.push(param + "=" + value); 
    } 
} 

// Run through the filters 
for(var ind in filters) { 
    var filter = filters[ind]; 

    // Check that the filter exists and the supplied value is of type question- 
    if(qs[filter] && qs[filter].indexOf("question-") >= 0) { 
    // Turns question-number into question[number] so it's a valid selector. 
    var inputSelector = "question["+(qs[filter]).replace(/\D/g, "")+"]"; 

    // Get the input, and the value (author-supplied code) 
    var $input = $('[name="' + inputSelector + '"]'); 

    // TODO: confirm this is how you get the value 
    var value = $input.closest('.question').val(); 

    if($input.length > 0 && (value !== '' && value !== undefined)) { 

     // Replace the parameter's original value with the question value 
     includeQSParam(filter, value); 
    } else { 
     // Nothing to do. This filter will be removed automatically 
    } 
    } 
} 

// Reassemble the URL 
var fixedUrl = urlParts[0] + (reassembled.length > 0 ? "?"+reassembled.join("&") : ""); 

Опять же, это был переработан от моего первоначального ответа, так что будет быть раздутым, но я не хотел оставлять на вас вопрос.

+0

Спасибо за то, что было 99% пути там. Я немного изменил его, чтобы соответствовать моему использованию, но он должен быть лучше, чем у меня. Вот что я закончил. http://jsfiddle.net/tomharto/a7grj61k/ –

+0

@TomHart Ах, очень приятно. Похоже, он хорошо работает с вашим поставляемым HTML. Рад, что смог помочь. – Drakes

0

В то время как ответ Drakes является хорошим, это не совсем соответствовало моим потребностям. Я закончил с этим, что хорошо работает до сих пор, но я все еще проверяю его.

var $url = '/search?filter1=question-1&filter2=question-2'; 

// Break the url into parts. 
var $split = $url.split(/([&?])/); 

$.each($split, function(indexToRemove, part){ 

    // If the part is a question. 
    if(typeof part == 'string' && part.indexOf('question-') > -1){ 

     var $number = part.split('='); 

     // Turns question-number into question[number] so it's a valid selector. 
     $inputSelector = String($number[1]).replace('-', '[') + ']'; 

     // Get the input, and the value. 
     var $input = $('[name="' + $inputSelector + '"]'); 
     var $value = getValue($input.closest('.question')); 



     // If there is an element, and there is a value. 
     if($input.length > 0 && ($value != '' && $value != undefined)){ 

      $split[indexToRemove] = part.replace($number[1], $value); 
     } else { 

      $split.splice(indexToRemove, 1); 
     } 
    } 
}); 


$url = $split.join(''); 

// If for example question-1 has a value of 'Test', and question-2 has no value, $url will now be '/search?filter1=Test'. 
+0

Пожалуйста, не стесняйтесь уточнять свои требования. Я прилагаю усилия к этому ответу, поэтому я могу настроить его для вас. – Drakes

+0

Хорошо, в основном, учитывая url '/ search? Filter = question-1', мне нужно увидеть, имеет ли элемент с именем' question [1] 'значение, если он это делает, замените' question-1' на значение, а если оно отсутствует, удалите общую строку 'filter = question-1'. –

+0

Я полностью переписал свой ответ, используя части моего первоначального ответа и некоторые из вашего кода, чтобы закончить мой ответ. Он работает в моих тестах. Я не хотел оставлять на вас вопрос. – Drakes

Смежные вопросы