Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Разварачивание строк в таблице на jQyery (https://javascript.ru/forum/jquery/9079-razvarachivanie-strok-v-tablice-na-jqyery.html)

Suharik 28.04.2010 10:03

Разварачивание строк в таблице на jQyery
 
Всем привет. Нашел один скриптик котрый разварачивает строки в таблице и снова сварачивает при клике.
<script src="jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript">  
        $(document).ready(function(){
            $("#report tr:odd").addClass("odd");
            $("#report tr:not(.odd)").hide();
            $("#report tr:first-child").show();
            
            $("#report tr.odd").click(function(){
                $(this).next("tr").toggle();
                $(this).find(".arrow").toggleClass("up");
            });
            //$("#report").jExpand();
        });
    </script>

Я его немного переделать для того чтобы строки раздвигались при наведении мыши:
<script type="text/javascript">  
        $(document).ready(function(){
            $("#report tr:odd").addClass("odd");
            $("#report tr:not(.odd)").hide();
            $("#report tr:first-child").show();
            
            $("#report tr.odd").mouseover(function(){
                $(this).next("tr").toggle();
			
                $(this).find(".arrownext").toggleClass("up");
            });
			$("#report tr.odd").mouseout(function(){
                $(this).next("tr").toggle();
                $(this).find(".arrownext").toggleClass("up");
            });
            //$("#report").jExpand();
        });
    </script>

Но только работает это не так как хочется. При наведении на строку она все таки раздвигается, но если навести на тот див который развернулся, то все сварачивается и назварачивается див другой строки. Как можно поступить? Вот ссылка на сам скрипт http://ruseller.com/lessons.php?rub=32&id=346 а вот ссылка на то как у меня получилось http://locmankvartir.ru/search_obj (естестввенно смотреть в таблице)

Suharik 28.04.2010 10:30

Да. Сама задача вот в чем))) Нужно чтобы при наведении на открывающийся див, он не сварачивался.

Suharik 28.04.2010 18:47

Как я понял подсказать никто не может. Может тогда кто знает как сделать аккордион без дивов в таблице
<script type="text/javascript">
			$(function(){

				// Accordion
				$("#accordion").accordion({ header: "a" });
				
		
				
			});
		</script>

<div id="accordion">
			<div>
				<a href="#">First</a>
				<div>Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.</div>
			</div>
			<div>
				<a href="#">Second</a>
				<div>Phasellus mattis tincidunt nibh.</div>
			</div>
			<div>
				<a href="#">Third</a>
				<div>Nam dui erat, auctor a, dignissim quis.</div>
			</div>
		</div>



Как вместо дивов сделать все это в table tr td

e1f 28.04.2010 19:16

http://mediaformations.com/accordion...s-with-jquery/

Suharik 29.04.2010 09:43

это не пойдет. С таким же успехом я мог бы просто зацикленной таблицы присвоить уникальный ID и просто обычним кодом открывать и закрывать. примерно так.
openDiv = function (id) {
    document.getElementById(id).style.display = 'block';
};

closeDiv = function (id) {
    document.getElementById(id).style.display = 'none';
};

И дальше онкликом или онмаусом открывать и закрывать.
Мне хочется чтобы был реальный аккордион чтобы красиво открывал див))

e1f 29.04.2010 10:24

Цитата:

Сообщение от Suharik (Сообщение 53326)
Я его немного переделать для того чтобы строки раздвигались при наведении мыши:
<script type="text/javascript">  
        $(document).ready(function(){
            $("#report tr:odd").addClass("odd");
            $("#report tr:not(.odd)").hide();
            $("#report tr:first-child").show();
            
            $("#report tr.odd").mouseover(function(){
                $(this).next("tr").toggle();
			
                $(this).find(".arrownext").toggleClass("up");
            });
			$("#report tr.odd").mouseout(function(){
                $(this).next("tr").toggle();
                $(this).find(".arrownext").toggleClass("up");
            });
            //$("#report").jExpand();
        });
    </script>

