Jump to content
  • 0

Бегущая строка


DjTarik
 Share

Question

Была задача - написать скрипт "бегущей строки". Сделал как можно проще.

Ссылка: http://tarik.kasperovich.ru/test_9/index.html

Код:

	// The document is loaded -->
onload = function()
{
runingLine.initial('RunLineLrt', 50, 'ltr');

//runingLine.initial('RunLineRtl', 50, 'rtl');
}
// -->

var runingLine = {};

// RuningLine initialization -->
runingLine.initial = function(id, value, direction) // direction can be 'ltr' or 'rtl' -->
{
obj = document.getElementById(id);
parent = obj.parentNode;
speed = Math.round(1000/value); // quantity of pixels in a second -->
obj.style.visibility = 'visible';

if (direction == 'ltr')
{
posStart = parent.offsetWidth; // start coordinate -->
posFinish = -(obj.offsetWidth); // finish coordinate -->
runingLine.traffic.ltr();
}
else if (direction == 'rtl')
{
posStart = -(obj.offsetWidth); // start coordinate -->
posFinish = parent.offsetWidth; // finish coordinate -->
runingLine.traffic.rtl();
}

obj.onmouseover = function()
{
clearTimeout(timer);
}
obj.onmouseout = function()
{
if (direction == 'ltr')
{
runingLine.traffic.ltr();
}
else if (direction == 'rtl')
{
runingLine.traffic.rtl();
}
}
}
// -->

runingLine.traffic = {};

// RuningLine traffic 'left to right' -->
runingLine.traffic.ltr = function()
{
if (posStart >= posFinish)
{
posStart-=1; // change coordinate -->
obj.style.left = posStart+'px';
timer = setTimeout(arguments.callee, speed);
}
else
{
posStart = parent.offsetWidth; // start coordinate -->
posFinish = -(obj.offsetWidth); // finish coordinate -->
runingLine.traffic.ltr();
}
}
// -->

// RuningLine traffic 'right to left' -->
runingLine.traffic.rtl = function()
{
if (posStart <= posFinish)
{
posStart+=1; // change coordinate -->
obj.style.left = posStart+'px';
timer = setTimeout(arguments.callee, speed);
}
else
{
posStart = -(obj.offsetWidth); // start coordinate -->
posFinish = parent.offsetWidth; // finish coordinate -->
runingLine.traffic.rtl();
}
}
// -->

Вроде всё просто.

Но есть пару вопросов:

1. У меня есть объект "var runingLine = {};". Я от него создавал функцию "runingLine.initial()", чтобы как-то удобнее скомпоновать свой код. Это вообще верный подход? Где можно почитать об этом? (в смысле, как улучшить код и как грамотнее работать с объектами)

2. У меня есть объект "var runingLine = {};". Я от него создавал "runingLine.traffic = {};" и потом ещё "runingLine.traffic.rtl()" и т.д. Можно ли так делать, или это неграмотно?

