Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Помогите сократить код. (https://javascript.ru/forum/jquery/21062-pomogite-sokratit-kod.html)

MaximusGrek 27.08.2011 11:59

Помогите сократить код.
 
Возможно ли такое решение?

1. Есть меню HTML
<ul>
       <li>
                <a href="#menu_1_2_1" class="p1">Punkt1</a>
	</li>
	<li>
		<a href="#menu_1_2_2" class="p2">Punkt1</a>
	</li>
...........
                                                                 
</ul>

Общее кол-во ссылок в меню около 150 шт.
По пунктам подключаются внешние файлы:
$('.p1').click(function(){
function show_test() 
        {
        $.ajax({
            url: "htmls/p1.html", // ссылка на подключаемый документ
            cache: false, 
            success: function(html){
            $("#test").html(html); // задаем идентификатор, #id, который должен быть присвоен нужному div блоку
        }
        });
        }
        $(document).ready(function(){ // когда страничка полностью загрузится
            show_test(); // вызываем фнашу функцию с подключением документа
        }); return false;
		
		});

Соответственно что бы вызывать 150 файлов, нужны такие строки для каждого в отдельности.

Возможно ли что бы оглядываясь на "class", или по "onmouseclic" - вызывался файл с тем же именем что и "class", или "onmouseclic".

melky 27.08.2011 12:01

Oтформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]

немного странный код...

