Jump to content
  • 0

Вместо innerText - undefined


hummermania
 Share

Question

Есть див, при кликаньи на который зовется функция

<div onclick="RClick(this.innerText)" >text</div>

- и по идее в параметре будет содержаться text. Потом в ф-ции

function RClick(str)
{ window.document.getElementById('q').value=str; }

- где элемент с ИД = q - обычное текстовое поле, вот и получается что при кликаньи на див в поле должен установиться текст. А там устанавливается undefined. по крайней мере в FF так.

Link to comment
Share on other sites

Recommended Posts

  • 0

Заменил как подсказали - ощущение что вообще не срабатывает событие онклик. Я суть идеи понял, передаем полностью ИннерХТМЛ а потом вырезаем тэги, оставляя сам текст. Может дело в том что эти дивы генерятся автоматически тоже из скрипта. Но в принципе разницы же быть не должно ? Див если присутствует в дереве обьектов - то я для него должны работать события. А так получается что даже онклик не срабатывает или внутри RClick прерывается выполнение с ошибкой.

Link to comment
Share on other sites

  • 0
Заменил как подсказали - ощущение что вообще не срабатывает событие онклик. ... Может дело в том что эти дивы генерятся автоматически тоже из скрипта. Но в принципе разницы же быть не должно ? Див если присутствует в дереве обьектов - то для него должны работать события. А так получается что даже онклик не срабатывает или внутри RClick прерывается выполнение с ошибкой.

Когда генеряться дивы надо на них навешивать события через [Element].addEventListener(); [Element].attachEvent();, незабыв внести дивы в дерево document.appendChild([Element]); Насколько я помню [Element].setAttribute("onclick", "foo()"); не прокатывает (ибо не для того предназначено)

Link to comment
Share on other sites

  • 0
если они генеряться в коде, то кроссбраузерно будет:

div.onclick = function() {RClick(this.innerHTML);}

что-то не наравиться мне этот код. когда-то на форуме поднималась тема утечек памяти в IE, но сейчас что-то не нашел, потому привожу другие ссылки:

http://webo.in/articles/habrahabr/18-solvi...r-memory-leaks/

http://www.bazon.net/mishoo/articles.epl?art_id=824

и тестовый код (7-10 кликов для статистики)

<a href="java script:start()">start</a>
<script language="javascript" type="text/javascript">
function createDivs(i) {
var div = document.createElement('div');
div.className = "div";
div.innerHTML = "Это DIV ?"+i;
div.onclick = function() {RClick(this.innerHTML);}
document.body.appendChild(div);
}

function RClick(innerHtml) {
alert (innerHtml);
}

function start() {
var T1 = (new Date()).getTime(); // DEBUG.PROFILE
for (var i = 0; i < 5000; ++i)
createDivs(i);
alert(((new Date()).getTime() - T1) / 1000 + ' sec'); // DEBUG.PROFILE
}
</script>

"лучший вариант"

<a href="java script:start()">start</a>
<script language="javascript" type="text/javascript">
function createDivs(i) {
var div = document.createElement('div');
div.className = "div";
div.innerHTML = "Это DIV ?"+i;
div.onclick = RClick;
document.body.appendChild(div);
}

function RClick() {
alert (this.innerHTML);
}

function start() {
var T1 = (new Date()).getTime(); // DEBUG.PROFILE
for (var i = 0; i < 5000; ++i)
createDivs(i);
alert(((new Date()).getTime() - T1) / 1000 + ' sec'); // DEBUG.PROFILE
}
</script>

Потому как [Element].addEventListener(); [Element].attachEvent(); не работает в старых браузерах...

Это в каких, позвольте спросить?

Кроме того минус [Element].onclick = foo; состоит в том, что таким способом на [Element] можно повесить только один обработчик, а способом [Element].addEventListener() несколько и совершенно в разных местах кода и при разном необходимом окружении. ИМХО, изощрения типа [Element].onclick = function () {foo(); hoo(); bla();} не оцениваю в принципе.

Link to comment
Share on other sites

  • 0

Дело в том, что я работаю для всех (и для т?теньки-бухгалтера, сидящей на win98), а не только для продвинутых пользователей. Так что и о них тоже кто-нибудь должен подумать. Особенно, если ты занимаешься коммерческими проектами...

Link to comment
Share on other sites

  • 0

addEventListener()

В броузерах, поддерживающих модель событий W3C, происходит внутреннее преобразование методов привязывания событий - например обработчиков событий атрибутов - в при?мники событий.
Чтобы сообщить объектной модели документа, что элемент должен принимать определ?нный тип события, необходимо воспользоваться методом addEventListener.

!!!!!!!!!!!!
Использование метода addEventListener требует, чтобы объект, к которому присоедин?н метод, уже существовал.
!!!!!!!!!!!!

Пример:

document.getElementById(elemID).addEventListener("click", reportEvent, false)

Возвращаемое значение
Отсутствует

Параметры
типCобытия - строка с типом события, который должен приниматься элементом (без перфикса on).

функцияПолучателяСобытия - ссылка на функцию JavaScript. Название не должно помещаться в кавычки, в вызове функции нельзя указывать параметры

захват - если равно true, то захват определ?нного типа события разреш?н всякий раз, когда текущий объект является целевым. Это значит, что событие любого другого типа, целью которого является текущий объект, переместится по иерархии, если только оно также не имеет при?мника события, связанного с объектом, третий параметр которого установлен в значение true

