2008-12-02 7 views
33

Tworzę prosty link do usunięcia ze zdarzeniem onClick, które wywołuje dialog potwierdzenia. Chcę potwierdzić, że użytkownik chce usunąć wpis. Wydaje się jednak, że po kliknięciu przycisku Anuluj domyślne działanie (to znaczy link href) nadal ma miejsce, więc wpis zostaje usunięty. Nie jestem pewien, co robię źle tutaj ... Wszelkie dane wejściowe będą mile widziane.Prosty problem z JavaScriptem: onClick confirm nie blokuje domyślnej akcji

EDYCJA: Właściwie, kod jest teraz, strona nawet nie wywołuje funkcji ... więc w ogóle nie pojawia się okno dialogowe. Miałem kod onClick jako:

onClick="confirm('Delete entry?')" 

, który wywołał okno dialogowe, ale nadal przechodził do linku w pozycji Anuluj.

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt"%> 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 

<script type="text/javascript"> 

function delete() { 
    return confirm('Delete entry?') 
} 

</script> 


... 

<tr> 
<c:if test="${userIDRO}"> 
    <td> 
     <a href="showSkill.htm?row=<c:out value="${skill.employeeSkillId}"/>" /> 
     <img src="images/edit.GIF" ALT="Edit this skill." border="1"/></a> 
    </td> 
    <td> 
     <a href="showSkill.htm?row=<c:out value="${skill.employeeSkillId}&remove=1"/>" onClick="return delete()"/> 
     <img src="images/remove.GIF" ALT="Remove this skill." border="1"/></a> 
    </td> 
</c:if> 
</tr> 

Odpowiedz

96

Jest literówka w kodzie (tagu jest zamknięty zbyt wcześnie). Można zastosowanie:

<a href="whatever" onclick="return confirm('are you sure?')"><img ...></a> 

Uwaga powrotu (potwierdź): wartość zwracana przez skrypty w swoistych Evens decyduje, czy akcja domyślna przeglądarka jest prowadzony lub nie; w przypadku trzeba uruchomić duży kawałek kodu można oczywiście wywołać inną funkcję:

<script type="text/javascript"> 
function confirm_delete() { 
    return confirm('are you sure?'); 
} 
</script> 
... 
<a href="whatever" onclick="return confirm_delete()"><img ...></a> 

(Zauważ, że usunięcie jest kluczowe)

Dla kompletności: Nowoczesne przeglądarki również obsługują zdarzenia DOM, co pozwala zarejestrować więcej niż jedną procedurę obsługi dla tego samego zdarzenia na każdym obiekcie, uzyskać dostęp do szczegółów wydarzenia, zatrzymać propagację i wiele więcej; patrz DOM Events.

+0

Dzięki, nie zauważyliśmy literówki. – kafuchau

+1

'onClick =" return confirm ("Czy na pewno chcesz usunąć?") "' –

10

Używam tego, działa jak czar. Nie trzeba mieć żadnych funkcji, po prostu inline z linku (ów)

onclick="javascript:return confirm('Are you sure you want to delete this comment?')" 
+1

Nie ma również potrzeby używania "javascript:". Ale jak powiedział siukurnin, powinieneś użyć POST, jeśli coś zmienisz. – some

4

Przede wszystkim usunąć jest reserved word w javascript, jestem zaskoczony, to nawet wykona dla ciebie (Kiedy przetestować go w Firefox, pojawia się błąd składniowy)

Po drugie, Twój HTML wygląda dziwnie - czy istnieje powód, dla którego zamykasz otwierające znaczniki zakotwiczenia zamiast zamiast tylko >?

+0

Wow, pierdnięcie mózgu. Nie myślałem, aby sprawdzić "usuń" jako słowo kluczowe. Niby "duh", jeśli zarezerwowało go tak wiele innych języków. : P – kafuchau

+0

XHTML używa /> do zamykania pustych tagów ... Oznacza to, że w kodzie z oryginalnego postu, znaczniki a są zamykane dwa razy! – some

7

Użycie prostego linku do wykonania czynności, takiej jak usunięcie rekordu, wydaje mi się niebezpieczne: co zrobić, jeśli robot indeksujący próbuje zindeksować twoje strony? Zignoruje wszelkie javascript i podąży za każdym linkiem, prawdopodobnie nie jest to dobre.

Lepiej użyj formularza z metodą = "POST".

A potem trzeba będzie wydarzeniem „onSubmit”, aby zrobić dokładnie to, co chcesz ...

+4

To doskonały punkt. Nie tylko jest to potencjalnie niebezpieczne dla twojej aplikacji, ale w rzeczywistości stanowi naruszenie specyfikacji HTTP. –

+1

JW. Czy robot może uzyskać dostęp do rekordów bez możliwości logowania? – kafuchau

+0

Nie, roboty indeksujące nie mogłyby uzyskać dostępu do chronionych części witryny. – Benry

19

Cóż, kiedyś ten sam problem, a problem został rozwiązany poprzez dodanie słowa „powrót” przed Potwierdź:

onclick="return confirm('Delete entry?')" 

życzę to może być dla ciebie .. heplful

Powodzenia!

6

miałem wydawać podobni (kliknij na przycisku, ale po anulować kliknięciu wciąż usuwa mojego obiektu), a więc dokonał tego w taki sposób, mam nadzieję, że ktoś pomoże w przyszłości:

$('.deleteObject').click(function() { 
    var url = this.href; 
    var confirmText = "Are you sure you want to delete this object?"; 
    if(confirm(confirmText)) { 
     $.ajax({ 
      type:"POST", 
      url:url, 
      success:function() { 
      // Here goes something... 
      }, 
     }); 
    } 
    return false; 
}); 
0

spróbuj tego:

OnClientClick = 'return (potwierdź ("Czy na pewno chcesz usunąć ten komentarz?"));'

4
<img src="images/delete.png" onclick="return confirm_delete('Are you sure?')"> 



<script type="text/javascript"> 
function confirm_delete(question) { 

    if(confirm(question)){ 

    alert("Action to delete"); 

    }else{ 
    return false; 
    } 

} 
</script> 
1

Jeśli chcesz użyć małych poleceń wbudowanych w tagu onclick, możesz użyć czegoś takiego.

<button id="" class="delete" onclick="javascript:if(confirm('Are you sure you want to delete this entry?')){jQuery(this).parent().remove(); return false;}" type="button"> Delete </button>