जब प्रोग्रामेटिक रूप से निर्मित <iframe> (IE-only) के डॉक्यूमेंट ऑब्जेक्ट को एक्सेस करने का प्रयास करते समय "एक्सेस से वंचित किया जाता है" तो जावास्क्रिप्ट त्रुटि।


80

मेरे पास प्रोजेक्ट है जिसमें मुझे जावास्क्रिप्ट का उपयोग करके <iframe> तत्व बनाना है और इसे DOM में जोड़ना है। उसके बाद, मुझे <iframe> में कुछ सामग्री डालने की आवश्यकता है। यह एक विजेट है जिसे तृतीय-पक्ष वेबसाइटों में एम्बेड किया जाएगा।

मैं <iframe> की "src" विशेषता सेट नहीं करता क्योंकि मैं एक पृष्ठ लोड नहीं करना चाहता; बल्कि, इसका उपयोग उस सामग्री को अलग करने / सैंडबॉक्स करने के लिए किया जाता है जिसे मैं इसमें सम्मिलित करता हूं ताकि मैं सीएसएस या जावास्क्रिप्ट में मूल पृष्ठ के साथ संघर्ष न करूं। मैं JSONP का उपयोग सर्वर से कुछ HTML सामग्री को लोड करने और इस <iframe> में डालने के लिए कर रहा हूँ।

मेरे पास यह काम ठीक है, एक गंभीर अपवाद के साथ - अगर document.domain संपत्ति मूल पृष्ठ में सेट है (जो कि यह कुछ वातावरण में हो सकता है जिसमें यह विजेट तैनात है), Internet Explorer (शायद सभी संस्करण, लेकिन मैंने 6, 7, और 8) में पुष्टि की गई है, जब मैंने इस <iframe> के दस्तावेज़ ऑब्जेक्ट तक पहुँचने का प्रयास किया, तो मुझे "एक्सेस से वंचित" त्रुटि मिली है। यह किसी भी अन्य ब्राउज़रों में नहीं हुआ है जिसे मैंने (सभी प्रमुख आधुनिक लोगों में) परीक्षण किया है।

यह कुछ समझ में आता है, क्योंकि मुझे पता है कि इंटरनेट एक्सप्लोरर को आपको सभी विंडोज़ / फ्रेम के डॉक्यूमेंट सेट करने की आवश्यकता होती है, जो एक-दूसरे के साथ समान मूल्य पर संवाद करेंगे। हालाँकि, मैं इस मूल्य को किसी दस्तावेज़ पर सेट करने के बारे में नहीं जानता, जिसे मैं एक्सेस नहीं कर सकता।

क्या किसी को ऐसा करने के तरीके के बारे में पता है - किसी भी तरह से इस गतिशील रूप से बनाए गए दस्तावेज़ के दस्तावेज़ सेट करें <iframe>? या मैं इसे सही कोण से नहीं देख रहा हूं - क्या इस समस्या को चलाने के बिना मैं जो हासिल करने जा रहा हूं उसे प्राप्त करने का एक और तरीका है? मुझे किसी भी मामले में <iframe> का उपयोग करने की आवश्यकता है, क्योंकि पृथक / सैंडबॉक्स वाली विंडो इस विजेट की कार्यक्षमता के लिए महत्वपूर्ण है।

यहाँ मेरा परीक्षण कोड है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Document.domain Test</title>
    <script type="text/javascript">
      document.domain = 'onespot.com'; // set the page's document.domain
    </script>
  </head>
  <body>
    <p>This is a paragraph above the &lt;iframe&gt;.</p>
    <div id="placeholder"></div>
    <p>This is a paragraph below the &lt;iframe&gt;.</p>
    <script type="text/javascript">
      var iframe = document.createElement('iframe'), doc; // create <iframe> element
      document.getElementById('placeholder').appendChild(iframe); // append <iframe> element to the placeholder element
      setTimeout(function() { // set a timeout to give browsers a chance to recognize the <iframe>
        doc = iframe.contentWindow || iframe.contentDocument; // get a handle on the <iframe> document
        alert(doc);
        if (doc.document) { // HEREIN LIES THE PROBLEM
          doc = doc.document;
        }
        doc.body.innerHTML = '<h1>Hello!</h1>'; // add an element
      }, 10);
    </script>
  </body>