Так вот не всегда есть возможность навесить функцию на элемент после его внесения в дерево документа...

И во вторых - в вызове нельзя указывать параметры!

И как мне сделать так ?:

var k=1;

for (var i=0; i

var div = document.createElement('div');

document.getElementById('111').appendChild(div);

div.onclick = function() {DoSomething(i,k)};

}

k=2

for (var i=0; i

var div = document.createElement('div');

document.getElementById('222').appendChild(div);

div.onclick = function() {DoSomething(i,k)};

}

Link to comment
Share on other sites

  • 0

ZoNT

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

Отказ от DOM и наличие требования поддерживать антикварные браузеры обходится куда дороже, нежели потеря 0.5%-1% подобных пользователей.

Link to comment
Share on other sites

  • 0
Использование метода addEventListener требует, чтобы объект, к которому присоедин?н метод, уже существовал.

Так вот не всегда есть возможность навесить функцию на элемент после его внесения в дерево документа...

И во вторых - в вызове нельзя указывать параметры!

Да неужели!!!

function createDivs1(i) {
var div = document.createElement('div');
div.className = "div";
div.innerHTML = "Это DIV ?"+i;
if (document.addEventListener)
div.addEventListener('click', function(e){RClick(e.target,i,-1)}, true);
else div.attachEvent('onclick', function(e){RClick(e.srcElement,i,-1)});
document.body.appendChild(div);
}

function start1() {
for (var i = 0; i < 10; ++i) createDivs1(i);
}

function RClick(e,i,k) {
alert ([e.innerHTML, i, k]);
}
start1();

Link to comment
Share on other sites

  • 0
Это стандарт. И там понятно написано - без параметров...

ок. понятие анонимной функции о чем-либо Вам говорит?

если нет тогда возможно недопонимание в нашем разговоре разрешит следующий код:

var foo = function(e){RClick(e.target,i,-1)};
div.addEventListener('click', foo, true);

теперь по стандарту? ;)

З.Ы. прчем хотелось бы отметить оба примера рабочие ;) разве что в Opera не проверял

Link to comment
Share on other sites

  • 0

Стоп! Стоп ребята. И как всегда бывает на форумах - начали про Ивана... Идея изначально вообще. В ггугле видели при наборе слова выпадает панелька? И показывает сколько результатов по тем словам которые начинаются на введенную фразу. Теперь сам вопрос. На сайте есть скрипт который создает обьект XMLHttpRequest, все как полагается и для IE и для FF, Safari - неважно - работает отлично. Потом при нажатии на кнопу в текстовом поле - его содержание передается в скрипт на php к примеру qr.php?q=текст - этот введенный текст принимается скриптом, и дается запрос к базе в виде '... WHERE ... LIKE "'.$q.'%"' в итоге скрипт возвращает два столбца. В одном список слов которые начинаются на фразу введенную в поле поиска, а второй вспомогательная инфа. Но не просто возвращает а форматирует ответ в виде:

while($arr=mysql_fetch_assoc($res))

{

$result.='

'.$arr['field1'].'

'.$arr['fiqld2'].'

';

}

Я изначально навешивал события на оба дива, onmouseover и onmouseout - все работало! Там менялся тока стиль и цвет бакграунда. И теперь надо бы сделать чтобы при клике на один из дивов (на первый) он брал значение внутри него '.$arr['field1'].' - и передавал в текстовое поле. Но получается что когда я пишу в обьявлении первого дива онклик=RClick(this.innerText) - она не передает в текстовое поле этот текст, т.е. слово из списка.

Все эти дивы накапливаются в одной переменной на пхп и вся структура тупо встраивается в див ИД = content уже на хтмл страничке - ...getElementById('content').innerHTML=http_request.responseText;

И появляется выпадающее меню, похожее на менюшку автозаполнения форм на страничках.

Но вот этот онклик РАБОТАЕТ в ИЕ, но не работает в мозилла... разве ИннерТекст может возвращать разные значниея если по идее это лишь текст который между тэгами, внутри тэга точнее.?

Link to comment
Share on other sites

  • 0

Вот сайт - http://business-pmr.com/?cat=3&tt=4 там текстовое поле посреди. При вводе - выпадает серия дивов, и вот не могу сделат чтобы кроссбраузерно регаировала на нажатие на выбранную строку и передавало слово в поле поиска.

Link to comment
Share on other sites

  • 0

ньдя....

а там еще один неопределнный глюк, и работает не всегда

я бы даже сказал вообще не работатет...

и как же Вам помочь, уважаемый? ;)

может сначала решить вопрос кодировки? хотя не берусь утверждать - это как тыкать пальцем в монитор без исходников

имхо я бы сделал так AJAX(запрос)->PHP->XML(результат)->AJAX->JavaScript->DOMElement

Но получается что когда я пишу в обьявлении первого дива онклик=RClick(this.innerText) - она не передает в текстовое поле этот текст, т.е. слово из списка. ....

Но вот этот онклик РАБОТАЕТ в ИЕ, но не работает в мозилла... разве ИннерТекст может возвращать разные значниея если по идее это лишь текст который между тэгами, внутри тэга точнее.?

в посте http://forum.htmlbook.ru/viewtopic.php?pid=52961#p52961 от Mordraug ясно сказано что "онклик=RClick(this.innerText)" в браузерах на Gecko работать не будет, а вот "онклик=RClick(this.innerHTML)" будет и в IE и в Mozille (имеется в виду "работа" [Element].innerHTML)

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