2010-01-19 15 views
6

क्या आप ब्राउजर को लॉक किए बिना जावास्क्रिप्ट निष्पादन को रोक सकते हैं? जिस तरीके से आप सामान्य रूप से निष्पादन रोकेंगे, वह अनंत while() -loop करना है, लेकिन फ़ायरफ़ॉक्स के मामले में, यह लूप समाप्त होने तक ब्राउज़र को लॉक करता है।ब्राउजर को लॉक किए बिना जावास्क्रिप्ट निष्पादन रोकें

इस पर आपका क्या लेना है?


मैं HTML का उपयोग कर अपने खुद के संवाद को लागू करने के window.confirm() ओवरराइड करने के लिए कोशिश कर रहा हूँ। मैं ऐसा कर रहा हूं इसलिए मुझे मौजूदा कोड को बदलने की ज़रूरत नहीं है (यह एक बहुत बड़ा कोड-बेस है)।

मुझे उपयोगकर्ता-इनपुट की अनुमति देने के लिए निष्पादन को रोकने में सक्षम होना चाहिए; करने के लिए बदले में मानक की पुष्टि समारोह की तरह एक बूलियन वापसी करता है:

if (confirm("...")) 
{ 
    // user pressed "OK" 
} 
else 
{ 
    // user pressed "Cancel" 
} 



अद्यतन

मेरी जानकारी के लिए

; यह setTimeout() या setInterval() का उपयोग करके नहीं किया जा सकता है क्योंकि ये फ़ंक्शंस उन्हें अतुल्यकालिक रूप से दिए गए कोड को निष्पादित करते हैं।

+2

'setTimeout' और' setInterval' * * निष्पादित नहीं कोड एसिंक्रोनस रूप से, वे गिनती नीचे और फिर कॉलबैक फ़ंक्शन को एक कतार में जोड़ें जिसे थ्रेड निष्क्रिय होने पर कहा जाता है। फ़ंक्शन स्वयं सिंक्रनाइज़ेशन चलाते हैं। –

+0

यह भी देखें: http://stackoverflow.com/questions/2056747/javascript-puzzle-to-solve-window-confirm-divconfirmstrmessage –

+3

@ एंडी ई - 'window.setTimeout' (और' window.setInterval') एसिंक्रोनस कॉलबैक बनाएं । सामान्य कार्यक्रम प्रवाह इसे कॉल करने के तुरंत बाद जारी रहता है और टाइमर लंबाई के आधार पर कॉलबैक बाद की तारीख में निष्पादित किया जाता है। तथ्य यह है कि जावास्क्रिप्ट एकल-थ्रेडेड और कॉलबैक है, एक बार जब इसे निष्पादित करना शुरू हो गया है, तो निष्पादन से अन्य कोड को अवरुद्ध करता है, यह इसे अतुल्यकालिक होने से नहीं रोकता है। –

उत्तर

8

confirm()prompt() और alert() विशेष कार्य हैं - वे ब्राउज़र में जावास्क्रिप्ट सैंडबॉक्स से बाहर कॉल करते हैं, और ब्राउज़र जावास्क्रिप्ट निष्पादन को निलंबित करता है। आप वही काम नहीं कर सकते, क्योंकि आपको जावास्क्रिप्ट में अपनी कार्यक्षमता बनाने की आवश्यकता है।

मैं वहाँ एक शानदार तरीका की तर्ज पर कुछ पुनर्गठन कर के बिना एक प्रतिस्थापन में ड्रॉप करने के लिए नहीं लगता है:

myconfirmfunction(function() { 
    /* OK callback */ 
}, function() { 
    /* cancel callback */ 
}); 
+0

मैंने अपना प्रश्न अपडेट कर लिया है। एक नज़र देख लो। – roosteronacid

2

जिस तरह से आप सामान्य रूप से निष्पादन को रोकने शायद ही कभी एक अनंत जबकि पाश होना चाहिए।

ब्रेक अप भागों में अपने काम है, कि तुम setTimeout साथ

परिवर्तन इस फोन:

DoSomeWork(); 
    Wait(1000); 
    var a = DoSomeMoreWork(); 
    Wait(1000); 
    DoEvenMoreWork(a); 
इस के लिए

:

DoSomeWork(); 
setTimeout(function() { 
    var a = DoSomeMoreWork(); 
    setTimeout(function() { 
     DoEvenMoreWork(a); 
    }, 1000); 
}, 1000); 
+0

मैंने अपना प्रश्न अपडेट किया है। एक नज़र देख लो। – roosteronacid

7

आप जावास्क्रिप्ट में घटना धागा नहीं रोक सकता है, इसलिए इसके बजाय आपको आमतौर पर कॉलबैक फ़ंक्शंस का उपयोग करके समस्या के आसपास काम करना पड़ता है। ये वे कार्य हैं जो बाद में चल रहे हैं, लेकिन जावास्क्रिप्ट में किसी अन्य ऑब्जेक्ट की तरह चारों ओर पारित किया जा सकता है। आप AJAX प्रोग्रामिंग से उनसे परिचित हो सकते हैं। तो, उदाहरण के लिए:

doSomeThing(); 
var result = confirm("some importart question"); 
doSomeThingElse(result); 

में परिवर्तित किया जाएगा:

doSomeThing(); 
customConfirm("some importart question", function(result){ 
    doSomeThingElse(result); 
}); 

जहां customConfirm अब एक सवाल समारोह यह एक तर्क के रूप में लेता है के लिए परिणाम लेता है और गुजरता है। यदि आप किसी बटन के साथ एक डॉम संवाद लागू करते हैं, तो किसी ईवेंट श्रोता को ठीक और कैंसल बटन से कनेक्ट करें, और जब उपयोगकर्ता उनमें से किसी एक पर क्लिक करता है तो कॉलबैक फ़ंक्शन को कॉल करें।

+1

");" आपके कोड के अंत में गायब है। – Frunsi

1

मुझे नहीं लगता कि आपकी खुद की जावास्क्रिप्ट में पुष्टि() या प्रॉम्प्ट() की कार्यक्षमता को उचित रूप से फिर से बनाने का कोई तरीका है।मूल ब्राउज़र लाइब्रेरी में कॉल के रूप में लागू होने के अर्थ में वे "विशेष" हैं। आप वास्तव में जावास्क्रिप्ट में उस तरह के एक मोडल संवाद नहीं कर सकते हैं।

मैंने विभिन्न UI पुस्तकालयों को देखा है जो पृष्ठ के शीर्ष पर एक तत्व डालकर प्रभाव को अनुकरण करते हैं, जो & एक मोडल संवाद की तरह कार्य करता है, लेकिन उनको एसिंक कॉलबैक का उपयोग करके लागू किया जाता है।

आपको window.confirm को बदलने के बजाय मौजूदा लाइब्रेरी को संशोधित करना होगा।

7

या तो कॉलबैक का उपयोग करें या केवल अपना कोड फ़ायरफ़ॉक्स बनाएं। फ़ायरफ़ॉक्स में जावास्क्रिप्ट 1.7 और उच्चतर के समर्थन के साथ, आप अपने वांछित प्रभाव को अनुकरण करने के लिए उपज कथन का उपयोग कर सकते हैं। मैंने async.js नामक इस उद्देश्य के लिए एक लाइब्रेरी बनाई है।

if (yield to.confirm("...")) { 
    // user pressed OK 
} else { 
    // user pressed Cancel 
} 
0

मैं this के लिए तंग पाशन उपयोग करने की कोशिश: async.js के लिए मानक पुस्तकालय एक पुष्टि विधि है, जो इस तरह के रूप में इस्तेमाल किया जा सकता है। मुझे एक मूल घटना को धीमा करने की आवश्यकता थी (जो AFAIK सिंक्रोनस प्रतीक्षा के लिए एकमात्र उपयोग केस है जिसे अतुल्यकालिक रूप से पुन: आर्किटेक्टेड नहीं किया जा सकता है)। वहां बहुत सारे उदाहरण हैं जो ब्राउज़र को लॉक न करने का दावा करते हैं; लेकिन उनमें से कोई भी मेरे लिए काम नहीं करता था (ब्राउज़र लॉक नहीं हुआ था, लेकिन उन्होंने इसे उस चीज़ को करने से रोका जो मैं पहली जगह इंतजार कर रहा था), इसलिए मैंने विचार छोड़ दिया।

अगला मैंने this की कोशिश की - घटना को संग्रहित और दोबारा चलाने, जो कि असंभव क्रॉस-ब्राउज़र भी प्रतीत होता है। हालांकि घटना के आधार पर और आपको कितना लचीला होना चाहिए, आप करीब आ सकते हैं।

अंत में मैंने छोड़ दिया, और इसके लिए बहुत बेहतर महसूस किया; मुझे मूल घटना को धीमा किए बिना अपना कोड काम करने का एक तरीका मिला।

3

स्ट्रैटिफाइडजेएस नामक जावास्क्रिप्ट भाषा का विस्तार है। यह हर ब्राउज़र में चलता है, और यह आपको ऐसा करने की अनुमति देता है: ब्राउज़र को फ्रीज किए बिना जावास्क्रिप्ट कोड की एक पंक्ति को रोकना।

आप स्ट्रैटिफाइड जावास्क्रिप्ट को सक्षम कर सकते हैं उदा। की तरह अपने वेबपेज में Oni अपोलो (http://onilabs.com/docs) सहित द्वारा:

<script src="http://code.onilabs.com/latest/oni-apollo.js"></script> 
<script type="text/sjs"> your StratifiedJS code here </script> 

आपका कोड इस तरह दिखेगा:

var dom = require("dom"); 
displayYourHtmlDialog(); 
waitfor { 
    dom.waitforEvent("okbutton", "click"); 
    // do something when the user pressed OK 
} 
or { 
    dom.waitforEvent("cancelbutton", "click"); 
} 
hideYourHtmlDialog(); 
// go on with your application