Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Рациональное использование функции (https://javascript.ru/forum/misc/31079-racionalnoe-ispolzovanie-funkcii.html)

dmitry111 26.08.2012 14:47

Рациональное использование функции
 
Функция создает новые элементы, каждый раз прибавляя к значению top 70px.

В результате чего абсолютно позиционированные элементы идут друг за другом

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>выпвып</title>
</head>

<body>
<button id="button">создать новый элемент</button>
<script>
    var gfunc = 20;

    function newPosition() {
        gfunc += 70;
        return gfunc + "px";
    }

    function create() {

        var  div = document.createElement("div");
        div.style.position = "absolute";
        div.style.top = newPosition();
        div.style.left = "20px";
        div.style.width = "200px";
        div.style.height = "50px";
        div.style.border = "1px solid #000";
        document.body.appendChild(div);
    }
    document.getElementById("button").addEventListener("click", create);
</script>
</body>
</html>



Вопрос:
как сделать функцию newPosition() внутри функции create(), чтобы код приобрел более аккуратный вид?

PashPP 26.08.2012 14:50

как вариант добавить
div.className = 'myDiv'

и стиль
div.style.left = "20px";
div.style.width = "200px";
div.style.height = "50px";
div.style.border = "1px solid #000";

Вынести в цсс.

ну и.

function create() {
gfunc += 70;
var div = document.createElement("div");
div.className = 'myDiv'
div.style.top = gfunc + 'px';
document.body.appendChild(div);
}

Зачем для одного счетчика целую функцию объявлять?

dmitry111 26.08.2012 15:31

Maxmaxmахimus,

имел в виду в том числе глобальную переменную :)

PashPP,

у меня ваш вариант не работает, если не трудно выложите в run - виде, можно без css и классов

dmitry111 26.08.2012 15:44

Maxmaxmахimus,

все равно, слишком сложное написание, для функции, которая выполняет простейшее действие (
ладно, будем думать сами, как надумаем, выложим :)

PashPP 26.08.2012 16:05

dmitry111,
Все там работает. Наверно, ты не перенес обьявление var gfunc просто со своего варианта.
PS. А как тут вылаживать в run - виде?

<!DOCTYPE html>
<style>
.myDiv {
   position: absolute;
   left: 20px;
   width: 200px;
   height: 500px;
   border: 1px solid #000;
}
</style>
<body>
</body>
<script type="text/javascript">
var gfunc = 20;
function create() {
 gfunc += 70;
 var div = document.createElement("div");
 div.className = 'myDiv'
 div.style.top = gfunc + 'px';
 document.body.appendChild(div);
}
create()
create()
create()
</script>

dmitry111 26.08.2012 16:11

PashPP,

работает, только вот, как и у Maxmaxmахimus, имеется глобальная переменная, использовать которую для простейшей функции нецелесообразно

lord2kim 26.08.2012 16:22

dmitry111,
div.style.top = parseInt(document.getElementsByTagName("div")[document.getElementsByTagName("div").length - 1].style.top) + 70 + "px";

bes 26.08.2012 16:28

Что ж не работает-то
<button id="button">создать новый элемент</button>
<script>
window.onload = function () {
    var gfunc = 20;//уже не глобальная

    function create() {
		gfunc += 70;
        var  div = document.createElement("div");
        div.style.position = "absolute";
        div.style.top =  gfunc + 'px';
        div.style.left = "20px";
        div.style.width = "200px";
        div.style.height = "50px";
        div.style.border = "1px solid #000";
        document.body.appendChild(div);
    }
    document.getElementById("button").addEventListener("click", create);
}
</script>

bes 26.08.2012 16:41

PashPP, [html run]

dmitry111 26.08.2012 16:49

lord2kim,

гениально! Этот подход мне нравится!

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

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>выпвып</title>
</head>