</html>

मैंने इसे होस्ट किया है:

http://troy.onespot.com/static/access_denied.html

जैसा कि आप देखेंगे कि क्या आप IE में इस पृष्ठ को लोड करते हैं, इस बिंदु पर कि मैं अलर्ट कहता हूं (), मेरे पास <iframe> की विंडो ऑब्जेक्ट पर एक हैंडल है; मैं अभी इसके दस्तावेज़ ऑब्जेक्ट में कोई गहरा नहीं मिल सकता।

किसी भी मदद या सुझाव के लिए बहुत बहुत धन्यवाद! मैं इसके लिए एक समाधान खोजने में मेरी मदद करने के लिए ऋणी रहूंगा।


Troy.onespot का लिंक मर चुका है।
mbomb007

जवाबों:


67

यदि document.domain संपत्ति पैरेंट पेज में सेट है, तो Internet Explorer मुझे "एक्सेस से वंचित" कर देता है

आह। हाँ, यह एक IE मुद्दा है (बग कहना मुश्किल है क्योंकि इस तरह की अप्रियता के लिए कोई प्रलेखित मानक नहीं है)। जब आप एक srcless iframe बनाते हैं, तो वह इसके बजाय document.domainमूल दस्तावेज़ से प्राप्त करता है । उस बिंदु पर जब आप इसे बदल नहीं सकते, तो आप बहुत अधिक खो चुके हैं।location.hostdocument.domain

एक भयानक वर्कअराउंड srcएक जावास्क्रिप्ट पर सेट करना है: URL (urgh!)

 iframe.src= "javascript:'<html><body><p>Hello<\/p><script>do things;<\/script>'";

लेकिन किसी कारण के लिए, इस तरह के एक दस्तावेज document.domainIE में स्क्रिप्ट से अपना स्वयं का सेट करने में असमर्थ है (अच्छा पुराना "अनिर्दिष्ट त्रुटि"), इसलिए आप इसका उपयोग माता-पिता (*) के बीच एक पुल को पुनः प्राप्त करने के लिए नहीं कर सकते। आप संपूर्ण दस्तावेज़ HTML को लिखने के लिए इसका उपयोग कर सकते हैं, यह मानते हुए कि विजेट को उसके मूल दस्तावेज़ से बात करने की आवश्यकता नहीं है, क्योंकि यह तत्काल है।

हालाँकि, iframe JavaScript URL सफारी में काम नहीं करते हैं, इसलिए आपको अभी भी किसी तरह के ब्राउज़र-सूँघने की ज़रूरत है कि किस विधि का उपयोग करना है।

*: किसी अन्य कारण से, आप IE में, दूसरे दस्तावेज़ से सेट कर सकते हैं , document.domainपहले दस्तावेज़ द्वारा लिखित। तो यह काम करता है:

if (isIE)
    iframe.src= "javascript:'<script>window.onload=function(){document.write(\\'<script>document.domain=\\\""+document.domain+"\\\";<\\\\/script>\\');document.close();};<\/script>'";

इस बिंदु पर मेरे लिए छिपाने का स्तर बहुत अधिक है, मैं बाहर हूं। मैं बाहरी HTML करता हूँ जैसे डेविड ने कहा।


10
@ बब्बन: तुम कमाल हो! मैं वास्तव में एक बहुत अधिक Googling के बाद देर रात इस बहुत दृष्टिकोण पर ठोकर खाई। वास्तव में, मुझे लगता है कि मुझे और भी अधिक मजबूत लग सकता है, और संभावित रूप से कम कूडल क्रॉस-ब्राउज़र समाधान: telerik.com/community/forums/aspnet-ajax/editor/… - 21 अगस्त से जेफ़ टकर की सूचना पर ध्यान दें। < iframe> का "src" गुण "जावास्क्रिप्ट: void ((function () {document.en (); document.domain = \ 'tld.com \'; document.close ();}) ())" लगता है; चाल करने के लिए, और एक क्रॉस-ब्राउज़र तरीके से। यह सफारी में भी काम करता है (कम से कम v3 +)।
बंगल

1
: यहाँ एक परीक्षण पृष्ठ मेरी पिछली टिप्पणी को दर्शाता हुआ है troy.onespot.com/static/access_denied_test.html
बंगल

