Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   при нажатии на <a.. потеряется (https://javascript.ru/forum/misc/29834-pri-nazhatii-na-poteryaetsya.html)

f-mobile 13.07.2012 09:56

при нажатии на <a.. потеряется
 
Здравствуйте.Подскажите, пожалуйста
здесь все отлично работает, но сам тега <a> id name lastname vozrastпотеряется
<script type="text/javascript">

var user = [[1,'name1', 'lastname1', 'vozrast1'],[2, 'name2', 'lastname2', 'vozrast2'],[3, 'name3', 'lastname3', 'vozrast3']];
function fff(i){


function sName(a, b) {
if (a[i] > b[i]) return 1;
else if (a[i] < b[i]) return -1;
else return 0;

}user.sort(sName);

document.write(user[0]+"<br>"+user[1]+"<br>"+user[2]);
reset;
}
</script>

<a href="#" onClick="fff(0)">id</a>
<a href="#" onClick="fff(1)">name</a>
<a href="#" onClick="fff(2)">lastname</a>
<a href="#" onClick="fff(3)">vozrast</a>

lord2kim 13.07.2012 10:07

Цитата:

Сообщение от f-mobile (Сообщение 188470)
Здравствуйте.Подскажите, пожалуйста
здесь все отлично работает, но сам тега <a> id name lastname vozrastпотеряется
<script type="text/javascript">

var user = [[1,'name1', 'lastname1', 'vozrast1'],[2, 'name2', 'lastname2', 'vozrast2'],[3, 'name3', 'lastname3', 'vozrast3']];
function fff(i){


function sName(a, b) {
if (a[i] > b[i]) return 1;
else if (a[i] < b[i]) return -1;
else return 0;

}user.sort(sName);

document.write(user[0]+"<br>"+user[1]+"<br>"+user[2]);
reset;
}
</script>

<a href="#" onClick="fff(0)">id</a>
<a href="#" onClick="fff(1)">name</a>
<a href="#" onClick="fff(2)">lastname</a>
<a href="#" onClick="fff(3)">vozrast</a>

задача не ясна, что значит "но сам тега <a> id name lastname vozrastпотеряется"
ааа...понял...ну метод write полностью переписывает содержимое страницы, используйте методы DOM или innerHTML какого-нибудь тега (например, span или div)
и что такое reset; в функции fff() ?

f-mobile 13.07.2012 10:28

reset это пи нажатии id или name .. сортируется список и снова показывает. я думал нужна [i]reset[/I
если вам нетрудно напишите как менять write на innerHTML

vadim5june 13.07.2012 11:16

Цитата:

Сообщение от f-mobile (Сообщение 188477)
если вам нетрудно напишите как менять write на innerHTML

document.body.innerHTML+=user[0]+"<br>"+user[1]+"<br>"+user[2];

но лучше с помощью appendChild

oneguy 13.07.2012 11:52

Цитата:

Сообщение от vadim5june
document.body.innerHTML+=user[0]+"<br>"+user[1]+"<br>"+user[2];

Так писать обычно не очень хорошо с точки зрания быстродействия, так как эта инструкция считывает всё содержимое <body> и записывает его снова. Лучше для этого использовать appendChild.

bes 13.07.2012 13:08

И дело не только в этом, в примере ниже обработчик кнопки сработает только один раз (как объяснить этот эффект, сам хотел бы узнать)
<body>
<button id="button">click</button><br>
<script>
document.body.onclick = function () {
  this.innerHTML += 'text<br>'
}
document.getElementById('button').onclick = function () {
  alert('click')
}
</script>
</body>

lord2kim 13.07.2012 13:19

Цитата:

Сообщение от bes (Сообщение 188504)
И дело не только в этом, в примере ниже обработчик кнопки сработает только один раз (как объяснить этот эффект, сам хотел бы узнать)
<body>
<button id="button">click</button><br>
<script>
document.body.onclick = function () {
  this.innerHTML += 'text<br>'
}
document.getElementById('button').onclick = function () {
  alert('click')
}
</script>
</body>

а так и не нужно делать) для подобных целей придумали div и span)))

