• Страница 1 из 1
  • 1
Форум Studio AD » Сайтостроение » Общий форум по Ucoz » Реклама после первого поста в теме (Модернизируем форум)
Реклама после первого поста в теме
Aleko
Дата: Четверг, 20.08.2009, 21:14 | Сообщение # 1
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Рекламу после первого сообщения в каждой теме сделать очень просто. Не пологаясь на встроенную JQuery, так как, честно признаюсь, отвык ей пользоваться, напишу решение на js и на css.

Решение на JS

В шаблон общего вида страниц форума после условного кода $BODY$ вставляем вот такой код:

Code
<div id="advert" style="display:none;">РЕКЛАМА</div>
<script type="text/javascript">
d = document.createElement('div');
d.innerHTML=document.getElementById('advert').innerHTML;
t=document.getElementsByTagName('td');
for(z=0;z<t.length;z++){if(t[z].className=='postFirst'){t[z].appendChild(d);}}
</script>

Проверено - работает.

Решение без использование JS на CSS

В шаблон вида материалов форума в самый конец вставляем код:

Code
<div class="advert">РЕКЛАМА</div>

Затем в файл со стилями вашего сайта вставляем стили ниже:
Code
<style>
.advert{display:none}
.postFirst .advert{display:block !important}
</style>
Конечно можно сделать и на квери, но мне влом =)


Бесплатные обои.
  
DoGbsp
Дата: Четверг, 20.08.2009, 22:24 | Сообщение # 2
молчун
Группа: Пользователи
Пользователь №: 88
Сообщений: 2
Спасибо Aleko fear
  
tomas686
Дата: Четверг, 20.08.2009, 22:39 | Сообщение # 3
шептун
Группа: Проверенные
Пользователь №: 18
Сообщений: 90
Получено оценок: 1
Aleko, Спасибо
  
Aleko
Дата: Пятница, 21.08.2009, 00:37 | Сообщение # 4
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Всегда пожалуйста! ;)

Бесплатные обои.
  
club4127807
Дата: Среда, 07.07.2010, 11:02 | Сообщение # 5
говорун
Группа: Проверенные
Пользователь №: 3087
Сообщений: 190
Получено оценок: 3
спасибо, давно искал)

Сеть образовательных сайтов studz
  
JaBa
Дата: Среда, 28.07.2010, 16:03 | Сообщение # 6
молчун
Группа: Пользователи
Пользователь №: 3085
Сообщений: 5
Aleko, Спасибо beer
  
Infamous
Дата: Среда, 28.07.2010, 18:08 | Сообщение # 7
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Quote (Aleko)
tds

Тут ошибка: не tds, а t.
Кстати, для улучшения скорости работы решения на js можно было бы во-первых, добавлять блок с рекламой не через методы DOM, а через innerHTML, во-вторых, по возможности использовать querySelectorAll.

  
Aleko
Дата: Четверг, 29.07.2010, 17:57 | Сообщение # 8
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Infamous, исправил

Бесплатные обои.
  
Infamous
Дата: Четверг, 29.07.2010, 19:46 | Сообщение # 9
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Quote
во-вторых, по возможности использовать querySelectorAll.

А это?
В W3C-браузерах скорость работы скрипта уменьшится на 3 мс. prof

Сообщение отредактировал Infamous - Четверг, 29.07.2010, 19:47
  
Aleko
Дата: Четверг, 29.07.2010, 22:58 | Сообщение # 10
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Infamous, выложи свой вариант а я напишу свой - посмотрим чей быстрее отработает =) (просто ради интереса, я не выпендриваюсь)

Бесплатные обои.
  
Infamous
Дата: Пятница, 30.07.2010, 08:16 | Сообщение # 11
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Code
t = document.querySelectorAll ? document.querySelectorAll('td.postFirst') : document.getElementsByTagName('td');
for (z = 0; z < t.length; z++) {
  if (t[z].className == 'postFirst') {
   t[z].innerHTML += 'Ваша рекламкО'
  }
}
  
DSC
Дата: Пятница, 30.07.2010, 13:54 | Сообщение # 12
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, + можно ещё укоротить и сделать скорость работы быстрее, вот так:
Code
<script type='text/javascript'>
var d=document;for(i=0;t=(d.querySelectorAll('td.postFirst')||d.getElementsByTagName('td'))[i++];)if('postFirst'==t.className)t.innerHTML+='рекламма';
</script>
p.s.: да и зачем использовать querySelectorAll, если потом опять перебираешь все с таким классом, так и так время тратится одинаковое! Поэтому можно использовать и такой вариант:
Code
<script type='text/javascript'>
for(i=0;t=document.getElementsByTagName('td')[i++];)if('postFirst'==t.className)t.innerHTML+='рекламма';
</script>
этот вариант будет работать быстрее чем вариант Aleko в 2 раза! ^_^


aka Latro

Сообщение отредактировал DSC - Пятница, 30.07.2010, 13:58
  
Infamous
Дата: Пятница, 30.07.2010, 14:01 | Сообщение # 13
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
DSC, с getElementsByTagName перебираются все TD, а с querySelectorAll — только с нужным классом (всего один TD).