1
बहुत अच्छे! यह ज़्यादा बेहतर है! दिलचस्प है कि इसे सीधे काम करना चाहिए ... सामान्य रूप से, एक जावास्क्रिप्ट: URL को उसके माता-पिता के संदर्भ में निष्पादित किया जाएगा, लेकिन ऐसा लगता है कि iframe src के साथ ऐसा नहीं है। आप शायद void()कॉल भी खो सकते हैं , क्योंकि फ़ंक्शन पहले ही वापस आ जाता है undefined
बोबिन्स 19

1
संयोग से आपको IE में पृष्ठ को फिर से लोड करने में त्रुटि मिलती है, क्योंकि IE आईफ्रेम स्थान ... argh को बनाए रखने की कोशिश करता है। अगर वहाँ एक रास्ता है कि डनो।
19

1
@ बॉब: ओह यार, तुम ठीक कह रहे हो। यह बात बताने के लिए धन्यवाद; मैं इतना उत्साहित था कि इसने पहली बार काम किया कि मैं पुनः लोड करने के लिए परेशान नहीं था। IE से आपका क्या मतलब है <iframe> लोकेशन को बनाए रखने की कोशिश कर रहा है? मुझे इसका समाधान ढूंढना है, इसलिए मैं आपको पोस्ट करता रहूंगा - कृपया कुछ भी करने के लिए ऐसा ही करें।
जंगल

18

ठीक है, पहुंच अपवाद इस तथ्य के कारण है कि document.domainआपके माता-पिता और आपके आइफ्रेम में मेल खाना चाहिए, और इससे पहले कि वे ऐसा करते हैं, आप प्रोग्राम document.domainको अपने आइफ्रेम की संपत्ति को निर्धारित करने में सक्षम नहीं होंगे ।

मुझे लगता है कि पृष्ठ का अपना सबसे अच्छा विकल्प अपने स्वयं के टेम्पलेट के लिए पृष्ठ को इंगित करना है:

iframe.src = '/myiframe.htm#' + document.domain;

और myiframe.htm में:

document.domain = location.hash.substring(1);

3
धन्यवाद, डेविड - मैं सराहना करता हूं जो एक ठोस सुझाव प्रतीत होता है, लेकिन मैं इस दृष्टिकोण को तब तक नहीं लेता जब तक कि यह अंतिम उपाय न हो। अगर मैं सही तरीके से समझूं, तो टेम्पलेट को मूल पृष्ठ के समान डोमेन पर रहने की आवश्यकता होगी (क्या यह सही है?), और वह हमारे ग्राहकों के लिए कार्यान्वयन को जटिल करेगा। आदर्श रूप से कार्यान्वयन उनके पृष्ठों के HTML में जावास्क्रिप्ट की कुछ पंक्तियों को सम्मिलित करने के समान सरल होना चाहिए।
बंगल

1
हां, समाधान के लिए उसी डोमेन पर एक और फ़ाइल की आवश्यकता होती है। मुझे डर है कि सबसे अच्छा मैं साथ आ सकता हूं, हालांकि।
डेविड हेडलंड

1
@ जंगल: मुझे लगता है कि यह आपका एकमात्र विकल्प है।
टिम डाउन

3

अच्छी तरह से मैं वास्तव में एक बहुत ही इसी तरह की समस्या है, लेकिन एक मोड़ के साथ ... कहते हैं कि शीर्ष स्तर की साइट a.foo.com है - अब मैं a.foo.com पर दस्तावेज़ डोमेन सेट करता हूं

फिर iframe में कि मैं / खुद बनाते हैं, मैं भी इसे सेट करें a.foo.com

ध्यान दें कि मैंने उन्हें बहुत अधिक foo.com b / c सेट नहीं किया है, पृष्ठ में bafoo.com को इंगित किया गया एक और iframe है (जो फिर से a.foo.com का उपयोग करता है, लेकिन मैं वहां स्क्रिप्ट कोड नहीं बदल सकता)

आप ध्यान दें कि im अनिवार्य रूप से document.domain की स्थापना कर रहा है जो पहले से ही वैसे भी होगा ... लेकिन मुझे यह करना होगा कि मैं bafoo.com से उल्लेखित अन्य iframe का उपयोग कर सकूं

