Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена функции в аттрибуте onclick 
:(
    Опции темы
Aliance
Дата 27.5.2009, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



меня есть несколько картинок, к которым применяется inline назначение события click:
Код

( цикл )
{
    <img id="button-<?php print( $k ); ?>" src="/img/expand.gif" onclick="toggleAJAXTree( <?php print( $k . ', ' . $id ); ?> );" />
}


При чем назначать события можно только через nline обработчики, т.е. заменить это нельзя.
Я хочу по клику на картинке вызвать функцию toggleAJAXTree, которая бы после своей отработки, заменяла inline обработчки на вызвавшей ее картинки на другую функцию. Написал такой код:
Код

function toggleAJAXTree( id, type_id )
{
    // какие-то действия

    alert( $( '#button-' + id ).attr( 'onclick' ) ); // старый onclick
    $( '#button-' + id ).attr( 'onclick', 'toggleTree( ' + id + ' );' );
    alert( $( '#button-' + id ).attr( 'onclick' ) ); // новый, все верно
}


Но при этом код не отрабатывает. Т.е. при повторном клике вызывается старая функция. Протестировано в FF.

У кого-то есть идеи как сделать то, что я хочу.

P.S. unbind не предлагать, т.к. обработчики должны назначаться именно inline
PM MAIL WWW ICQ Skype   Вверх
Soah
Дата 28.5.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: нет
Всего: 54



Aliance, видимо проблема в отработке метода attr() в FF
Код

<script type="text/javascript">
    function toggleAJAXTree(id) {
        alert(document.getElementById('button-'+id).onclick);
        document.getElementById('button-'+id).setAttribute("onclick", "toggleTree('" +id + "');");
        alert(document.getElementById('button-'+id).onclick);
        alert(document.getElementById('button-'+id).getAttribute('onclick'));

        //alert( $( '#button-' + id ).attr( 'onclick' ) ); // старый onclick
        //$( '#button-' + id ).attr( 'onclick', 'toggleTree( "' + id + '" );' );
        //alert( $( '#button-' + id ).attr( 'onclick' ) ); // новый, все верно
    }
    
    function toggleTree(id) {
        alert(id);
    }
</script>

<img id="button-foo" alt="" src="blackjack.jpg" onclick="toggleAJAXTree('foo')" />
<br />
<input type="button" value="click" onclick="alert(document.getElementById('button-foo').onclick);" />

?


В опере работают оба варианта.
PM MAIL   Вверх
youri
Дата 28.5.2009, 07:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



Цитата(Aliance @  27.5.2009,  10:04 Найти цитируемый пост)
Но при этом код не отрабатывает. Т.е. при повторном клике вызывается старая функция. Протестировано в FF.

потому что jQuery в данном случае использует elem[ name ] = value, а не setAttribute

Это сообщение отредактировал(а) youri - 28.5.2009, 07:02
PM   Вверх
ksnk
Дата 28.5.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 38
Всего: 386



У вас неправильные пчелы, они дают неправильный мед
Код

<script type="text/javascript">
    function toggleAJAXTree(id) {
        $('#button-'+id)[0].onclick=function(){toggleTree(id)};
    }
    
    function toggleTree(id) {
        alert(id);
    }
</script>
<img id="button-foo" alt="" src="blackjack.jpg" onclick="toggleAJAXTree('foo')" />
<img id="button-bar" alt="" src="blackjack.jpg" onclick="toggleAJAXTree('bar')" />



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 28.5.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



ksnk, такой вариант работает, но такой пробовал и я. Мне интересно почему jQuery-вский вариант не отрабатывает.

youri, поясни? В другой практически аналогичном случае точно такой же код работает на ура.

Soah, дело в том, что алертится то, что нужно. Но вызывается не то + если посмотреть код выделенного фрагмента, то видно, что ничего не изменено.
PM MAIL WWW ICQ Skype   Вверх
youri
Дата 28.5.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: нет
Всего: 16



я просто посмотрел, что там происходит в jQuery. Там происходит примерно следующее (наверное, подразумевается, что обработчики должны с помощью других функций назначаться):
Код

document.getElementById('#button-' + id).onclick = 'toggleTree( ' + id + ' );';

у меня это строка 998 (jquery-1.3.2): elem[ name ] = value;
но ведь value в таком случае дожно быть функцией, а не строкой
если же использовать setAttribute, то value должно быть строкой, но тогда в ie не будет работать - http://xpoint.ru/know-how/JavaScript/Atributyi?8
PM   Вверх
Soah
Дата 28.5.2009, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: нет
Всего: 54



Цитата(Aliance @  28.5.2009,  13:58 Найти цитируемый пост)
 Но вызывается не то

Aliance, а что у тебя алертится?

первый клик
Цитата

// alert(document.getElementById('button-'+id).onclick)
function onclick(event) { 
    toggleAJAXTree("foo"); 
}

// alert(document.getElementById('button-'+id).onclick)
function onclick(event) { 
    toggleAJAXTree("foo"); 
}

// alert(document.getElementById('button-'+id).getAttribute('onclick'))
toggleAJAXTree('foo')



второй клик
Цитата

// alert(id)
foo


FF 2
PM MAIL   Вверх
Aliance
Дата 30.5.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



Думаю воспользоваться этим, из статьи:
Код

document.body.setAttribute("class", "attribute-test");
if (document.body.className == "attribute-test")
{
  // Атрибуты работают корректно (не Internet Explorer или будущая исправленная версия)

  // Работаем с атрибутами
}
else
{
  // Использовать атрибуты нельзя (Internet Explorer)

  // Альтернативный код только для Internet Explorer
}

PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.