дело в том, что
$('.p1').click(function () {

необходимо писать, когда страничка уже загрузится. если скрипт находится в head, то необходимо писать так
$(function(){
 $('.p1').click(function () {
...........
})

это сокращение от $(document).ready

т.к. в моменту назначения обработчиков страница уже загружена,то можно написать так.
$(function() {
    $('.p1').click(function() {
        $.ajax({
            url: "htmls/p1.html",
            // ссылка на подключаемый документ
            cache: false,
            success: function(html) {
                $("#test").html(html); // задаем идентификатор, #id, который должен быть присвоен нужному div блоку
            }
        });
        return false;
    });
});


если же код вставляется внизу страницы (где-то у конца тега body), то код можно еще сократить до такого.

$('.p1').click(function() {
    $.ajax({
        url: "htmls/p1.html",
        // ссылка на подключаемый документ
        cache: false,
        success: function(html) {
            $("#test").html(html); // задаем идентификатор, #id, который должен быть присвоен нужному div блоку
        }
    });
    return false;
});


так как ссылок у вас много (150), то назначать обработчик каждой - насилие.

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

сделать это можно так

$('ul').click(function(e) {
    if (e.bubbles) {
        if (e.target.tagName.toLowerCase() === "a") {
            $.ajax({
                url: "htmls/p1.html",
                cache: false,
                success: function(html) {
                    $("#test").html(html);
                }
            });
            e.preventDefault();
        }
    }
});


если код (скрипт) подключается в head (сверху страницы), то надо обернуть его в обработчик загрузки страницы. в итоге код будет такой :

$(function() {
    $('ul').click(function(e) {
        if (e.bubbles) {
            if (e.target.tagName.toLowerCase() === "a") {
                $.ajax({
                    url: "htmls/p1.html",
                    cache: false,
                    success: function(html) {
                        $("#test").html(html);
                    }
                });
                e.preventDefault();
            }
        }
    });
});



Цитата:

Сообщение от MaximusGrek (Сообщение 122845)
Возможно ли что бы оглядываясь на "class", или по "onmouseclic" - вызывался файл с тем же именем что и "class", или "onmouseclic".

неясно. понятней опишите

MaximusGrek 27.08.2011 14:08

Спасибо. Узнал нового.
Но смысл остался тот же.
150 ссылок = 150 файлов.
Нужно коротенький код делающий:
<a href="#" class="здесь имя файла"></a> = открывается файл, из указанной папки, с именем указанным в "здесь имя файла". И код этот должен обрабатывать ВСЕ ссылки одновременно.
Ну, это для понятности:
$(здесь как бы ссылка с ВАРИРУЮЩИМСЯ классом в котором указанно имя файла).click(function(){
function show_test() 
        {
        $.ajax({
            url: "а здесь собственно папка,путь, по которому лежат файлы, + должен открыватся тот имя которого указанно в класс.", 
            cache: false,
            success: function(html){
            $("#test").html(html);}
        });
        }
        $(document).ready(function(){ 
            show_test();
        }); return false;
		
		});

Мне понравилось решение, с обработчиком всего списка. Но как заставить открыватся РАЗНЫЕ файлы.

melky 27.08.2011 14:13

$(function() {
    $('ul').click(function(e) {
        if (e.bubbles) {
            if (e.target.tagName.toLowerCase() === "a") {
                $.ajax({
*!*
                    url: "htmls/"+e.target.className+".html",
*/!*
                    cache: false,
                    success: function(html) {
                        $("#test").html(html);
                    }
                });
                e.preventDefault();
            }
        }
    });
});

devote 27.08.2011 14:14

ну вместо этого:
$.ajax({
                    url: "htmls/p1.html",
                    cache: false,
                    success: function(html) {
                        $("#test").html(html);
                    }
                });

вообще можно сделать так:
$("#test").load('htmls/p1.html');
Хотя там параметр кеш есть, не знаю как повлияет

MaximusGrek 27.08.2011 14:26

Спасибо огромное, вот эту самую возможность я и не знал:

url: "htmls/"+e.target.className+".html",


Еще раз спасибо!

melky 27.08.2011 14:42

devote, точно. кэш можно по-другому отменить

в итоге получается такая функция

$(function() {
    $('ul').click(function(e) {
        if (e.bubbles) {
            if (e.target.tagName.toLowerCase() === "a") {
                $("#test").load("htmls/" + e.target.className + ".html?rand" + Date.now() );
                e.preventDefault();
            }
        }
    });
});


или так, если уж вообще приспичило. это самый минимум

$(function() {
    $('ul').click(function(e) {
               e.bubbles &&
               e.target.tagName.toLowerCase() === "a" &&
                      $("#test").load("htmls/" + e.target.className + ".html?rand" + Date.now(),
                      e.preventDefault();
        }
    }
    });
});

DjDiablo 28.08.2011 15:40

Может я непонял задачу, но помоему с ней справляется функция из 2х строчек. Суть которой загрузить в .target данные с адреса находящегося, в аттрибуте href ссылки класса supertarget; При таком подходе ссылок может быть как угодно много, главное чтобы url был в href ссылки. Вместо href можно использовать любой другой атрибут к примеру <a tazik="www.yandex.ru"> тоже приемлимо, извлекается соответственно при помощи $(this).attr("tazik").

<a href="superInfa.html" class="superlink">нажми на супер ссылку</a>

$('.superlink').click(function(){
               $(".target").load($(this).attr("href"));
               return false;               
});

Код непроверял.

Да кстатии, вот это вот href="#" необязательно, достаточно обработчику click вернуть FALSE. Тоесть используйте href по назначению, а имя файла в class плохая идея.

melky 28.08.2011 16:53

Цитата:

Сообщение от MaximusGrek (Сообщение 122845)
<a href="#menu_1_2_1" class=*!*"p1"*/!*>Punkt1</a>
<a href="#menu_1_2_2" class=*!*"p2"*/!*>Punkt1</a>


$('.p1').click(function(){
function show_test() 
        {
        $.ajax({
            url: "htmls/*!*p1.html"*/!*, // ссылка на подключаемый документ
            cache: false, 
            success: function(html){
            $("#test").html(html); // задаем идентификатор, #id, который должен быть присвоен нужному div блоку
        }
        });
        }
        $(document).ready(function(){ // когда страничка полностью загрузится
            show_test(); // вызываем фнашу функцию с подключением документа
        }); return false;
		
		});

.

он хотел, чтобы при клике на каждуйю из 150 ссылок внутри списка подгружалась без кеша страница, которая равна классу этой ссылки

ваый 28.08.2011 17:04

Классы тут использовать нельзя. Они не для этого предназначены. Нужно использовать все по назначению. А если для того, чтобы сделать текущий пункт активным мы захотим сделать что-то такое:
<a href="#menu_1_2_1" class="p1 *!*active*/!*">Point1</a>
что часто и делается? И ссылка перестанет работать.

devote 28.08.2011 17:11

Цитата:

Сообщение от ваый
Классы тут использовать нельзя.

Кто сказал что нельзя?
Цитата:

Сообщение от ваый
А если для того, чтобы сделать текущий пункт активным мы захотим сделать что-то такое:

Вот когда захотим, тогда и будем думать

DjDiablo 28.08.2011 17:15

всё равно class по идеи это идентификатор группы обьектов а не уникального обьекта,мы тут немного отходим от философии но бог с ним.
И к тому же придётся обьявлять разработчик для каждого класса (p1,p2, hrenovina3и т.д.), а это вообще криво. помоему разумнее использовать href для ссылки, а класс чтобы повесить обработчик.

И вот ещё, возможно более разумно использовать вместо
$('.class').click(function(){
использовать
$('.class').live. Это избавит нас от необходимости использовать $(document).ready внутри обработчика.

DjDiablo 28.08.2011 17:19

Цитата:

Сообщение от devote (Сообщение 123088)
Кто сказал что нельзя?
Вот когда захотим, тогда и будем думать

Думать надо заранее,а точнее заранее закладывать более гибкую архетиктуру, а то потом грызёш зубами мышку от того что пару недель назад сэкономил 15 минут, а теперь придётся пол приложения переписывать, потому что одна хреновина с быстрым решением не состыковывается.

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

melky 28.08.2011 17:36

Цитата:

Сообщение от DjDiablo (Сообщение 123089)
$('.class').live. Это избавит нас от необходимости использовать $(document).ready внутри обработчика.

да ну.. всего лишь один раз подумать Why You Should Never Use jQuery Live

devote 28.08.2011 18:01

Цитата:

Сообщение от DjDiablo
Думать надо заранее,а точнее заранее закладывать более гибкую архетиктуру, а то потом грызёш зубами мышку от того что пару недель назад сэкономил 15 минут

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

ваый 28.08.2011 18:27

Цитата:

Сообщение от devote
Ну вперед, думай на здоровье, ктож против... Я думаю и обдумываю все для своих проектов, тут отвечаю так как спрашивают... Мне не до того что бы думать еще о том что там планирует сделать тот кто спрашивает. Каков вопрос, таков ответ.

Порочная практика. Вопрос такой потому-то что человек плохо разбирается вообще, раз так строит свой код. Как сказал DjDiablo, думать надо сразу. И раз уж на то пошло, отвечая здесь, мне кажется, нужно стремиться дать как можно более грамотный ответ, чтобы новички развивались правильно, а не поддерживать говнокодинг. Мне не нравится принцип "каков вопрос, таков ответ" в данном случае. Нам всем не нравится плохой код, так зачем же косвенно это поощрять?

devote 28.08.2011 19:26

Цитата:

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

Ну если у тебя куча свободного времени, и ты готов его тратить на то что бы объяснить человеку что такое JavaScript пережевывая каждый метод и рассказывая что хорошо а что плохо, то вперед, никто против не будет... Лично у меня очень мало свободного времени, хотя сюда заглядываю часто не потому что свободен, а потому что обновить страницу много времени не надо. А что бы дать нормальный ответ, нужно подумать, а что бы подумать нужно время, а что бы было время нужно бросить свои дела.

P.S. Те кто реально хочет людям помогать, помогают, и даже на этом зарабатывают деньги. Возьми пример с Ильи, хозяина этого портала.

ваый 28.08.2011 20:11

Цитата:

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

Очень часто я просто не берусь даже отвечать, потому что мне не интересно объяснять элементарные вещи. Но если отвечаю, так все же стараюсь принести ответом пользу, а не вред. Хотя твоя позиция тоже ясна и имеет право быть. Короче, дело каждого.

MaximusGrek 06.09.2011 23:56

Спасибо Вам господа, все это очень интересно. И познавательно конечно. Однако я не программер и на Джаве пишу за еду :).
Проще говоря у меня иногда получается, а мой програмизм не дает умереть с голоду. Но я учусь!
Спасибо всем за помощь!
Однако теперь возникла проблема следующего характера:
Мне пришлось кое что поменять немного-
<ul>
     <li class="class1">
        <ul>
           <li>
              <a href="#menu1_1" class="gromozeka_1">Громозека 1</a>
           </li>
           <li>
              <a href="#menu1_2" class="gromozeka_2">Громозека 2</a>
           </li>
       </ul>
    </li>
    <li class="class2">
        <ul>
           <li>
              <a href="#menu2_1" class="chupakabra_1">Чупакабра 1</a>
           </li>
           <li>
              <a href="#menu2_2" class="chupakabra_2">Чупакабра 2</a>
           </li>
       </ul>
    </li>
</ul>


В реальности ссылок больше как и классов.

$(function() {
	$('.class1').click(function(e) {
		if (e.bubbles) {
			 if (e.target.tagName.toLowerCase() === "a") {
				$.ajax({
					url: "htmls/class1/"+e.target.className+".html",
					cache: false,
					success: function(html) {
					$("#test").html(html);
						}
					});
				e.preventDefault();
			}
		}
	});
});
$(function() {
	$('.class2').click(function(e) {
		if (e.bubbles) {
			 if (e.target.tagName.toLowerCase() === "a") {
				$.ajax({
					url: "htmls/class2/"+e.target.className+".html",
					cache: false,
					success: function(html) {
					$("#test").html(html);
						}
					});
				e.preventDefault();
			}
		}
	});
});


Так вот это в 8 експлорере и опере 9 - НЕ РАБОТАЕТ!

MaximusGrek 07.09.2011 00:05

И еще я не понял: if (e.bubbles) {
Что такое bubbles?

devote 07.09.2011 06:00

$(function() {
    $('.class1').click(function(e) {

        e = e || window.event;

        if ( e.target.tagName.toLowerCase() === "a" ) {
            $.ajax({
                url: "htmls/class1/"+e.target.className+".html",
                cache: false,
                success: function(html) {
                    $("#test").html(html);
                }
            });

            if ( e.preventDefault ) {
                e.preventDefault();
            } else {
                e.returnValue = false;
            }
        }
    });
});

melky 07.09.2011 08:43

Цитата:

Сообщение от devote (Сообщение 125263)
$(function() {
    $('.class1').click(function(e) {

*!*
        e = e || window.event;
*/!*

        if ( *!*e.target*/!*.tagName.toLowerCase() === "a" ) {
            $.ajax({
                url: "htmls/class1/"+*!*e.target*/!*.className+".html",
                cache: false,
                success: function(html) {
                    $("#test").html(html);
                }
            });

*!*
            if ( e.preventDefault ) {
                e.preventDefault();
*/!*
            } else {
                e.returnValue = false;
            }
        }
    });
});

ooh, ох уж эта jquery. там уже e == window.event, а e.target == this. preventDefault там тоже есть :)

jq event

не любите вы её использовать :)

devote 07.09.2011 09:07

Цитата:

Сообщение от melky
не любите вы её использовать

Еще бы :)

MaximusGrek 12.09.2011 12:18

Да Бог с ним - главное что бы работало. А оно работает и работает быстро!
Спасибо Мастер melky и двойное спасибо Мастер devote.

P.S. Про bubbles был глупый вопрос... Изините.


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