vadim5june 13.07.2012 13:25

Цитата:

Сообщение от bes (Сообщение 188504)
И дело не только в этом, в примере ниже обработчик кнопки сработает только один раз (как объяснить этот эффект, сам хотел бы узнать)

Да вобщем то innerHTML+ это зло -можно использовать только в самых простых случаях и если нет событий
строка document.body.innerHTML+='tratata';
выполняется как document.body.innerHTML='tratata'+document.body.in nerHTML;
то есть вся страница (body) формируется снова-а так как справа в document.body.innerHTML события не входят то они теряются
а если бы Вы написали
<button onclick=alert(3)></button>

то сохранилось бы

bes 13.07.2012 13:35

Цитата:

Сообщение от lord2kim
а так и не нужно делать) для подобных целей придумали div и span)))

Хотелось бы понимать, как это работает: скрипт на странице остается, обработчик onclick у body остаётся и работает, обработчик onclick у кнопки остаётся и не работает (но если задать через атрибут onclick, то будет работать)

Цитата:

Сообщение от vadim5june
document.body.innerHTML события не входят то они теряются

как понимать "не входят"

Цитата:

Сообщение от vadim5june
document.body.innerHTML='tratata'+document.body.in nerHTML

'tratata' справа от +

vadim5june 13.07.2012 13:42

Цитата:

Сообщение от bes (Сообщение 188509)
как понимать "не входят"

в innerHTML входит все что видно нам по alert(document.body.innerHTML)
таким образом все обработчики которые мы сделали скриптами там не видны и не войдут в страницу когда мы будем использовать innerHTML+ а войдут только те обработчики которые мы написали на странице
<button onclick=...
----
'tratata' справа от +
да

bes 13.07.2012 13:53

Цитата:

Сообщение от vadim5june
в innerHTML входит все что видно нам по alert(document.body.innerHTML)
таким образом все обработчики которые мы сделали скриптами там не видны и не войдут в страницу когда мы будем использовать innerHTML+ а войдут только те обработчики которые мы написали на странице

Вот это совсем не понял, все обработчики как раз входят в исходный текст страницы (если бы не входили, не сработал бы обработчик клика у самого body, а он срабатывает)

<body>
<button id="button">click</button><br>
<script>
document.body.onclick = function () {
  document.body.innerHTML +=  'text<br>';
  alert(document.body.innerHTML);
}
document.getElementById('button').onclick = function () {
  alert('click')
}
</script>
</body>

oneguy 13.07.2012 14:00

Цитата:

Сообщение от vadim5june
но лучше с помощью appendChild

Написал свой код, используя documentFragment - может быть, поможет.
<!DOCTYPE html>

<html><head><title></title></head><body>

<script type="text/javascript">
var user = [[1,'name1', 'lastname1', 'vozrast1'],[2, 'name2', 'lastname2', 'vozrast2'],[3, 'name3', 'lastname3', 'vozrast3']];
var frag=document.createDocumentFragment(), cns=frag.childNodes;
for (var i=0; i<user.length; i++) {
  frag.appendChild(document.createTextNode(""));
  frag.appendChild(document.createElement("br"));
}
function fff(i) {
  function sName(a, b) {
    if (a[i] > b[i]) return 1;
    else if (a[i] < b[i]) return -1;
    else return 0;
  }
  user.sort(sName);
  for (i=0; i<user.length; i++)
    cns[2*i].textContent=user[i];
  document.getElementById("result").appendChild(frag.cloneNode(true));
}
</script>
<a href="#" onClick="fff(0)">id</a>
<a href="#" onClick="fff(1)">name</a>
<a href="#" onClick="fff(2)">lastname</a>
<a href="#" onClick="fff(3)">vozrast</a>
<div id="result"></div>

</body></html>

vadim5june 13.07.2012 14:14

Цитата:

Сообщение от bes (Сообщение 188512)
Вот это совсем не понял, все обработчики как раз входят в исходный текст страницы (если бы не входили, не сработал бы обработчик клика у самого body, а он срабатывает)

