javascript - usuario - ¿qué hace la función document.write ?
Safari 5.1 prompt() función y cancelar (5)
En la mayoría de los navegadores (incluidas versiones anteriores de Safari), la función de prompt
Javascript devuelve null
cuando el usuario hace clic en "Cancelar", y la cadena vacía si el usuario hace clic en "Aceptar" sin nada en el cuadro de texto. Pero en Safari 5.1, devuelve la cadena vacía para ambos casos.
Utilicé la función "informar un error" de Safari para informarlo a Apple, pero quién sabe cuándo podrían incluso reconocerlo y mucho menos arreglarlo. ¿Alguien tiene una solución alternativa?
Aprecio la información de arriba, no había notado el comportamiento, pero ahora veo que estás en lo correcto. Safari 5 se comporta normalmente, 5.1 devuelve una cadena vacía para cualquier clic de botón, si hay una cadena vacía en el campo de solicitud.
Mi única sugerencia es poner un personaje espacial en el campo para comenzar. Solo el botón "Aceptar" devolverá el espacio, cancelar devolverá nulo o la cadena vacía.
var p=prompt(''what dya say?'','' '');
if(!p)// cancel was *probably* clicked
else if(p==='' '')//ok was clicked with no input
else// there is user input
El usuario podría comenzar a ingresar algo, eliminarlo y luego presionar ''aceptar'' en lugar de cancelar, pero ese tipo de caso también puede ser una cancelación.
Claro, dos de hecho.
Primero el más obvio, rediseñe su sistema para que una cadena vacía no sea una respuesta válida. Piénselo, cuando en una conversación es aceptable que un hombre lo mire sin comprender en respuesta a su pregunta.
El segundo es usar cuadros de diálogo modales, como jQuery, para solicitar esta información. Obtendrá el control completo sobre él y la aplicación no se verá como si estuviera hecha en 1996.
He logrado encontrar una solución real, ya que Safari agregó soporte para showModalDialog()
en 5.1. Muy conveniente, eso.
Primero, crea un archivo con este contenido:
<html>
<head>
<title>Prompt</title>
<script type="text/javascript">
function a(){
if(window.dialogArguments.length > 0)
document.getElementById(''a'').textContent = window.dialogArguments[0]+''/n/n'';
if(window.dialogArguments.length > 1)
document.getElementById(''b'').value = window.dialogArguments[1];
document.getElementById(''b'').focus();
}
function s(b){
window.returnValue=b?document.getElementById(''b'').value:null;
window.close();
}
function kp(e){
if(!e.DOM_VK_ENTER) e.DOM_VK_ENTER=13;
if(!e.DOM_VK_RETURN) e.DOM_VK_RETURN=13;
if(!e.DOM_VK_ESCAPE) e.DOM_VK_ESCAPE=27;
switch(e.keyCode){
case e.DOM_VK_ENTER:
case e.DOM_VK_RETURN:
if(e.preventDefault) e.preventDefault();
if(e.stopPropagation) e.stopPropagation();
e.returnValue = false;
e.cancelBubble = true;
s(1);
return false;
case e.DOM_VK_ESCAPE:
if(e.preventDefault) e.preventDefault();
if(e.stopPropagation) e.stopPropagation();
e.returnValue = false;
e.cancelBubble = true;
s(0);
return false;
default:
return true;
}
}
</script>
<body style="text-align:center;white-space:pre-wrap" onload="a()">
<span id="a"></span>
<input type="text" id="b" onkeydown="return kp(event)" /><input type="button" value="Ok" onclick="s(1)" /><input type="button" value="Cancel" onclick="s(0)" />
</body>
</html>
Luego, para las versiones rotas de Safari (parece que no hay forma de detectar las características sin mostrar un mensaje y pedirle al usuario que presione "Cancelar", por lo que probablemente deba hacer una comprobación de User-Agent), ejecute el siguiente Javascript para reemplazar window.prompt
:
(function(){
if(window.console && window.console.log)
window.console.log(''Applying bugfix for Safari 5.1/'s prompt()'');
var oldprompt = window.prompt;
window.prompt = function() {
return showModalDialog(location.protocol+''//''+location.host+''/js/safari-5.1-bugfix.html'', arguments);
};
window.prompt.$orig = oldprompt;
})();
Por supuesto, cambie la ruta /js/safari-5.1-bugfix.html
a la ruta correcta al archivo HTML creado anteriormente en su servidor. Desafortunadamente, no podemos usar un URI de data:
ya que Safari aparentemente tiene otro error donde pierde window.dialogArguments
e ignora window.returnValue
para diálogos con data:
URIs.
Luego puede usar prompt()
como lo haría normalmente.
var res = prompt(''hello?'', '''')
if (res === null || res === '''' && isSafari && confirm(''was that cancel?''))
cancel
Lo intenté y esto funcionó para mí
var location="";
var p=prompt("type your location",location );
if(p!==null) { location = p; alert("ok do query"); }