मेरे फ्रेम के अंदर, डोमेन सेट करने के बाद, सभी iframes की समान सेटिंग होती है, फिर भी IE 6/7 में माता-पिता तक पहुंचने पर मुझे एक त्रुटि मिलती है

वहाँ अन्य चीजें हैं जो वास्तव में bizaree हैं

बाहर / शीर्ष स्तर में, अगर मैं इसके ऑनलोड इवेंट की प्रतीक्षा करता हूं, और टाइमर सेट करता हूं, तो आखिरकार मैं उस फ्रेम में पहुंच सकता हूं जिसकी मुझे आवश्यकता है .... लेकिन मैं नीचे से कभी नहीं पहुंच सकता ... और मैं वास्तव में करने में सक्षम होना चाहिए

यह भी अगर मैं foo.com होने के लिए सब कुछ सेट करता हूं (जो मैंने कहा कि मैं ऐसा नहीं कर सकता) आईटी काम करता है! लेकिन किसी कारण से, जब location.host के समान मूल्य का उपयोग कर रहा है .... यह नहीं है और इसके घातक मुझे मार रहा है .....


2

मैं सिर्फ उपयोग <iframe src="about:blank" ...></iframe>करता हूं और यह ठीक काम करता है।


2

IE के लिए, पोर्ट मायने रखता है। डोमेन के बीच, यह समान पोर्ट होना चाहिए।


1

क्या आपने jQuery.contents () की कोशिश की है ?


1
डेनिस, अच्छा सुझाव, और धन्यवाद - मैंने इसे एक शॉट दिया (देखें < troy.onespot.com/static/access_denied_jquery.html> ) लेकिन एक समान त्रुटि मिली; इस बार यह jQuery स्क्रिप्ट के भीतर "अनुमति अस्वीकृत" है। मुझे संदेह है कि यह समान या समान मार्ग है।
जंगल

1
क्षमा करें, वह URL मंगाई गई थी। प्रयास करें: troy.onespot.com/static/access_denied_jquery.html
बंगल

4
JQuery के iframe के दस्तावेज़ में जादुई पहुँच क्यों होगी?
टिम डाउन

8
@ नीचे नीचे: मुझे नहीं लगता कि धारणा यह थी कि jQuery का जादुई उपयोग होगा; इसके बजाय, jQuery में अक्सर क्रॉस-ब्राउज़र मुद्दों को हल करने के लिए अपनी आस्तीन ऊपर कुछ निफ्टी चालें होती हैं, और पहले से ही वर्कअराउंड लागू हो सकता है। मैं मानता हूं कि यह अच्छा नहीं था, लेकिन मुझे लगता है कि यह एक अच्छा सुझाव था और एक शॉट के लायक था।
जंगल

यह वास्तव में एक जवाब नहीं है। यह केवल एक सुझाव है और शायद मूल पोस्ट पर एक टिप्पणी के रूप में बेहतर होगा।
नील मुनरो

1

ऐसा लगता है कि IE के साथ समस्या तब आती है जब आप डॉक्यूमेंट के माध्यम से iframe को एक्सेस करने की कोशिश करते हैं। वर्कफ़्लो ऑब्जेक्ट - यदि आप किसी चर में बने iframe का संदर्भ संग्रहीत करते हैं तो आप चर के माध्यम से इंजेक्ट किए गए iframe को एक्सेस कर सकते हैं (my_iframe नीचे दिए गए कोड में ) का है।

मुझे यह IE6 / 7/8 में काम करने के लिए मिल गया है

var my_iframe;
var iframeId = "my_iframe_name"
if (navigator.userAgent.indexOf('MSIE') !== -1) {
  // IE wants the name attribute of the iframe set
  my_iframe = document.createElement('<iframe name="' + iframeId + '">');
} else {
  my_iframe = document.createElement('iframe');
}

iframe.setAttribute("src", "javascript:void(0);");
iframe.setAttribute("scrolling", "no");
iframe.setAttribute("frameBorder", "0");
iframe.setAttribute("name", iframeId);

var is = iframe.style;
is.border = is.width = is.height = "0px";

if (document.body) {
  document.body.appendChild(my_iframe);
} else {
  document.appendChild(my_iframe);
}

1
धन्यवाद। ऐसा लगता है कि मेरे लिए समस्या तय हो गई है।
vit