<body>
<button id="button">создать новый элемент</button>
<script>

    function create() {
        function size() {
            var sss = document.getElementsByTagName("div")[0];
            if (sss) {
            var rrr = parseInt(document.getElementsByTagName("div")[document.getElementsByTagName("div").length - 1].style.top) + 70 + "px";
            return rrr;
            }
            else {
                return "50px";
            }
        }

        var  div = document.createElement("div");
        div.style.position = "absolute";
        //div.style.top = newPosition();
        div.style.left = "20px";
        div.style.top =  size();
        div.style.width = "200px";
        div.style.height = "50px";
        div.style.border = "1px solid #000";
        document.body.appendChild(div);
    }
    document.getElementById("button").addEventListener("click", create);
</script>
</body>
</html>

dmitry111 26.08.2012 16:53

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 200602)
это называется обертка анонимной функцией

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

bes 26.08.2012 16:57

только там требуется больше вычислений и в применении к другим ситуациям всё рушится, когда нет явного задания style.top (или в атрибуте style)
а также уже наверное в курсе, что addEventListener - не кроссбраузерная

lord2kim 26.08.2012 17:08

Цитата:

Сообщение от bes (Сообщение 200609)
только там требуется больше вычислений и в применении к другим ситуациям всё рушится, когда нет явного задания style.top (или в атрибуте style)
а также уже наверное в курсе, что addEventListener - не кроссбраузерная

у него рассматривается конкретный случай и задается top через JS, т.ч. подходит норм...
кст если через тег или атрибут style задавать, то вроде он не считывается в большинстве браузеров...

dmitry111 26.08.2012 17:13

bes,
согласен, больше вычислений. Но зато все действия не выходят за рамки одной функции, а это помогает не затеряться в большом скрипте программисту.
Возможно существуют более простые подходы, однако мой уровень знаний js не позволяет тут их продемонстрировать.
Про addEventListener, да, знаю.. Просто удобно использовать :)


Maxmaxmахimus,
я пока еще не понимаю что такое ООП, но для простых задач я думаю его использовать не следует.
Все гениальное просто :)

bes 26.08.2012 17:20

Цитата:

Сообщение от lord2kim
у него рассматривается конкретный случай и задается top через JS, т.ч. подходит норм...

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

Цитата:

Сообщение от lord2kim
кст если через тег или атрибут style задавать, то вроде он не считывается в большинстве браузеров...

атрибут style завязан на объект style, а то, что задаётся в тегах <style> нет
<style>
button {
	height: 50px;
}
</style>

<button style="width: 50px">click</button>

<script>
document.body.children[0].onclick = function () {
	alert(this.style.width +'; ' + this.style.height)
}
</script>

dmitry111 26.08.2012 17:39

Цитата:

Сообщение от bes (Сообщение 200614)
тем более, смысл для частного случая получать каждый раз коллекцию document.getElementsByTagName и вычислять её length

[/html]

можно придумать эту функцию с id. Где вместе с значением для top, функция будет генерировать id. #id1, #id2, #id3.....

Однако, конкретно в моем случае, не вижу этой необходимости, так как коллекция собирается по требованию пользователя и функция не будет использоваться часто..

lord2kim 26.08.2012 17:46

Цитата:

Сообщение от bes (Сообщение 200614)
<style>
button {
	height: 50px;
}
</style>

<button style="width: 50px">click</button>

<script>
document.body.children[0].onclick = function () {
	alert(this.style.width +'; ' + this.style.height)
}
</script>

достаточно добавить кавычки к значению (style = "width: '50px'"), как обычно делается, и усе...

bes 26.08.2012 18:30

Цитата:

Сообщение от lord2kim
достаточно добавить кавычки к значению (style = "width: '50px'"), как обычно делается, и усе...

чёт я первый раз вижу, что так обычно делают

<button style="background: 'green'">click</button>

И где же цвет?

PashPP 26.08.2012 19:53

Цитата:

Сообщение от Maxmaxmахimus
ты определись простой у тебя скрипт или сложлный

Я думаю, что он просто пытается выполнить задачи ООП без инструментов ООП.

lord2kim 26.08.2012 19:57

Цитата:

Сообщение от bes (Сообщение 200629)
чёт я первый раз вижу, что так обычно делают

<button style="background: 'green'">click</button>

И где же цвет?

хм...харошо...уговорил)


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