2017-09-18 4 views
1

J'ai du code qui ouvre un lien. Le lien est configurable et donc je suis en train de faire quelques erreurs de base. Spécifiquement, j'emballe l'appel window.open() avec un try/catch car l'API intégrée lèvera une exception si l'URL n'est pas valide. Le problème est que, dans Safari, la capture n'est pas touchée.Impossible d'intercepter l'exception window.open() dans Safari

J'ai essayé de parcourir l'API Safari, mais je ne trouve aucune bonne information.

L'exemple ci-dessous fonctionne très bien dans IE et Chrome mais pas dans Safari.

$(function() { 
 
    $('button').on("click", function() { 
 
    try { 
 
     var begin = "http://<"; 
 
     var opentag = "script>"; 
 
     var stuff = "function(){alert('unsafe');}"; 
 
     var all = begin + opentag + stuff; 
 
     window.open(all); 
 
    } catch (e) { 
 
     alert("errr"); 
 
    } 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button> 
 
Click ME 
 
</button>

+1

Chaque fenêtre fonctionne dans son propre thread Javascript qui fonctionne de manière asynchrone avec d'autres fenêtres. – Barmar

+0

Ce n'est pas un problème de code s'exécutant dans une autre fenêtre. C'est, l'URL à ouvrir peut être invalide et si c'est le cas, je veux attraper l'exception. – RodgerTheGreat

Répondre

1

commentaire de Barmar est juste, je pense. Un moyen de contourner ce problème serait de récupérer la valeur de retour de window.open() et de vérifier si elle a retourné quoi que ce soit. Si non, alors il n'a probablement pas ouvert la fenêtre. Lisez la documentation window.open() ici: https://developer.mozilla.org/en-US/docs/Web/API/Window/open

$(function() { 
    $('button').on("click", function() { 
    var x = null; 
    try { 
     var begin = "http://<"; 
     var opentag = "script>"; 
     var stuff = "function(){alert('unsafe');}"; 
     var all = begin + opentag + stuff; 

     x = window.open(all); 
    } catch (e) { 
     alert("errr"); 
    } finally { 
     if (!x) { 
     alert("errrrrrrrrr!"); 
     } 
    } 
    }); 
}); 
+1

Bien que je ne comprenne toujours pas pourquoi POURQUOI Safari fait cette réponse @ booleanCube me donne un moyen de "rattraper" les erreurs. – RodgerTheGreat