А если вместо mouseover/out использовать mouseenter/mouseleave?

Цитата:

Сообщение от Suharik (Сообщение 53326)
а вот ссылка на то как у меня получилось http://locmankvartir.ru/search_obj (естестввенно смотреть в таблице)

Что-то там в таблице квартир нет никакого фолдинга, или я не туда смотрел?

Suharik 29.04.2010 10:28

да я убрал пока. Сейчас попробую и отпишу

Suharik 29.04.2010 10:40

Не помогло к сожалению. Код пока не убераю. Посмотрите.

e1f 29.04.2010 11:21

$('#report tr.odd').bind('mouseenter mouseleave', function(e) {
    var self = $(this),
        next = self.next();

    if (next[0] === $(e.relatedTarget).closest('tr')[0]) {
        return;
    }

    next.toggle();
    self.find('.arrownext').toggleClass('up');
});

$('#report tr:not(.odd)').bind('mouseenter mouseleave', function(e) {
    var self = $(this),
        prev = self.prev();

    if (prev[0] === $(e.relatedTarget).closest('tr')[0]) {
        return;
    }
    
    self.toggle();
    prev.find('.arrownext').toggleClass('up');
});


P.S. У Вас какая-то трабла с раскраской таблицы. Она сто старта вся серая, а потом по наведению "зебреет" потихоньку.

Suharik 29.04.2010 11:31

Да, там просто еще один скриптик конфликтует)) про это я вкурсе))

Suharik 29.04.2010 11:40

Короче они стали просто открыты, и никаких действий не происходит.

e1f 29.04.2010 11:58

О юный падаван!
$("#report tr:odd").addClass("odd"); 
            $("#report tr:not(.odd)").hide(); 
            $("#report tr:first-child").show();

Зачем убрал ты код этот важный? И обертку $(document).ready ты тоже снес, из недомыслия али по умыслу злому?

e1f 29.04.2010 12:01

$(function(){
    $("#report tr:first-child").show();

    $('#report tr:odd').addClass('odd').bind('mouseenter mouseleave', function(e) { 
        var self = $(this), 
            next = self.next(); 
      
        if (next[0] === $(e.relatedTarget).closest('tr')[0]) { 
            return; 
        } 
      
        next.toggle(); 
        self.find('.arrownext').toggleClass('up'); 
    }).show(); 
      
    $('#report tr:not(.odd)').bind('mouseenter mouseleave', function(e) { 
        var self = $(this), 
            prev = self.prev(); 
      
        if (prev[0] === $(e.relatedTarget).closest('tr')[0]) { 
            return; 
        } 
          
        self.toggle(); 
        prev.find('.arrownext').toggleClass('up'); 
    }).hide();
});


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

Suharik 29.04.2010 12:17

О Великий Мастер e1f. Ты поставил меня на путь истенный и дал мне необходимые знания чтобы все заработало. Так и есть. ВСЕ ЗАРАБОТАЛО. СПАСИБО !!!!

Suharik 29.04.2010 14:21

Блин Как же все круто, только что же скрипт при наведении поднимает страницу на верх? ))

e1f 29.04.2010 14:39

Что куда поднимает? Suharik, пробуем, фиксим, не получается -- показываем, что именно, демонстрируем баг-кит. Тогда можно расчитывать на помощь коллективного разума форума.

Или идем в раздел "Работа".

Suharik 29.04.2010 14:47

Да, Вы правы. Я разабрался почему так. Если вдруг возникнет вопрос, буду готовится его задать))

Suharik 29.04.2010 16:09

Уважаемый E1f А почему же тепрь у меня первый тр скрывается? Как я понимаю за первый тр отвечает это $("#report tr:first-child").show(); но ве равно не получается сделать так чтобы он всегда был show() уже перепробовал все.

e1f 29.04.2010 16:39

