Создание закладки JQuery (т.е. для слайдера контента) - PullRequest
2 голосов
/ 03 августа 2010

Я сделал свой собственный скрипт со вкладками, и он прекрасно работает. Единственное, чего не хватает, так это возможности отмечать разные разделы.

Я знаю, что URL нужно как-то переписать. В настоящее время я использую warnDefault, чтобы остановить обновление страницы, это также останавливает изменение URL-адреса.

Я также пытался переписать URL-адрес вручную, но ничего не происходит, так как я предполагаю, что для обнаружения введенного URL-адреса требуется некоторая форма хуков.

Заранее спасибо, Генри.

РЕДАКТИРОВАТЬ: Javascript: http://pastebin.com/1yhzxkUi HTML: http://pastebin.com/WH1CbRZJ

Ответы [ 4 ]

2 голосов
/ 03 августа 2010

Для хранения истории страницы, самый популярный и полнофункциональный / поддерживаемый способ - использование хэш-чангов.Это означает, что, скажем, вы переходите от yoursite/page.html#page1 к yoursite/page.html#page2, вы можете отслеживать это изменение, и поскольку мы используем хэши, оно может быть выбрано по закладкам и кнопкам назад и вперед.

Вы можете найти отличноеспособ привязки к изменениям хеша с помощью проекта jQuery History http://www.balupton.com/projects/jquery-history

Для него также имеется полнофункциональное расширение AJAX, позволяющее вам легко интегрировать запросы Ajax в ваши состояния / хеши, чтобы превратить ваш сайт в полноценныйЛучшее приложение Web 2.0: http://www.balupton.com/projects/jquery-ajaxy

Они оба предоставляют отличную документацию на своих демонстрационных страницах, чтобы объяснить, что происходит и что происходит.

Вот пример использования JQuery History (каквзято с демонстрационного сайта):

// Bind a handler for ALL hash/state changes
$.History.bind(function(state){
    // Update the current element to indicate which state we are now on
    $current.text('Our current state is: ['+state+']');
    // Update the page"s title with our current state on the end
    document.title = document_title + ' | ' + state;
});

// Bind a handler for state: apricots
$.History.bind('/apricots',function(state){
    // Update Menu
    updateMenu(state);
    // Show apricots tab, hide the other tabs
    $tabs.hide();
    $apricots.stop(true,true).fadeIn(200);
});