1
अजीब बात है, यह वही चीज थी जिसका मैं उपयोग कर रहा था। ठीक काम कर रहा था, अब अचानक, मैं गेटटीग एक्सेस से वंचित त्रुटियों को दूर रखता हूं
ठंढा विवर्णता

1

मेरे पास एक समान मुद्दा था और मेरा समाधान इस कोड स्निपेट (IE8 / 9, क्रोम और फ़ायरफ़ॉक्स में परीक्षण किया गया) था

var iframe = document.createElement('iframe');
document.body.appendChild(iframe);

iframe.src = 'javascript:void((function(){var script = document.createElement(\'script\');' +
  'script.innerHTML = "(function() {' +
  'document.open();document.domain=\'' + document.domain +
  '\';document.close();})();";' +
  'document.write("<head>" + script.outerHTML + "</head><body></body>");})())';

iframe.contentWindow.document.write('<div>foo</div>');

मैंने कई तरीके आज़माए हैं लेकिन यह सबसे अच्छा प्रतीत हुआ। आप यहाँ मेरे ब्लॉग पोस्ट में कुछ स्पष्टीकरण पा सकते हैं ।


1

Andralor से अत्यधिक सरल विधि के बाद यहाँ मेरे लिए मुद्दा तय किया गया: https://github.com/fancyapps/fancyBox/issues/766

अनिवार्य रूप से, iframe को फिर से चालू करें:

$('a.js-fancybox-iframe').fancybox({
    type: 'iframe',
    scrolling : 'visible',
    autoHeight: true,
    onUpdate: function(){
     $("iframe.fancybox-iframe");
   }
 });

-2

IE सभी अन्य ब्राउज़रों की तरह iframe के साथ काम करता है (कम से कम मुख्य कार्यों के लिए)। आपको बस नियमों का एक सेट रखना है:

  • इससे पहले कि आप iframe (js का वह हिस्सा जो iframe माता-पिता के बारे में जानने की जरूरत है) में कोई भी जावास्क्रिप्ट लोड करें, सुनिश्चित करें कि माता-पिता के पास document.domain है।
  • जब सभी iframe संसाधन लोड किए जाते हैं, तो document.domain को उसी रूप में परिवर्तित करें जैसा कि माता-पिता में परिभाषित किया गया है। (आपको बाद में ऐसा करने की आवश्यकता है क्योंकि डोमेन स्थापित करने से iframe संसाधन का अनुरोध विफल हो जाएगा)

  • अब आप मूल विंडो के लिए एक संदर्भ बना सकते हैं: var winn = window.parent

  • अब आप इसे हेरफेर करने के लिए पैरेंट HTML का संदर्भ ले सकते हैं: var parentContent = $ ('html', winn.document)
  • इस बिंदु पर आपके पास IE पैरेंट विंडो / डॉक्यूमेंट तक पहुंच होनी चाहिए और आप इसे अभ्यस्त होने पर बदल सकते हैं

-11

मेरे लिए मुझे बेहतर उत्तर मिला कि फ़ाइल अनुमति जाँचने के लिए कि पहुँच से वंचित किया जा रहा है।

मैं सिर्फ jQuery-1.8.0.js को अपडेट करता हूं और IE9 में एक्सेस अस्वीकृत त्रुटि प्राप्त कर रहा था।

विंडोज एक्सप्लोरर से

  • मैंने फ़ाइल को गुणों का चयन करने पर राइट क्लिक किया
  • सुरक्षा टैब का चयन किया
  • उन्नत बटन पर क्लिक किया
  • मालिक टैब का चयन किया
  • एडिट बटन पर क्लिक किया
  • चयनित प्रशासक (मशीननाम प्रशासक)
  • अप्लाई पर क्लिक किया
  • सभी खिड़कियां बंद कर दीं।

साइट का परीक्षण किया। और कोई मुद्दा नहीं।

मुझे jQuery-UI स्क्रिप्ट के लिए वही करना था जो मैंने अभी भी अपडेट किया था


2
मुझे लगता है कि आप एक अलग समस्या को हल कर रहे हैं।
डेनियल आयटेकिन

5
ओपी थर्ड पार्टी विजेट बना रहा है। विजेट प्रदर्शित करने के लिए आप इन सभी चरणों का पालन करने की उम्मीद नहीं कर सकते।
क्रिस्टोफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.