如何从URL中的哈希中获取搜索查询

时间:2011-12-03 08:48:40

标签: javascript jquery regex url

我正在添加搜索功能,如果用户在搜索结果上并刷新页面,我希望它保留在该搜索中。我已经将搜索查询放入URL中,但我不知道如何检索它。它很可能需要正则表达式,所以任何有regexp经验的人都请帮忙。

screenshot w/ description

以下是我将其放入网址的方式:

function trimspace(str) {
    str = str.replace(/ +(?= )/g, '');
    return str;
}
function searchMail() {
    var query = trimspace($('#search_input').val());
    if (query == '' || !query || query == null) {
        $('#search_input').focus();
    }
    else {
        window.location.hash = '#!/search/' + query;
        $('#loader').show();
        $.get('tools.php?type=search', { q: query }, function(data, textStatus) {
            $('#loader').hide();
            if (textStatus == 'success') {
                hideAllTabs();
                $('#search_results').html(data).show();
                document.title = "Search results - WeeBuild Mail";
            }
            else {
                alertBox('Search failed. Please try again in a few minutes.', 2500);
            }
        });
    }
}

除了检索查询之外,我还需要能够检测哈希值是否为#!/search/query

提前致谢!

3 个答案:

答案 0 :(得分:3)

检测查询是否为#!/search/query

location.hash==='#!/search/query'

假设查询为#!/search/query

,查找有关查询部分的信息
var parts = location.hash.split('/');

parts[0]#!parts[1]searchparts[2]test。如果想要你想要的零件,那么现在就应该做得很轻松了。

回应评论:

function getPartAndRemainder(){
    var parts = location.hash.split('/');
    if(parts[0]!=='#!' || parts.length<2){
        // Value after # does not follow the expected pattern #!/part/any_parameters
        throw new Error('Cannot parse application part.');
    }
    return {
        // Contains the part of your application (word after first slash after #)
        part: parts[1],
        // Contains everything after second slash after # or the empty string
        remainder: location.hash.substring(
            // Length of #! (or whatever somebody might use instead)
            parts[0].length
            // Length of first slash
            +1
            // Length of your application part's name
            +parts[1].length
            // Length of the second slash
            +1)
    };
}

该函数在键part处返回一个包含应用程序部分的对象,remainder键将包含其余部分。因此,如果您的URI为something#!/search/test,则该函数将返回{part:'search', remainder:'test'}。 如果无法解析URI,您将收到错误,然后您应该使用合理的默认值。

每当哈希值发生变化时,或者在您对哈希值感兴趣的某个其他事件(时间点),您将使用以下方法:

try {
    var hashValue = getPartAndRemainder();
    if(hashValue.part==='search'){
        var query = hashValue.remainder;
        alert('You searched: '+query)
    }
    if(hashValue.part==='inbox'){
        alert('You are in inbox, now');
    }
} catch(e){
    // It was not possible to parse the value after the # from URI according to our expected pattern.
    alert('No idea what to do with: '+location.hash);
}

答案 1 :(得分:1)

此正则表达式将匹配搜索参数之后的任何内容,这是您要查找的内容吗?

/#1/search/(.*)/

答案 2 :(得分:0)

var match = /\/.*\/.*\/(.*)\//i.exec(location.hash)
//match contain the query