Вместо
$("#report tr:first-child").show();

и
$('#report tr:not(.odd)') //...

сделайте
$('#report tr:not(.odd, :first-child)')

Тепер first-child show не нужен. Все просто, правда?
А теперь у Вас при наведении на строку таблицы выдается еррор
Код:

a is undefined
[Break on this error] function Mg(a,b){var c=[];if(a=a.__e_)...]);else mc(a,function(d,f){Ge(c,f)});


Suharik 29.04.2010 16:54

Ваш статус "Профессор" действительно подверждает Ваши знания. Я сейчас хожу на курсы JS в бауманский универститет, думаю скоро сам буду помогать новичкам. Спасибо Вам огромное. Действительно все работает. Надеюсь Вы не откажете в помощи в дальнейшем. Еще раз спасибо.

Suharik 30.04.2010 16:16

А что мне сделать чтобы вторая ТР была изначально открыта, а при наведени на другую строку она закрывалась, и новая открывалась?

e1f 30.04.2010 16:19

$('tr:eq(1)').triggerHandler('mouseenter')


Подходит?

UPD Почти подходит, но нужно разнести отдельно бинды для mouseenter/mouseleave и заменить toggle на show?hide непосредственно

Suharik 30.04.2010 16:43

Ну почти получилось, Не понял как разнести бинды

Nekromancer 30.04.2010 17:03

$(...).bind('mouseenter', function(){
$(...).show();
}).bind('mouseleave', function(){
$(...).hide();
});


примерно так, селекторы и всё остальное сами подставите.

e1f 30.04.2010 17:07

$('#report tr.odd').bind('mouseenter mouseleave', function(e) {
    var self = $(this),
        next = self.next();

    if (next[0] === $(e.relatedTarget).closest('tr')[0]) {
        return;
    }

    if (e.type == 'mouseenter') {
        next.show();
    } else {
        $('#report tr:not(.odd, :first-child)').hide();
    }

    self.find('.arrownext').toggleClass('up');
}).eq(0).triggerHandler('mouseenter');

$('#report tr:not(.odd, :first-child)').bind('mouseleave', function(e) {
    var self = $(this),
        prev = self.prev();

    if (prev[0] === $(e.relatedTarget).closest('tr')[0]) {
        return;
    }

    self.hide();
    prev.find('.arrownext').toggleClass('up');
});

Suharik 30.04.2010 17:22

почти заработало)) только изначально все трки открываются сразу, а потом при наведении закрываются ))

e1f 30.04.2010 17:26

Suharik, всмысле? Тот код, что в посте выше, так себя ведет?

Suharik 30.04.2010 17:36

01 $('#report tr.odd').bind('mouseenter mouseleave', function(e) {
02 var self = $(this),
03 next = self.next();
04
05 if (next[0] === $(e.relatedTarget).closest('tr')[0]) {
06 return;
07 }
08
09 if (e.type == 'mouseenter') {
10 next.show();
11 } else {
12 $('#report tr:not(.odd, :first-child)').hide();
13 }
14
15 self.find('.arrownext').toggleClass('up');
16 }).eq(0).triggerHandler('mouseenter');
17
18 $('#report tr:not(.odd, :first-child)').bind('mouseleave', function(e) {
19 var self = $(this),
20 prev = self.prev();
21
22 if (prev[0] === $(e.relatedTarget).closest('tr')[0]) {
23 return;
24 }
25
26 self.hide();
27 prev.find('.arrownext').toggleClass('up');
28 });

Этот код ведет себя так (http://www.locmankvartir.ru/search_obj)

e1f 30.04.2010 17:44

Цитата:

Сообщение от e1f (Сообщение 53527)
О юный падаван!
$("#report tr:odd").addClass("odd"); 
            $("#report tr:not(.odd)").hide(); 
            $("#report tr:first-child").show();

Зачем убрал ты код этот важный? И обертку $(document).ready ты тоже снес, из недомыслия али по умыслу злому?

Suharik, Вы головой думать пробовали?
Вставьте в нужное место hide.

Suharik 30.04.2010 18:04

Так и не понял куда хид девать. Ладно пойду домой, дома буду пробовать. А Вы специально недоделываете код чтобы дать мне возможность помучится? ))