Да, и надо ещё break в цикл добавить, чтобы не перебирать впустую элементы.

Сообщение отредактировал Infamous - Пятница, 30.07.2010, 14:03
  
Aleko
Дата: Пятница, 30.07.2010, 14:03 | Сообщение # 14
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Не претендую на скорость выполнения но вот так тоже должно работать:

Code
<script type='text/javascript'>
(function(a,b){
       while(a>0)'postFirst'!=b[a++].className||b[--a].innerHTML='Реклама',a=-1
       })(
            0,
            document.getElementsByTagName('td')||document.querySelectorAll('td.postFirst ')
       )
</script>


Бесплатные обои.
  
DSC
Дата: Пятница, 30.07.2010, 14:18 | Сообщение # 15
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, нет, просто смотри, когда используешь кьюери селектор, а затем условку, то оно увеличивает время выполнения, ну, в общем так и так, первый предложенный мною вариант работает быстрее всех из указанных выше)
Aleko, а почему ты ставишь неравество, должно быть ==


aka Latro

Сообщение отредактировал DSC - Пятница, 30.07.2010, 14:20
  
Infamous
Дата: Пятница, 30.07.2010, 14:49 | Сообщение # 16
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
DSC, т.е по-твоему перебор всех TD быстрее, чем перебор одного TD?

Мой вариант срабатывает меньше чем за 1 мс, а твой ГК — за 5, а первый вариант Aleko срабатывает за 1 мс. Ну да, у тебя быстрее.

Сообщение отредактировал Infamous - Пятница, 30.07.2010, 14:51
  
Raiderr
Дата: Пятница, 30.07.2010, 14:54 | Сообщение # 17
болтун
Группа: Проверенные
Пользователь №: 673
Сообщений: 349
Получено оценок: 26
а так?
в вид материалов:
Code
<div id="advert"></div>

и в общий после $BODY$:

Code
<script>
     document.getElementById('advert').innerHTML='Реклама'                            
</script>


Новый кавер Jar of Hearts: http://www.youtube.com/watch?v=OLkXQMHVRhI
  
WRC
Дата: Пятница, 30.07.2010, 14:59 | Сообщение # 18
говорун
Группа: Проверенные
Пользователь №: 223
Сообщений: 149
Получено оценок: 11
Рас уж на то дело пошло... а не легче в вид материалов в самый низ:
Code
<?if($NUMBER$==1)?>реклама<?endif?>


Устраняем баг при просмотре материала
  
Infamous
Дата: Пятница, 30.07.2010, 15:02 | Сообщение # 19
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Raiderr, будет после каждого поста.

WRC, разговор идёт о производительности JavaScript, а не о поиске самого быстрого решения именно для этой задачи.

Сообщение отредактировал Infamous - Пятница, 30.07.2010, 15:03
  
DSC
Дата: Пятница, 30.07.2010, 15:02 | Сообщение # 20
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, не может первый код Алеко срабатывать за 1мс, т.к. я знаю как проверяется скорость поиска по дому, у него оно работает медленнее, т.к. я перебирал много вариантов циклов, и пришёл к данному результату, мой цикл работает за 5-6мс, обычный цикл работает за 9-16мс, и не надо мне тут наваливать что у меня гавно код, сначала опробуй, потом наяривай!

aka Latro
  
DSC
Дата: Пятница, 30.07.2010, 15:04 | Сообщение # 21
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, не будет после каждого, т.к. поиск по айди берёт за основу только первый айди! но валидным оно уже не будет, нельзя чтобы один айди использовался более одного раза!

aka Latro
  
Infamous
Дата: Пятница, 30.07.2010, 15:04 | Сообщение # 22
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Я опробовал и замерял скорость. Если бы не замерял, я бы не говорил точную скорость работы…
  
DSC
Дата: Пятница, 30.07.2010, 15:06 | Сообщение # 23
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, слушай, хорошо, покажи мне реальный пример, и если действительно будет моя медленне чем первый вариант, то да, я соглашусь, что мой вариант очень медленный!

aka Latro
  
Infamous
Дата: Пятница, 30.07.2010, 15:09 | Сообщение # 24
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Ты что, не знаешь, как тестить скорость работы скриптов?

Code
var time = new Date().getTime();
/* Тут код */
alert( new Date().getTime() - time );

Вот и тести.

  
DSC
Дата: Пятница, 30.07.2010, 15:13 | Сообщение # 25
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, нет, ты покажи поностью два примера, чтобы небыло такого что я не прав!

aka Latro
  
Raiderr
Дата: Пятница, 30.07.2010, 15:15 | Сообщение # 26
болтун
Группа: Проверенные
Пользователь №: 673
Сообщений: 349
Получено оценок: 26
Quote (WRC)
<?if($NUMBER$==1)?>реклама<?endif?>

а нихерна работать небудет!!!!!!!!!

Вот способ на сервере:

Code
<?if substr($NUMBER$, strrpos($NUMBER$, '">')+2, len($NUMBER$)-strrpos($NUMBER$, '">')-6 )='1' ?>Реклама<?endif?>


