2010-10-25 23 views
1

javascript joint ne fonctionne pas en safari.safari javascript numéro

Ce script affiche un message de confirmation avant de quitter la page en cours.

étonnamment cela fonctionne pour la première fois en safari (mais pas lors de la soumission subséquente).

Scénario:

  • utilisateur fait quelques changements et appuyez sur le bouton soumettre
  • un message
  • de confirmation affiché à l'utilisateur
  • utilisateur
  • a décidé d'appuyer sur le bouton annuler pour rester en arrière sur la même page
  • mais l'utilisateur postface impossible d'invoquer à nouveau soumettre.
  • Le bouton d'envoi ne fonctionne pas.

P.S: Ce code fonctionne parfaitement avec d'autres navigateurs IE7/8, FireFox.

function checksave() { 
    if (formIsDirty(myForm)) { 
    return "The form has been changed..."; 
    } 
} 

function formIsDirty(form) { 
    for (var i = 0; i < form.elements.length; i++) { 
    var element = form.elements[i]; 
    var type = element.type; 
    if (type == "checkbox" || type == "radio") { 
    if (element.checked != element.defaultChecked) { 
    return true; 
    } 
    } 
    else if (type == "hidden" || type == "password" || type == "text" || 
    type == "textarea") { 
    if (element.value != element.defaultValue) { 
    return true; 
    } 
    } 
    else if (type == "select-one" || type == "select-multiple") { 
    for (var j = 0; j < element.options.length; j++) { 
    if (element.options[j].selected != 
    element.options[j].defaultSelected) { 
     return true; 
    } 
    } 
    } 
    } 
    return false; 
} 

<body OnBeforeUnload ="return checksave();"> 
<form id="myForm" > 
    <table border="1"> 
    <tr> <td>Enter Text:</td><td><input id="text1" type="text" value=""/> <br/> </td></tr> 
    <tr> <td><input id="button1" type="submit" value="Submit1"/> <br/> </td> <td><input id="button2" type="submit" value="Submit2"/> <br/> </td></tr> 
    </table> 
</form> 
</body> 
+0

Répondu ici? http://stackoverflow.com/questions/803887/can-i-pop-up-a-confirmation-dialog-when-the-user-is-closing-the-window-in-safari – Mantar

Répondre

0

Oui, il est un bug dans WebKit, mais qui semble être fixé dans les versions actuelles Chrome pour moi.

Apparaît lorsqu'une soumission de formulaire est annulée à partir d'une invite beforeunload, tous les formulaires de la page deviennent inviolables (l'événement submit se déclenche toujours mais la soumission ne navigue pas) jusqu'à ce qu'un champ de formulaire sur la page soit modifié. (Cela n'a rien à voir avec votre propre vérification de la forme et du changement.Le navigateur lui-même bloque la navigation jusqu'à ce qu'il remarque un changement.Peut-être un truc de forme-multiple-soumission-prévention mal tourné?)

Normalement vous ne remarquerez pas puisque normalement vous mettriez un gestionnaire différent sur form.onsubmit qui court-circuiterait le onbeforeunload (puisque généralement si l'utilisateur clique pour soumettre le formulaire, ils savent ils ont changé quelque chose dessus, et veulent enregistrer le changement).

(Soit dit en passant, éviter l'utilisation de myForm comme une variable globale pour faire référence à l'élément avec id="myForm. Ceci est un IE pirater que d'autres navigateurs ont maintenant mis en œuvre, mais seulement en mode Quirks, et vous ne pas veulent être en mode Quirks Ajouter une déclaration <!DOCTYPE> et utiliser document.getElementById('myForm').)

+0

Appréciez beaucoup pour votre explication détaillée. Cela efface mon esprit, mais je me demande si une solution de rechange est disponible. c'est toujours un problème avec safari/windows 5.0.2 (7533.18.5). Notre client a demandé à avoir cette implémentation puisque notre application supporte le formulaire d'entrée lenthy qui doit être rempli par l'utilisateur. Nous aimons avoir une solution javascript générique, donc ne pas gérer chaque événement de contrôle (c.-à-d. onclick) – Kannan

+0

Il suffit de gérer la soumission de chaque formulaire ('onsubmit';' onclick' est généralement un mauvais endroit pour gérer les soumissions) , en écrivant un drapeau pour faire taire le 'onbeforeunload', en utilisant' confirm() 'si vous avez besoin d'une invite de confirmation. Je m'attendrais à ce que vous vouliez le faire de toute façon, parce que vous ne voulez généralement pas le même message de quitter la page sans enregistrer quand ce que vous faites est en train de sauver. – bobince