2013-05-03 3 views
0

У меня есть таблица, в каждой строке (тэг tr) установлены три события: onclick, onmouseout и onmouseover. Для каждой строки первые три тега td содержат событие onclick.События Javascript и странное поведение после процесса удаления

<tr onclick="javascript:getWSData(...)" onmouseout="this.className=clTwo" onmouseover="this.className=clThree"> 
    <td onclick="popDivInfo(false, verRicDivCreaInfo('details'))"> 
     Details 
    </td> 
    <td onclick="popDivInfo(false, verRicDivCreaInfo('edit'))"> 
     Edit 
    </td> 
    <td onclick="if(confirm('Are you sure?')) {getWSData('delete');event.stopPropagation(); } else {alert('Cancelled!')}"> 
     Delete 
    </td> 
    <td>...</td> 
    <td>...</td> 
    <td>...</td> 
</tr> 

Насколько я знаю: как только td «s onclick запускается цепь событий по умолчанию должен выполнить его на первый, а затем следует выполнить tr» s onclick. И это нормально для меня. Но, в случае удаления (третий td), я не хочу, чтобы цепочка событий шла вперед, поэтому я использовал event.stopPropagation();

Стандартное поведение вполне корректно, но я получил одну единственную проблему: как только удаление происходит либо Подробности либо Edittd перестанет работать. Первый щелчок (после удаления) не работает в лучшем виде (я не полностью понимаю, что происходит), а удаление все еще работает. Когда я нажимаю второй раз, оба td onclick (Подробности & Edit) снова работают.

несколько вещей:

  • поведения совершенно правильно перед удалением
  • Каждого удаления действия удалить его tr с помощью JQuery remove метода (ничего не случится, если я комментирую эту инструкцию)
  • Когда этот вопрос Это происходит во всех столбцах (Подробности и Редактирование)
  • Проблема не возникает, если я не подтверждаю процесс удаления
  • OnClick tr «s всегда полностью работает
  • Первый щелчок (после удаления) на Подробность или Edit действительно частично начать яваскрипт действия (вызвать предзагрузку запущена), но это действие не завершено.
  • Даже если действие тд не завершено, tr действие всегда выполняется, так что не unusefull stopPropagation()

Есть идеи? У меня вообще нет идей.

+0

Вы уверены, что не устанавливаете event.stopPropagation() для всех событий? –

+0

Я не делаю этого явно, мой страх в том, что он неявно настроен чем-то другим. –

+0

Ваш пример отлично подходит для меня, см. [JsFiddle] (http://jsfiddle.net/dmalinovsky/H3dP7/). Вы должны делать что-то еще в другом коде. –

ответ

1

Как я помню tr что-то вроде виртуальной разметки. Это относится только к элементам группы, например, tbody. Он не принимает участия в пузырях событий вообще. Поэтому вы не должны привязывать к нему какие-либо события. Мы можем видеть это в примере: http://jsfiddle.net/z9vVM/. Здесь вы видите, что событие, связанное с элементом tr, имеет цель td в любом случае, а не tr по желанию. Событие привязки к tr - это то же самое, что вы даете все td в этой строке некоторый класс и событие привязки к этим классам - tr - это только способ группировки элементов. Вот почему ваш stopPropagation не работает. Нет никакой пропаганды вообще.

Способ, которым вы можете работать все это - манипулирует с помощью классов.Взгляните на этот пример: http://jsfiddle.net/RZscw/1/

Смежные вопросы