Я только учусь, и не знаю, где взять информацию о том, как грамотно работать с объектами и в чём фишка объектно=ориентированного подхода. =(

P.S. Есть ещё вопросы, но о них чуть позже. Пока интересует только это.

Спасибо.

Edited by DjTarik
Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0

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

Link to comment
Share on other sites

  • 0
Некоторое время назад ради тренировки тоже решил написать такую вещь. Получилась на одном дыхании. Принцип движения такой же, как у вас, но код немножко покороче. Если есть желание, можете посмотреть здесь.

Ну строка-то у меня работает.

Проблема в другом:

1. У меня есть объект "var runingLine = {};". Я от него создавал функцию "runingLine.initial()", чтобы как-то удобнее скомпоновать свой код. Это вообще верный подход? Где можно почитать об этом? (в смысле, как улучшить код и как грамотнее работать с объектами)

2. У меня есть объект "var runingLine = {};". Я от него создавал "runingLine.traffic = {};" и потом ещё "runingLine.traffic.rtl()" и т.д. Можно ли так делать, или это неграмотно?

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

Link to comment
Share on other sites

  • 0
Не нравится то, что ты пытаешься переопределить глобальную переменную window.parent.

Спасибо, Помогло. Я и забыл о существовании window.parent.

А как на счёт этого:

1. У меня есть объект "var runingLine = {};". Я от него создавал функцию "runingLine.initial()", чтобы как-то удобнее скомпоновать свой код. Это вообще верный подход? Где можно почитать об этом? (в смысле, как улучшить код и как грамотнее работать с объектами)

2. У меня есть объект "var runingLine = {};". Я от него создавал "runingLine.traffic = {};" и потом ещё "runingLine.traffic.rtl()" и т.д. Можно ли так делать, или это неграмотно?

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

Link to comment
Share on other sites

  • 0
Спасибо, Помогло. Я и забыл о существовании window.parent.

А как на счёт этого:

1. У меня есть объект "var runingLine = {};". Я от него создавал функцию "runingLine.initial()", чтобы как-то удобнее скомпоновать свой код. Это вообще верный подход? Где можно почитать об этом? (в смысле, как улучшить код и как грамотнее работать с объектами)

2. У меня есть объект "var runingLine = {};". Я от него создавал "runingLine.traffic = {};" и потом ещё "runingLine.traffic.rtl()" и т.д. Можно ли так делать, или это неграмотно?

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

Такие вещи лучше выносить в конструктор или в синглтоны.

Например

function traffic () {

this.rtl = function(){}

}

runingLine.traffic = new traffic();

Но, твой вариант тоже можно использовать, если этот объект является локальной капсулой.

Link to comment
Share on other sites

  • 0
Такие вещи лучше выносить в конструктор или в синглтоны.

Например

function traffic () {

this.rtl = function(){}

}

runingLine.traffic = new traffic();

Но, твой вариант тоже можно использовать, если этот объект является локальной капсулой.

Спасибо, понял.

И самый главный вопрос:

Нужно запустить одновременно 2 или 3 бегущих строки.

В моём случае хотел сделать так:

		onload = function()
{
runingLine.initial('RunLineLrt', 50, 'ltr');
runingLine.initial('RunLineRtl', 50, 'rtl');
}
// -->

Но так не пашет. И по идее, это логично. Так как у меня там таймауты.

Как (можно только в теории) такое делается? Каков принцип?

Link to comment
Share on other sites

  • 0
Как (можно только в теории) такое делается? Каков принцип?

Принцип стека нужно использовать.

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

И отдельный итератор занимается анимированием всех этих объектов.

Link to comment
Share on other sites

  • 0
Принцип стека нужно использовать.

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

И отдельный итератор занимается анимированием всех этих объектов.

Не совсем понял про "итератор". Хотел сделать так:

	// <![CDATA[

// The document is loaded -->
onload = function()
{
runingLine.iterator();
}
// -->

var runingLine = {};

runingLine.info = [
['RunLineLrt', 50, 'ltr'],
//['RunLineRtl', 50, 'rtl']
];

runingLine.iterator = function() {
for (var i=0; i<runingLine.info.length; i++){
var val_1 = runingLine.info[i][0];
var val_2= runingLine.info[i][1];
var val_3 = runingLine.info[i][2];
runingLine.initial(val_1, val_2, val_3);
}
}

// RuningLine initialization -->
runingLine.initial = function (id, value, direction) { // direction can be 'ltr' or 'rtl' -->
obj = document.getElementById(id);
wrapper = obj.parentNode;

speed = Math.round(1000/value); // quantity of pixels in a second -->
obj.style.visibility = 'visible';

if (direction == 'ltr') {
posStart = wrapper.offsetWidth; // start coordinate -->
posFinish = -(obj.offsetWidth); // finish coordinate -->
runingLine.traffic.ltr();
}
else if (direction == 'rtl') {
posStart = -(obj.offsetWidth); // start coordinate -->
posFinish = wrapper.offsetWidth; // finish coordinate -->
runingLine.traffic.rtl();
}

obj.onmouseover = function() {
clearTimeout(timer);
}
obj.onmouseout = function() {
if (direction == 'ltr') {
runingLine.traffic.ltr();
}
else if (direction == 'rtl') {
runingLine.traffic.rtl();
}
}
}

runingLine.traffic = new Traffic();

function Traffic() {

// RuningLine traffic 'left to right' -->
this.ltr = function() {
if (posStart >= posFinish) {
posStart-=1; // change coordinate -->
obj.style.left = posStart+'px';
timer = setTimeout(arguments.callee, speed);
}
else {
posStart = wrapper.offsetWidth; // start coordinate -->
posFinish = -(obj.offsetWidth); // finish coordinate -->
runingLine.traffic.ltr();
}
}
// -->

// RuningLine traffic 'right to left' -->
this.rtl = function() {
if (posStart <= posFinish) {
posStart+=1; // change coordinate -->
obj.style.left = posStart+'px';
timer = setTimeout(arguments.callee, speed);
}
else {
posStart = -(obj.offsetWidth); // start coordinate -->
posFinish = wrapper.offsetWidth; // finish coordinate -->
runingLine.traffic.rtl();
}
}
// -->

}

// ]]>

Но не получилось. Получилось, что переписал код, а ошибка та же =)

вот тут:

	  runingLine.info = [
['RunLineLrt', 50, 'ltr'],
//['RunLineRtl', 50, 'rtl']
];

мой массив с данными.

Вот так:

	  runingLine.iterator = function() {
for (var i=0; i<runingLine.info.length; i++){
var val_1 = runingLine.info[i][0];
var val_2= runingLine.info[i][1];
var val_3 = runingLine.info[i][2];
runingLine.initial(val_1, val_2, val_3);
}
}

хотел пробегать по массиву.

Чего я не понимаю? O_o

вот сылка для наглядности:

http://tarik.kasperovich.ru/test_10/index.html

Как верно построить цикл, что бы одна и та же функция двигала сразу несколько строк?

Edited by DjTarik
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy