2016-04-21 96 views
0

根據jQuery文檔,event.stopPropagation();應該停止事件冒泡。在下面的腳本中,當我刪除event.stopPropagation();時,該函數將刪除ul元素代碼塊,包括它的所有子代。我加event.stopPropagation();停止冒泡,但它返回以下錯誤:如何在刪除元素時防止冒泡的jQuery事件?

TypeError: undefined is not an object (evaluating 'event.stopPropagation')

以下是HTML和jQuery代碼:

$('span.remove').on('click', function() { 
 
    $(this).parent().hide(500, function(event) { 
 
    event.stopPropagation(); 
 
    $(this).parent().remove(); 
 
    }); 
 
});
.todo-list { 
 
    list-style: none; 
 
    padding: 0px; 
 
} 
 
.todo-item { 
 

 
    border: 2px solid #444; 
 
    margin-top: -2px; 
 
    padding: 10px; 
 
    cursor: pointer; 
 
    display: block; 
 
    background-color: #ffffff; 
 

 
} 
 
.remove { 
 
    float: right; 
 
    font-family: Helvetica, Arial, sans-serif; 
 
    font-size: 0.8em; 
 
    color: #dd0000; 
 
} 
 
.remove:before { 
 
    content: 'X'; 
 
} 
 
.remove:hover { 
 
    color: #ffffff; 
 
} 
 
.todo-item::after:hover { 
 
    background-color: #dd0000; 
 
    color: white; 
 
} 
 
.todo-item:hover { 
 
    background-color: #0EB0FF; 
 
    color: white; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class='todo-list'> 
 
    <li class='todo-item'>4L 2% Milk 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Butter, Unsalted 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Dozen Eggs 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Walk the dog 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Cut the lawn 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Laundry 
 
    <span class='remove'></span> 
 
    </li> 
 
</ul>

參考文獻:

  1. How to delete parent element using jQuery?
  2. How to stop events bubbling in jQuery?
+0

你可以像'event.originalEvent.stopPropagation()'一樣訪問'event.originalEvent'中的原始DOM事件。 – rupps

+0

沒有事件傳遞給你的'hide'函數,因爲它不是一個事件。在'click,function(event)'中放入'event' – Adjit

+1

'hide()'函數沒有事件,'.on('click',function(event){...'does – adeneo

回答

2

你必須從click()回調讓你event對象。如果你看看jquery hide() api docs,完整的回調沒有傳遞任何東西,所以你的事件是未定義的,但the click() handler另一方面傳遞事件對象。所以你只需要改變你的javascript到:

$('span.remove').on('click', function(event) { 
    event.stopPropagation(); 
    $(this).parent().hide(500, function() { 
    $(this).parent().remove(); 
    }); 
}); 

然而,整個列表被刪除的原因是另一個問題。你引用parent()兩次,目標是ul被刪除,所以剛剛擺脫其中一個父母(將範圍$(this)更改爲父隱藏回調)。有了這個編輯的代碼是:

$('span.remove').on('click', function(event) { 
    event.stopPropagation(); 
    $(this).parent().hide(500, function() { 
    $(this).remove(); 
    }); 
}); 

這是真的然而,事件的傳播,並沒有真正有什麼用ul被隱藏作爲一個整體,所以你可以只取出event.stopPropagation()線。最終代碼是:

$('span.remove').on('click', function() { 
    $(this).parent().hide(500, function() { 
    $(this).remove(); 
    }); 
}); 
+0

It我只需要移除'span.remove'類的父元素 –

+0

啊我看到了,我沒有運行它,我編輯了我的答案來解決這個問題,我希望澄清一下 – jpopesculian

2

將事件obj移動到委派的點擊事件。

而不是this使用event.target

$('span.remove').on('click', function(event) { 
 
    var tgt = event.target; 
 
    $(tgt).parent().hide(500, function() { 
 
    $(tgt).parent().remove(); 
 
     
 
    }); 
 
    
 
});
.todo-list { 
 
    list-style: none; 
 
    padding: 0px; 
 
} 
 
.todo-item { 
 

 
    border: 2px solid #444; 
 
    margin-top: -2px; 
 
    padding: 10px; 
 
    cursor: pointer; 
 
    display: block; 
 
    background-color: #ffffff; 
 

 
} 
 
.remove { 
 
    float: right; 
 
    font-family: Helvetica, Arial, sans-serif; 
 
    font-size: 0.8em; 
 
    color: #dd0000; 
 
} 
 
.remove:before { 
 
    content: 'X'; 
 
} 
 
.remove:hover { 
 
    color: #ffffff; 
 
} 
 
.todo-item::after:hover { 
 
    background-color: #dd0000; 
 
    color: white; 
 
} 
 
.todo-item:hover { 
 
    background-color: #0EB0FF; 
 
    color: white; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<ul class='todo-list'> 
 
    <li class='todo-item'>4L 2% Milk 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Butter, Unsalted 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Dozen Eggs 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Walk the dog 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Cut the lawn 
 
    <span class='remove'></span> 
 
    </li> 
 
    <li class='todo-item'>Laundry 
 
    <span class='remove'></span> 
 
    </li> 
 
</ul>

+0

I很高興這樣做,先生。@KevinB完成了,我沒有足夠的時間測試它,只是得到了結果,謝謝。 – zer00ne

+0

@MaihanNijat這個解決方案刪除了​​'event.target'的li,是不是你想要什麼? – zer00ne

+0

謝謝。我投了你的答案,因爲它實現了我正在尋找的東西。 –

1

多個問題:

  1. event變量沒有被傳遞。不要在hide()函數中包含event參數,而應在on()事件處理程序中包含該參數。這應該會阻止錯誤。
  2. 您正在移除父項的父項。替換以下行:$(this).parent().remove();$(this).remove();
  3. 實際上您並不需要stopPropagation()。解決上述兩個問題後,你不需要它。 click事件不傳播。
+0

@KevinB Oops。編輯。 –