2009-02-19 7 views
7

मेरे पास एक आईफ्रेम वाला एक पृष्ठ है जिसका स्रोत पृष्ठ एक अलग डोमेन में है। समय-समय पर, स्रोत पृष्ठ एक चेतावनी उत्पन्न करता है। जब ऐसा होता है, तो यह तब तक रोकता है जब तक कि उपयोगकर्ता अलर्ट पर ठीक क्लिक नहीं करता है।जावास्क्रिप्ट में अलर्ट पर क्लिक को अनुकरण करने का कोई तरीका है?

मैं क्या करना चाहता हूं प्रोग्रामेटिक रूप से इस चेतावनी पर ठीक क्लिक करें ताकि स्रोत पृष्ठ उपयोगी हो सके। क्या यह संभव है?

उत्तर

16

जावास्क्रिप्ट एकल-थ्रेडेड है, जिसका अर्थ है कि जब आप कोई फ़ंक्शन कॉल करते हैं, तो यह तब तक अवरुद्ध हो जाता है जब तक यह लौटा न जाए। जब आप अलर्ट() को कॉल करते हैं, तो वह ब्राउज़र पर नियंत्रण पास करता है जो यह तय करता है कि इसे कैसे संभालना है। यह जावास्क्रिप्ट नहीं है जो यूआई संवाद पॉपिंग कर रहा है, यह ब्राउज़र है। चेतावनी() तब तक वापस नहीं आती जब तक ब्राउज़र को "ठीक" ईवेंट प्राप्त नहीं होता है और नियंत्रण लौटाता है। जावास्क्रिप्ट धागा तब तक रुक जाता है जब तक ऐसा नहीं होता है।

कम से कम दो अलग-अलग कारणों के लिए तो उपरोक्त अनुच्छेद में कहा गया है, इस सवाल का जवाब कोई :)

+0

मेरे संदेह की पुष्टि की। मुझे इसके लिए जावास्क्रिप्ट के अतिरिक्त या इसके बजाय कुछ उपयोग करने की आवश्यकता होगी। – moffdub

+0

जावास्क्रिप्ट थ्रेड को रोक नहीं दिया गया है, संदेश अभी भी पंप किए गए हैं और किसी भी टाइमर या एसिंक परिवर्तन अभी भी ईवेंट हैंडलर को आग लगाएंगे, और उन हैंडलरों में जेएस अभी भी चलेंगे। –

7

मुझे पूरा यकीन है कि यह संभव नहीं है।

+1

@ जो कोई भी इस downvoting है: सवाल है, जिस पर एक नज़र रखना एक सीधे-अप हां-ना, संभव है या नहीं-संभव। अन्य उत्तरों बेहतर हैं, लेकिन सवाल का जवाब देने वाले पहले व्यक्ति के लिए सही वोट? अजीब। तकनीकी रूप से सही होने के लिए – fig

+0

+1। मेरा सवाल हां/नहीं था और हां/नहीं था कि मैं इसे जावास्क्रिप्ट में पूरी तरह से कर सकता था। – moffdub

+0

धन्यवाद - इसकी सराहना करें। :) – fig

1

मुझे अत्यधिक संदेह है। यदि अलग डोमेन से, क्या आपका मतलब है कि जिस पर आपका कोई नियंत्रण नहीं है?

यदि आपके पास नियंत्रण है, तो आप अलर्ट को मोडल जावास्क्रिप्ट बॉक्स में बदल सकते हैं, जिसे आप नियंत्रित कर सकते हैं।

2

अगर आप अपने कोड में नो-सेशन के साथ अलर्ट को ओवरराइड क्या होता है?

उदा।

<script> 
// uncomment next line to swallow alerts 
// function alert(nope) { return; } 
<script> 
<script> 
    $(document).ready(function() { alert("Hello, world!"); }); 
</script> 

लाइन के साथ टिप्पणी की गई, अलर्ट दिखाई देता है। लाइन में टिप्पणी के साथ, अलर्ट प्रकट नहीं होता है।

+0