Я так это понимаю
когда выполнился первый раз скрипт то у нас появилось два обработчика на элементах body и button
эти обработчики не здесь на странице располагаются а записываются во внутренние таблицы интерпретатора javascript
когда мы выполняем команду innerHTML+ то элемент body не трогаем так как только внутри меняем а элемент button заменяем на новый но при этом указатель обработчика указывает на старый button(который у нас удалился) и не срабатывает
но еще мы перезаписываем снова тот же скрипт-но он не выполняется-поэтому события не перепишутся

bes 13.07.2012 14:45

Да, это наверное может объяснить ситуацию: при изменении содержимого body всё, что в тегах <script></script> внутри этого body заново не анализируется.
Решением может стать переназначение обработчиков (ну или как уже сказали не стоит это вообще использовать).

<body>
<button id="button">click</button><br>
<script>
document.body.onclick = function () {
  document.body.innerHTML +=  'text<br>';
  document.getElementById('button').onclick = function () {
   alert('click')
  }
}
document.getElementById('button').onclick = function () {
  alert('click')
}
</script>
</body>

vadim5june 13.07.2012 15:25

Цитата:

Сообщение от oneguy (Сообщение 188514)
Написал свой код, используя documentFragment - может быть, поможет.

Да это правильный подход я считаю
inerrHTML+ лучше не использовать

f-mobile 14.07.2012 20:25

Цитата:

Сообщение от vadim5june (Сообщение 188487)
document.body.innerHTML+=user[0]+"<br>"+user[1]+"<br>"+user[2];

но лучше с помощью appendChild

с этом document.body.innerHTML+=user[0]+"<br>"+user[1]+"<br>"+user[2];нормально работает, но каждый раз нажатие кнопки еще +добавляется user[0]+"<br>"+user[1]+"<br>"+user[2]. значить reset; неправильно подставил?, место его чего использовать можно?

vadim5june 14.07.2012 20:30

попробуй так после
<a href="#" onClick="fff(3)">vozrast</a>
добавь
<div id="d1"></div>
и в скрипте
document.getElementById('d1').innerHTML=user[0]+"<br>"+user[1]+"<br>"+user[2];

f-mobile 14.07.2012 21:03

пробовал не получается
<div id="d1">
<a href="#" onClick="fff(0)">id</a>
<a href="#" onClick="fff(1)">name</a>
<a href="#" onClick="fff(2)">lastname</a>
<a href="#" onClick="fff(3)">vozrast</a>
</div>

<script type="text/javascript">

var user = [[1,'name1', 'lastname1', 'vozrast1'],[2, 'name2', 'lastname2', 'vozrast2'],[3, 'name3', 'lastname3', 'vozrast3']];
function fff(i){

function sName(a, b) {
if (a[i] > b[i]) return 1;
else if (a[i] < b[i]) return -1;
else return 0;
}user.sort(sName);
document.getElementById('d1').innerHTML+=user[0]+"<br>"+user[1]+"br>"+user[2];
reset;
}
</script>

vadim5june 14.07.2012 21:08

Цитата:

Сообщение от f-mobile (Сообщение 188887)
пробовал не получается
<div id="d1">
<a href="#" onClick="fff(0)">id</a>

надо так
<div id="d1"></div>
<a href="#" onClick="fff(0)">id</a>

f-mobile 14.07.2012 21:13

так и не получилось

vadim5june 14.07.2012 21:17

попробуй вариант onegue
http://javascript.ru/forum/showthrea...889#post188514

vadim5june 14.07.2012 21:33

Цитата:

Сообщение от f-mobile (Сообщение 188887)
пробовал не получается

document.getElementById('d1').innerHTML+=user[0]+"<br>"+user[1]+"br>"+user[2];
reset;
}

а reset это что?ошибка наверно
тут одной скобки не хватает нужно так
document.getElementById('d1').innerHTML+=user[0]+"<br>"+user[1]+"<br>"+user[2];


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