нет прокрутки с помощью хэштега / закладки - PullRequest
0 голосов
/ 24 марта 2012

Я сделал простой скрипт jquery для сортировки содержимого страницы по щелчку классов ... в этом примере все продукты, окна или macintosh. Сценарий работает так же, как я хочу, чтобы ИСКЛЮЧИТЬ, так как я использую знак # в окне прокрутки окна ... есть ли в любом случае, чтобы остановить окно прокрутки и оставаться именно там, где он находится, когда пользователь нажимает на одну из ссылок?

Кроме того, я довольно быстро собрал сценарий - если кто-то хочет предложить некоторую оптимизацию, пожалуйста, продолжайте ...

Базовый HTML:

<a class="all" href="#">All Products</a>
<a class="win" href="#">Windows</a>
<a class="mac" href="#">Macintosh</a>

<div class="windows">1 win</div>
<div class="macintosh">2 mac</div>
<div class="windows">3 win</div>
<div class="windows">4 win</div>
<div class="windows">5 win</div>
<div class="macintosh">6 mac</div>
<div class="windows">7 win</div>

скрипт:

var $zproducthide = jQuery.noConflict();
$zproducthide(document).ready(function() {

$current = 'all';

$zproducthide(".all").click(function () {
if ($current != 'all'){
       $zproducthide(".windows").hide();
       $zproducthide(".macintosh").hide();
       $zproducthide(".windows").fadeIn(1500);
       $zproducthide(".macintosh").fadeIn(1500);
       $current = 'all';
}
});

$zproducthide(".win").click(function () {
if ($current != 'windows'){
       $zproducthide(".windows").hide();
       $zproducthide(".macintosh").hide();
       $zproducthide(".windows").fadeIn(1500);
       $current = 'windows';
}
});

$zproducthide(".mac").click(function () {
if ($current != 'macintosh'){
       $zproducthide(".windows").hide();
       $zproducthide(".macintosh").hide();
       $zproducthide(".macintosh").fadeIn(1500);
       $current = 'macintosh';
}
});
});

Ответы [ 4 ]

1 голос
/ 18 октября 2012

Попробуйте использовать javascript:void(0) в качестве href:

<a href="javascript:void(0)"></a>
1 голос
/ 02 апреля 2012

Чтобы ответить на ваш вопрос: Когда событие запускается (нажмите на ссылку), вам нужно предотвратить поведение по умолчанию и продолжить как обычно. Означает, что вам нужно обработать событие в каждой функции и вызвать event.preventDefault (). Таким образом, хештег не будет добавлен.

Одна из ваших функций будет выглядеть так:

$zproducthide(".all").click(function (event) {
    event.preventDefault();    // no hashtag please

    if ($current != 'all'){
       $zproducthide(".windows").hide();
       $zproducthide(".macintosh").hide();
       $zproducthide(".windows").fadeIn(1500);
       $zproducthide(".macintosh").fadeIn(1500);
       $current = 'all';
    }
});

кроме этого, вот несколько предложений:

1: поскольку вы используете JS для отображения / скрытия элементов, вы можете избавиться от a-тегов и использовать все, что вам нравится, и добавить к нему триггер, например, Кнопки

  <button class="all" href="#">All Products</button>
  <button class="windows" href="#">Windows</button>
  <button class="macintosh" href="#">Macintosh</button>

2: добавьте больше метаинформации, которая поможет вам позже (например, все 7 предметов - это какой-то товар, верно?)

<div class="prod windows">1 win</div>
<div class="prod macintosh">2 mac</div>

3: объедините триггер для всех трех кнопок и используйте новый класс

$("button").click(function(event) {
    event.preventDefault();

    prod = $(this).attr('class');
    if(prod!="all") {
        // mac,win
        $(".prod")
            .hide()                 // hide all elements
            .filter("."+prod)       // filter win/mac
                .fadeIn(1500);      // show those

    } else {
        // all
        $(".prod")
            .hide()
            .fadeIn(1500);
    }
});
0 голосов
/ 24 марта 2012

Как дела?

Новый ответ (включая оптимизацию):

//Start with the default class
$current = 'all';

//Setup an object which is configured as { class : 'jQuery selectors' }
//This is neat because you can add more items and only modify this array like this:
//arr = {'lin': '.linux', 'win' : '.windows', 'mac' : '.macintosh' };
arr = {'win' : '.windows', 'mac' : '.macintosh' };

//Get all the object properties in order to make it dynamic (so you don't have to add new classes manually, only in our "arr" object
var sel = '';
$.each(arr,function(k,v){ sel += ',.' + k; });
//at this point aSelector equals to ",.win,.mac";

//create the .all selector
arr.all = sel;

//Equals to $('.all,.win,.mac'
$('.all' + sel,function(){

  $current = $(this).attr('class');

  $(arr['all']).hide(); //Hide all elements
  $(arr[$current]).fadeIn(1500); //Show only the current one (in case it's 'all', all elements will be shown)

  //Prevent default behaviour!
  return false;
});

Оригинальный ответ:

Способ предотвратить это - вернуть false в событии click, таким образом поведение по умолчанию не будет выполнено! Итак:

//Select all the anchors with the desired classes
$("a.all,a.win,a.mac").click(function(){ return false; });

Я считаю, что это должно работать!

Ура! * * 1013

0 голосов
/ 24 марта 2012

Если вы используете теги типа

<a class="all" href="#">All Products</a>
<a class="win" href="#">Windows</a>
<a class="mac" href="#">Macintosh</a>

, это заставляет браузер обновляться, присваивает элементам значение div, а если вам нужен внешний вид href, установите css на

cursor: pointer;
...