HashTag не работает, чтобы показать Div, когда URL имеет? Source= Добавлено

Я запускаю FancyBox2 с входящими HashTags. Все работает... пока вы не добавите исходный код в URL. Как я могу заставить это работать? Ниже приведен код. Я предполагаю, что мне нужно сказать хэш = все до а? если? существовать.

Jquery:

var thisHash = window.location.hash;
if(window.location.hash) {
$(thisHash).fancybox().trigger('click');
}

Ссылки, которые должны работать:

www.mysite.com/test/#test - это работает

www.mysite.com/test/#test?source=blahblahblah - это не

www.mysite.com/test/?source=blahblahblah#test - это работает, лол

2 ответа

Быстрый ответ: хэш-теги / именованные якоря / идентификаторы фрагментов (как бы вы их ни называли) должны идти после строки запроса, чтобы быть правильно проанализированными (по крайней мере, так, как вы ожидаете, что они будут). Таким образом, вы должны построить свои URL соответственно.

Следующий вопрос на superuser.com содержит полный ответ на ваш вопрос (хотя ваш вопрос немного отличается, ответ тот же):

Тэг привязки стоит перед строкой запроса или после?

Хотя http://www.example.com/test/#test?source=blahblahblah является действительным URL, то, что будет рассматриваться как строка хеш-тега, является целым test?source=blahblahblah часть (без определения строки запроса). Кроме того, если вам нужно включить # символ в части пути, документа или строки запроса URL, который должен быть обозначен как %23,

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

РЕДАКТИРОВАТЬ - Бонус

Если вы ищете простой способ добавить строку запроса в существующий URL в PHP, попробуйте url_add_query_params() из следующего кода:

 function build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $inner_call = 0) {
    // Source: http://php.net/manual/en/function.http-build-query.php#112024
    if (!is_array($query_data)) return false;
    $result = array();
    foreach ((array)$query_data as $key => $value) {
        if ($inner_call) {
            if (is_numeric($key))
                $key = $numeric_prefix . "[]";
            else
                $key = $numeric_prefix . "[$key]";
        } else {
           if (is_int($key))
                $key = $numeric_prefix . $key;
        }

        if (is_array($value) || is_object($value)) {
            $result[] = build_query($value, $key, $arg_separator, 1);
                continue;
        }
        $result[] = urlencode($key) . "=" . urlencode($value);
    }
    return implode($arg_separator, $result);
}

function unparse_url($parsed_url) {
      // Source: http://php.net/manual/en/function.parse-url.php#106731
      $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
      $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
      $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
      $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
      $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
      $pass     = ($user || $pass) ? "$pass@" : '';
      $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
      $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
      $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
      return "$scheme$user$pass$host$port$path$query$fragment";
}

function url_add_query_params($url, $new_params) {
    // parse url
    $url_components = parse_url($url);
    // return immediately if parsing failed
    if ($url_components === FALSE) { return $url; }
    // if $new_params is a query string, parse it
    if (!is_array($new_params)) {
        $new_params_str = $new_params;
        $new_params = array();
        parse_str($new_params_str, $new_params);
    }
    // parse query string from original url
    $params_str = isset($url_components['query']) ? $url_components['query'] : '';
    $params = array();
    parse_str($params_str, $params);
    // merge the two arrays, keeping later values for identical keys
    $params = array_merge($params, $new_params);
    // rebuild query string
    $url_components['query'] = build_query($params);
    // rebuild url
    return unparse_url($url_components);
}

Пример:

$url = 'http://www.example.com/test/#test';
$new_url = url_add_query_params($url, 'source=blahblahblah');
echo $new_url; // output: http://www.example.com/test/?source=blahblahblah#test
echo "\n";

$url = 'http://www.example.com/test/?source=index&param=value#test';
$new_url = url_add_query_params($url, 'source=blahblahblah');
echo $new_url; // output: http://www.example.com/test/?source=blahblahblah&param=value#test

Я только слегка проверил это, но оно должно работать как задумано.

Причина этого www.mysite.com/test/#test?source=blahblahblah ссылка не работает, потому что переменная:

var thisHash = window.location.hash

... вернусь #test?source=blahblahblah,

Тогда вы пытаетесь связать thisHash (#test?source=blahblahblah) к фантазии

$(thisHash).fancybox().trigger('click');

... который является недействительным селектором.

Вам может понадобиться написать функцию, которая проверяет window.location.hash и извлекает правильный селектор для привязки к fancybox, например:

var _param;
function getSelector(thisHash) {
    if (thisHash.indexOf("?")) {
        _param = thisHash.split("?");
        return _param[0];
    } else {
        return thisHash;
    };
};

Проверьте эти ссылки jsfiddle:

Затем вы можете привязать fancybox к соответствующему селектору и добавить конечный параметр "?source=" на лету вроде:

var thisHash = window.location.hash;
jQuery(document).ready(function ($) {
    if (window.location.hash) {
        var selector = getSelector(thisHash);
        $(selector).fancybox({
            beforeLoad: function () {
                this.href = this.href + (typeof _param == "undefined" ? "" : "?" + _param[1])
            }
        }).trigger('click');
    }
}); // ready
Другие вопросы по тегам