Новый кавер Jar of Hearts: http://www.youtube.com/watch?v=OLkXQMHVRhI
  
Infamous
Дата: Пятница, 30.07.2010, 15:15 | Сообщение # 27
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Копировать страницу с темой, ставить на неё оба скрипта и заливать на хостинг, чтобы доказать тебе, что мой код быстрее? Почему я должен всё это делать вместо того, чтобы ты сам потестил?
  
DSC
Дата: Пятница, 30.07.2010, 15:19 | Сообщение # 28
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, просто я проверял свой вариант цикла и обычный вариант цикла, мой цикл быстрее!

aka Latro
  
Infamous
Дата: Пятница, 30.07.2010, 15:35 | Сообщение # 29
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Для всех браузеров, кроме IE, можно вообще обойтись без цикла:

Code
(function () {
  var text = 'РекламкО';
  if ( document.querySelector ) {
   document.querySelector('.postFirst').innerHTML += text;
  } else {
   var e = document.getElementsByTagName('td'),
   l = e.length;
   for ( var i = 0; i < l; i++ ) {
    if ( e[i].className == 'postFirst' ) {
     e[i].innerHTML += text;
     break;
    }
   }
  }
})();
  
Infamous
Дата: Пятница, 30.07.2010, 15:43 | Сообщение # 30
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
http://qlib.ucoz.ru/Test_.html
  
DSC
Дата: Пятница, 30.07.2010, 16:06 | Сообщение # 31
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, такой вариант тебя устроит:
Code
<script>for(i=0;d=document.getElementsByTagName('td')[i++];)if(d.className=='postFirst'){d.innerHTML+='Реклама';break;}</script>
проверил, результат - 0


aka Latro
  
Infamous
Дата: Пятница, 30.07.2010, 16:30 | Сообщение # 32
говорун
Группа: Проверенные
Пользователь №: 316
Сообщений: 158
Получено оценок: 21
Зайди сюда ещё раз, перед этим кэш почисти. Поставил твой новый код.
  
DSC
Дата: Пятница, 30.07.2010, 16:41 | Сообщение # 33
спикер
Группа: Проверенные
Пользователь №: 127
Сообщений: 516
Получено оценок: 41
Infamous, ну кароче пофигу, задралось..., я предложил свои вариант, кому надо пусть берёт любой! ^_^

aka Latro
  
Aleko
Дата: Пятница, 30.07.2010, 18:51 | Сообщение # 34
Watching you
Группа: Администраторы
Пользователь №: 2
Сообщений: 1621
Получено оценок: 167
Странно, потестил все скрипты на стенде. В firefox половина скриптов работает за 0-1 мс а вот в осле лажают почти все скрипты кроме моего - у него стабильно 0 мс:

Code
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>js</title>
</head>
<body>
<script>
(function(){
  var _=1000
  while(_--)this.appendChild(document.createElement('td'));
  this.lastChild.className='postFirst';
  document.body.appendChild(this.parentNode)
  }).call(document.createElement('table').appendChild(document.createElement('tr')));
alert((function(_){
  /******************************/
   
(function(a,b){
        while(a!==false)'postFirst'!=b[a++].className||(b[--a].innerHTML=(a=false)||'Реклама')
        })(0,document.querySelectorAll('td.postFirst')||document.getElementsByTagName('td'))
   
  /******************************/
  return new Date().getTime()-_+' ms'
  })(new Date().getTime()))

// 9 , 13-14

/*d = document.createElement('div');
d.innerHTML='Ы';
t=document.getElementsByTagName('td');
for(z=0;z<t.length;z++){if(t[z].className=='postFirst'){t[z].appendChild(d);}}*/

// 0-1 , 3-4

/*t = document.querySelectorAll ? document.querySelectorAll('td.postFirst') : document.getElementsByTagName('td');
for (z = 0; z < t.length; z++) {
   if (t[z].className == 'postFirst') {
    t[z].innerHTML += 'Ы'
   }
}*/

// 0-1 , 3-4

/*var d=document;for(i=0;t=(d.querySelectorAll('td.postFirst')||d.getElementsByTagName('td'))[i++];)if('postFirst'==t.className)t.innerHTML+='рекламма';*/

// 3-4 ,13-14

/*for(i=0;t=document.getElementsByTagName('td')[i++];)if('postFirst'==t.className)t.innerHTML+='рекламма';*/

// 0-1 , 0

/*(function(a,b){
        while(a!==false)'postFirst'!=b[a++].className||(b[--a].innerHTML=(a=false)||'Реклама')
        })(
             0,
             document.querySelectorAll('td.postFirst')||document.getElementsByTagName('td')
        )*/

</script>
</body>
</html>


Бесплатные обои.
  
Форум Studio AD » Сайтостроение » Общий форум по Ucoz » Реклама после первого поста в теме (Модернизируем форум)
  • Страница 1 из 1
  • 1
Поиск:
© Studioad.ru 2006 · 2010. Использование материалов форума на сторонних ресурсах без прямой обратной ссылки строго запрещено. Хостинг от uCoz.