И пример jQuery Ajaxy (взятый с демонстрационного сайта):

        'page': {
            selector: '.ajaxy-page',
            matches: /^\/pages\/?/,
            request: function(){
                // Log what is happening
                window.console.debug('$.Ajaxy.configure.Controllers.page.request', [this,arguments]);
                // Adjust Menu
                $menu.children('.active').removeClass('active');
                // Hide Content
                $content.stop(true,true).fadeOut(400);
                // Return true
                return true;
            },
            response: function(){
                // Prepare
                var Ajaxy = $.Ajaxy; var data = this.State.Response.data; var state = this.state;
                // Log what is happening
                window.console.debug('$.Ajaxy.configure.Controllers.page.response', [this,arguments], data, state);
                // Adjust Menu
                $menu.children(':has(a[href*="'+state+'"])').addClass('active').siblings('.active').removeClass('active');
                // Show Content
                var Action = this;
                $content.html(data.content).fadeIn(400,function(){
                    Action.documentReady($content);
                });
                // Return true
                return true;

А если вы когда-нибудь захотите получить параметры строки запроса(так что yoursite/page.html#page1?a.b=1&a.c=2) вы можете просто использовать:

$.History.bind(function(state){
    var params = state.queryStringToJSON(); // would give you back {a:{b:1,c:2}}
}

Так что ознакомьтесь с этими демонстрационными ссылками, чтобы увидеть их в действии и узнать все подробности установки и использования.


Изменить: После просмотра вашего кода, это все, что вам нужно сделать, чтобы использовать его с JQuery History.

Изменить:

$('.tabbed_content .tabs li a').live('click',
    function (e){
        e.preventDefault();
        switchTab($(this));
    });

На:

// Bind a handler for ALL hash/state changes
$.History.bind(function(state){
    switchTab(state);
});

Или, если вы планируете использовать jQuery History и для других областей, мы хотели бы убедиться, что мы вызываем switchTab только для наших вкладок, а не для всех хэшей:

// Bind a handler for ALL hash/state changes
$.History.bind(function(state){
    if ( $('.tabbed_content > .content > li[id='+state+']').length ) switchTab(state);
});

Мы больше не используем событие onclickвместо этого мы привязываемся к jQuery History, так как он обнаружит хэш-обмен.Это самая важная концепция для понимания, так как, например, если мы добавляем сайт в закладки, а затем возвращаемся к нему, мы никогда не нажимаем на него.Таким образом, вместо этого мы меняем наши клики, чтобы привязать к хэш-обмену.Как и когда мы щелкаем по нему, отмечаем его, назад или вперед, хэш-обмен всегда срабатывает: -)

2 голосов
/ 03 августа 2010

Если вы говорите об изменении URL в соответствии с операциями AJAX на странице, то сейчас я делаю аналогичную вещь.

Посмотрите на http://www.asual.com/jquery/address/

Это плагин для jQuery, который полезен для поддержания работы кнопок навигации по адресу при смене вкладок и т. Д. (Или вы можете просто изменить URL-адрес, не затрагивая историю).когда URL изменяется внешне (т.е. кто-то вставляет адрес) или внутренне.Затем вы можете выбрать значения из параметров и соответственно обновить.

Простой пример использования:

// Sets the tabId
$.address.parameter("tabId", tabId);

// Sets up the event to catch the URL parameter
$.address.externalChange(function(event) {
    var tabId = $.address.parameter("tabId");

    if(tabId){
        $("#tab" + tabId).show();
    }
});
0 голосов
/ 03 августа 2010

Использование хеш-ссылок позволяет создавать закладки / общие ссылки для запуска кода JavaScript вместо перезагрузки страницы. Ben Almans jQuery hashchange event позволяет привязать обработчик событий к событию hashchange, этот плагин работает со старыми браузерами, которые обычно не поддерживают это. Обработчик события, связанный с hashchange, может прочитать хэш-часть URL-адреса и вызвать любую функцию.

// register event handler
function bindHashchange() {

    $(window).bind('hashchange', function(event) {
        event.preventDefault();
        var label = location.hash.substring(1);
        handleLabel(label);
    });

    // trigger event so handler will be run when page is opened first time
    // otherwise handler will only run when clicking on hash links
    $(window).trigger('hashchange');
}

// read and handle hash part of url
function handleLabel(label) {

    if ( label.length > 0 ) {
        // using label from url
        switchPage(label);
    } else {
        // use the default label, if no hash link was present
        switchPage('start');
    }
}

// in this case, load hidden <div>'s into a <div id="content">
function switchPage(label) {
    if ( label == 'start ) {
        $('div#content').html($('div#start'));
    } else if ( label == 'some_other_page' ) {
        // do something else
    }
}

Этот другой обработчик событий может обрабатывать 2 аргумента, разделенных точкой ('.') В том же URL.

function processHash() {

    var str = location.hash.substring(1);
    var pos = $.inArray('.', str);

    var label = '';
    var arg = '';

    if ( pos > -1 ) {
        label = str.substring(0, pos);
    } else {
        label = str.substring(0);
    }

    if ( pos > 1 ) {
        arg = str.substring(pos+1);
    }

    if ( label.length == 0 ) {
        // the default page to open of label is empty
        loadContent('start');
    } else {
        // load page, and pass an argument
        loadContent(label, arg);
    }
}

Если используются регулярные выражения, можно проанализировать любую комбинацию символов.

var registry = {};

// split on character '.'
var args = label.split(/\./g);

for ( i in args ) {
    var arg = args[i];

    // split on character '='
    var temp = arg.split('=');
    var name = temp[0];
    var value = temp[1];

    // store argument in registry
    registry[name] = value;
}
// registry is loaded, ready to run application that depends on arguments

Это преобразует URL:

MySite / # company.page = items.color = красный

В следующий объект JavaScript:

Object {company = undefined, page = "items", color = "red"}

Тогда нужно лишь запустить функции jQuery show () или hide () для выбранных вами элементов.

Это может быть преобразовано в не-jQuery JavaScript, но тогда вы потеряете функциональность, которую предоставляет Бен Алман, что крайне важно для портативного решения.

0 голосов
/ 03 августа 2010

Вы всегда можете проверить этот плагин: jQuery BBQ (кнопка «Назад» и запрос), чтобы добавить #hash для закладки, как это делает Facebook.

...