2011-09-08 11 views
15

अधिकांश ब्राउज़रों (सफारी के पुराने संस्करणों सहित) में, जावास्क्रिप्ट prompt फ़ंक्शन null देता है जब उपयोगकर्ता "रद्द करें" पर क्लिक करता है, और खाली स्ट्रिंग यदि उपयोगकर्ता "ठीक" पर क्लिक करता है तो कुछ भी नहीं पाठ बॉक्स लेकिन सफारी 5.1 में, यह दोनों मामलों के लिए खाली स्ट्रिंग देता है।सफारी 5.1 प्रॉम्प्ट() फ़ंक्शन और रद्द करें

मैंने सफारी की रिपोर्ट करने के लिए सफारी की "एक बग रिपोर्ट करें" सुविधा का उपयोग किया, लेकिन कौन जानता है कि जब वे इसे स्वीकार कर सकते हैं तो इसे बहुत कम ठीक किया जा सकता है। क्या किसी के पास कामकाज है?

उत्तर

2

मैंने वास्तविक कामकाज के साथ आने में कामयाब रहा है, क्योंकि सफारी ने 5.1 में showModalDialog() के लिए समर्थन जोड़ा है। बहुत सुविधाजनक, वह।

सबसे पहले, इस सामग्री के साथ एक फ़ाइल बनाने:

<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> 

फिर, सफारी के टूटे संस्करणों के लिए (वहाँ एक शीघ्र अप पॉपिंग और हिट करने के लिए उपयोगकर्ता से पूछे बिना इस सुविधा-पता लगाने के लिए कोई रास्ता नहीं हो रहा है "रद्द करें", तो आप शायद एक उपयोगकर्ता-एजेंट की जांच करना होगा), 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; 
})(); 
बेशक

, करने के लिए ऊपर से बनाए गए सही पथ के लिए पथ /js/safari-5.1-bugfix.html बदल अपने सर्वर पर एचटीएमएल फ़ाइल। दुर्भाग्यवश, हम data: URI का उपयोग नहीं कर सकते हैं क्योंकि सफारी के पास अन्य बग है जहां यह window.dialogArguments खो देता है और यूआरआई के साथ संवाद के लिए window.returnValue को अनदेखा करता है।

आप तब सामान्य रूप से prompt() का उपयोग कर सकते हैं।

+0

अच्छा, धन्यवाद! – Bibou

-1

निश्चित रूप से, दो वास्तव में।

सबसे पहले स्पष्ट, अपने सिस्टम को फिर से डिजाइन करें ताकि खाली स्ट्रिंग मान्य प्रतिक्रिया न हो। इसके बारे में सोचें, जब वार्तालाप में एक व्यक्ति के लिए आपके प्रश्न के वास्तविक उत्तर में आपको खाली रूप से देखने के लिए स्वीकार्य है?

दूसरा जानकारी इस जानकारी के लिए पूछने के लिए, jQuery वाले जैसे मोडल डायलॉग का उपयोग करना है। आप इसे पर पूरा नियंत्रण मिल जाएगा और आवेदन नहीं लग रही होगी 1996.

+4

के लिए काम किया आपका पहला जवाब बेकार है। खाली स्ट्रिंग वैध प्रतिक्रिया हो सकती है इसके कई कारण हैं।आपका दूसरा बहुत उपयोगी नहीं है, मैं JQuery के स्रोत से पता लगाने की कोशिश नहीं कर रहा हूं कि यह पता लगाने की कोशिश कर रहा है कि यह "मोडल डायलॉग" के लिए क्या कर सकता है। – Anomie

+0

सिद्धांत बहुत सरल है, आप पूरे व्यूपोर्ट को कवर करते हुए "बड़ा" 'div' डालते हैं और फिर अपने संवाद को प्रदर्शित करते हैं। संवाद बंद करने पर, आप पहले बनाए गए 'div' को हटा दें। यह सब एक सरल '.dialog (' शो ')' कॉल में encapsulated है हालांकि! – Blindy

+1

लेकिन आप 'var retval = dialog (' show ') 'के रूप में संवाद की उस शैली का उपयोग नहीं कर सकते हैं। जब आप उपयोगकर्ता को "ओके" या "रद्द करें" पर क्लिक करते हैं तो आपको अपने छद्म संवाद के लिए कॉलबैक सेट करना होगा और आपके प्रॉम्प्टिंग फ़ंक्शन को "पहले" और "बाद में" के बीच के बीच में बनाए रखने के दौरान संवाद के प्रदर्शन को तोड़ना होगा दो। जब मैं उस तरह की चीज चाहता हूं, तो मैं इसे पहले से ही करता हूं। लेकिन कभी-कभी उपयोगकर्ता को आवश्यक जानकारी के लिए पूछने के लिए एक सरल 'प्रॉम्प्ट() 'की आवश्यकता होती है। – Anomie

3
var res = prompt('hello?', '') 
if (res === null || res === '' && isSafari && confirm('was that cancel?')) 
    cancel 
+1

मुझे उम्मीद है कि आप इसे एक रान के रूप में समझेंगे। – pimvdb

+0

+1, सिर्फ इसलिए कि जब मैंने पहली बार बग का सामना किया तो मैंने स्टॉपगैप उपाय के समान काम किया। – Anomie

3

मैं सिर की सराहना करते हैं जैसे कि यह बनाया गया था उर्ध्वप्रवाह मैं व्यवहार गौर नहीं किया था, लेकिन अब मुझे लगता है कि आप कर रहे हैं सही बात। सफारी 5 सामान्य रूप से व्यवहार करता है, 5.1 बटन क्लिक के लिए खाली स्ट्रिंग देता है, यदि तत्काल फ़ील्ड में एक खाली स्ट्रिंग है।

मेरा एकमात्र सुझाव क्षेत्र में अंतरिक्ष चरित्र को शुरू करने के लिए है। केवल 'ओके' बटन अंतरिक्ष वापस कर देगा, रद्द शून्य या खाली स्ट्रिंग वापस आ जाएगा।

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 

उपयोगकर्ता कुछ है, यह दर्ज नष्ट करने के लिए शुरू कर सकता है, और फिर मारा 'ठीक है' के बजाय रद्द, लेकिन मामला उस तरह के साथ-साथ एक रद्द हो सकता है।

0

मैं tryed और यह मुझे

var location=""; 
    var p=prompt("type your location",location); 

if(p!==null) { location = p; alert("ok do query"); } 
संबंधित मुद्दे