यह एक अच्छा विकल्प है, मानते हैं कि डेवलपर बोर्ड में अलर्ट खोने से कोई फर्क नहीं पड़ता। –

+0

नहीं, iframe ओवरराइट किए गए अलर्ट फ़ंक्शन को नहीं पढ़ेगा। –

+0

क्या यह काम तब भी करेगा जब आपत्तिजनक कोड एक आईफ्रेम में है जिसका स्रोत एक अलग डोमेन में है? – fig

0

परेशान जावास्क्रिप्ट के साथ आपकी समस्याओं को हल करने के लिए सबसे अच्छी शर्त इसे क्लाइंट साइड स्क्रिप्टिंग टूल जैसे Greasemonkey के साथ ओवरराइड करना होगा।

3

यदि आपको अलर्ट के पाठ को पता है और गंदे होने पर ध्यान न दें तो आपको कोई समस्या नहीं होनी चाहिए।

आप अपनी खुद की साथ आइफ्रेम खिड़की के अलर्ट को ओवरराइड कर सकते हैं और के प्रभाव के लिए कुछ करना ..

document.getElementById("InnerFrameName").contentWindow.alert = function(){ 
    if (arguments[0].toLowerCase() == "innerframe alert text") 
     return; //supress 
    else 
     alert(arguments[0]); 
}; 

संपादित करें: मैं एक प्रॉक्सी हैंडलर (यह asp.net/c# में है, लेकिन साथ एक छोटी सी परीक्षण किए गए आपको विचार मिलना चाहिए) ...

मेरे परीक्षण में बाहरी पृष्ठ एक बटन के साथ एक डब्ल्यू 3 पृष्ठ है जो एक चेतावनी प्रदर्शित करता है, अलर्ट अब उपयोगकर्ता परिभाषित फ़ंक्शन के माध्यम से पारित किया जाता है।

मुझे यकीन है कि यह बहुत गंदा है तो आप प्राप्त करना चाहते हैं।

पृष्ठ:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Hello From MyPage</title> 
    <script type="text/javascript"> 
     function frameLoaded() { 
      document.getElementById("InnerFrameName").contentWindow.alert = function() { 
       if (arguments[0].toLowerCase() == "i am an alert box!!") { 
        alert("MESSAGES WOULD BE SUPRESSED: " + arguments[0]); 
        return; //supress 
       } else { 
        alert(arguments[0]); 
       } 
      }; 
     } 
     </script> 
</head> 
<body onload="alert('Hello from an unsupressed top level frame message!');"> 
    <form id="form1" runat="server"> 
      <div> 
       <h1>Internal Page (Top Level)</h1> 
       <hr /> 
       <iframe id="InnerFrameName" onload="frameLoaded();" src="PageProxy.ashx?externalURI=http://www.w3schools.com/JS/tryit_view.asp?filename=tryjs_alert" 
        style="width: 800px; height: 600px;">Derp!...</iframe> 
      </div> 
    </form> 
</body> 
</html> 

प्रॉक्सी हैंडलर:

<%@ WebHandler Language="C#" Class="PageProxy" %> 

using System; 
using System.Web; 

public class PageProxy : IHttpHandler { 

    public void ProcessRequest (HttpContext context) { 
      byte[] externalPage = new System.Net.WebClient().DownloadData(context.Request["externalURI"]); 
      context.Response.OutputStream.Write(externalPage, 0, externalPage.Length); 
      context.Response.End(); 
    } 

    public bool IsReusable { 
     get { 
      return false; 
     } 
    } 
} 
+0

आईफ्रेम स्रोत बाहरी डोमेन में है, इसलिए जब मैंने कोशिश की तो अनुमति अस्वीकार कर दी गई थी। – moffdub

+0

हाँ मुझे डर था कि डोमेन अनुमतियां किसी समस्या का कारण बनती हैं, फिर केवल वर्कअराउंड रिमोट पेज लोड करने के लिए स्थानीय प्रॉक्सी पेज/हैंडलर आदि बना रहा है, इसलिए यह डोमेन में है और इस स्क्रिप्ट को काम करना चाहिए। –

संबंधित मुद्दे