e1f 30.04.2010 19:42

$(function(){
    $('#report tr:not(.odd, :first-child)').bind('mouseleave', function(e) {
        var self = $(this),
            prev = self.prev();

        if (prev[0] === $(e.relatedTarget).closest('tr')[0]) {
            return;
        }

        self.hide();
        prev.find('.arrownext').toggleClass('up');
    })*!*.hide();*/!*

    $('#report tr.odd').bind('mouseenter mouseleave', function(e) {
        var self = $(this),
            next = self.next();

        if (next[0] === $(e.relatedTarget).closest('tr')[0]) {
            return;
        }

        if (e.type == 'mouseenter') {
            next.show();
        } else {
            $('#report tr:not(.odd, :first-child)').hide();
        }

        self.find('.arrownext').toggleClass('up');
    }).eq(0).triggerHandler('mouseenter');
}());


Цитата:

Сообщение от Suharik (Сообщение 53781)
Так и не понял куда хид девать. Ладно пойду домой, дома буду пробовать. А Вы специально недоделываете код чтобы дать мне возможность помучится? ))

Хм. Я даю Вам возможность научиться самому. Вы же ею не пользуетесь.

Suharik 30.04.2010 20:20

Спасибо все заработало. Но я именно в то место ставил хиде, но не работало. Видемо надо было надо было поменять местами. И подскажите, зачем в 30 строке Вы сделали дополнительные скобки ()?

Suharik 01.05.2010 00:02

Скажите а есть решение еще такой задачи. Нужно чтобы при отводе мыши из таблицы, тр не закрывался))

e1f 01.05.2010 01:32

Дополнительные скобки -- это очепятка :)
Решение есть. Думайте.

Suharik 04.05.2010 13:34

К сожалению не смог додуматся. На сколько я понял что нужно сделать условие типо такова if (e.type == 'mouseleave') {
.eq(0).triggerHandler('mouseenter');
}
Но это не работает)
просто не силен в jQuery да и в самом JS не очень. учусь пока))

e1f 05.05.2010 13:51

Вот вариант. В этом случае все намного проще.
$(function(){
    // this part must be done in css, not here!
    // show first row
    $('#report tr:first-child').show().
    // and hide all tips
        siblings(':nth-child(2n+1)').hide();

    $('#report tr:odd').unbind().bind('mouseenter', function() {
        // row
        var self = $(this),
        // tip
            next = self.next();

        // if tip already visible -- don't do anything
        if (next.is(':visible')) {
            return;
        }

        // instead of show/hide, much better add/remove special class
        // show tip 
        next.show().
        // and hide all another tips
            siblings(':not(:nth-child(2n), :first-child)').hide();

        // don't know, what is that
        self.find('.arrownext').toggleClass('up');
    }).
    // no need to do eq(0) -- why?
    triggerHandler('mouseenter');
});


Разберитесь хотя бы, как это работает.

Suharik 05.05.2010 14:58

// don't know, what is that
26 self.find('.arrownext').toggleClass('up');

Это делает картинку arrow.png если мышь наведена то картинка меняется.
А откуда Вы взяли это (2n+1), это с jQuery или сами придумали, и для чего это?

e1f 05.05.2010 15:03

Suharik, Вас действительно на гугле забанили?

Suharik 05.05.2010 15:09

Очень смешно! но все равно спасибо. Пошел учить английский язык.

e1f 05.05.2010 15:11

Мда. А если на вторую ссылку в выдаче нажать? Там русская дока по jQuery, вообще-то


Часовой пояс GMT +3, время: 04:09.