জাভাস্ক্রিপ্ট কলব্যাক আইএফআরএম লোড শেষ হয়ে গেলে?


147

আইএফআরএএম লোড করা শেষ হয়ে গেলে আমার কলব্যাক চালানো দরকার। আইএফআরএম-এর সামগ্রীতে আমার কোনও নিয়ন্ত্রণ নেই, তাই আমি সেখান থেকে কলব্যাকটি ফায়ার করতে পারি না।

এই আইএফআরএমে প্রোগ্রামগতভাবে তৈরি করা হয়েছে, এবং কলব্যাকের একটি ভেরিয়েবল হিসাবে আমার এর ডেটা পাস করার পাশাপাশি আইফ্রেমে নষ্ট করতে হবে।

কোন ধারনা?

সম্পাদনা করুন:

আমার এখন যা আছে তা এখানে:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.src = url;            
    document.body.appendChild(iFrameObj);   

    $(iFrameObj).load(function() 
    {
        document.body.removeChild(iFrameObj);
        callback(iFrameObj.innerHTML);
    });
}

আইফ্রেমটি লোড হওয়ার আগে এই কলব্যাক, সুতরাং কলব্যাকটিতে কোনও ডেটা ফেরেনি।


1
আমি মনে করি আপনি ইভেন্ট হ্যান্ডলারটি যদি ইফ্রেমে নিজেই সংযুক্ত করতে চান না তবে এটি সামগ্রীর উইন্ডো।
বোবুইনহোল্ট

1
ক্রস-ডোমেন অনুরোধটি সমস্যা।
ভিক্টর

আসলে, iframe অবজেক্টে এমন একটি লোড ইভেন্ট রয়েছে যা আইফ্রেমে ডকুমেন্ট লোড করা শেষ করে প্রতিবার গুলি
হুয়ান মেন্ডেস


: এখানে আমার উত্তর দেখুন stackoverflow.com/a/36155560/3894981
শহরবাসী

উত্তর:


49

প্রথমত, xssRequest ফাংশনটির নাম দিয়ে মনে হচ্ছে আপনি ক্রস সাইটের অনুরোধটি চেষ্টা করছেন - এটি যদি সঠিক হয় তবে আপনি যদি আইফ্রেমের বিষয়বস্তু পড়তে সক্ষম হবেন না।

অন্যদিকে, যদি আইফ্রেমের URL টি আপনার ডোমেনে থাকে তবে আপনি শরীরটি অ্যাক্সেস করতে পারবেন, তবে আমি খুঁজে পেয়েছি যে আমি যদি টাইমআউট ব্যবহার করে iframe অপসারণ করতে পারি কলব্যাকটি ঠিক কাজ করে:

// possibly excessive use of jQuery - but I've got a live working example in production
$('#myUniqueID').load(function () {
  if (typeof callback == 'function') {
    callback($('body', this.contentWindow.document).html());
  }
  setTimeout(function () {$('#frameId').remove();}, 50);
});

4
আপনি প্রতিস্থাপন করতে পারে $('body', this.contentWindow.document).html()সঙ্গেthis.contentDocument.body.outerHTML
স্যাম Soffes

12
JQuery ছাড়া এটি কিভাবে করবেন কোনও ধারণা?
devios1

6
JQuery 3.0 হিসাবে, loadচলে গেছে। .on('load', function() { ... })পরিবর্তে ব্যবহার করুন।
ডপেলগঙ্গার

36

আমি jQuery ব্যবহার করছি এবং আশ্চর্যরূপে এটি ভারী পৃষ্ঠাটি কেবল পরীক্ষা করা এবং ভারী পৃষ্ঠাটি লোড করার সাথে সাথে লোড হওয়ার মতো বলে মনে হচ্ছে এবং আমি iframe লোড না দেখে কয়েক সেকেন্ডের জন্য সতর্কতা পেলাম না:

$('#the_iframe').load(function(){
    alert('loaded!');
});

সুতরাং আপনি যদি jQuery ব্যবহার করতে না চান তবে তাদের উত্স কোডটি একবার দেখুন এবং দেখুন যদি এই ফাংশনটি iframe DOM উপাদানগুলির সাথে আলাদাভাবে আচরণ করে তবে আমি আগ্রহী এবং এখানে পোস্ট করার পরে আমি নিজেই এটির দিকে নজর দেব। এছাড়াও আমি কেবল সর্বশেষতম ক্রোমে পরীক্ষা করেছি।


আমি লক্ষ্য করেছি আপনি খাঁটি জাভাস্ক্রিপ্ট দিয়ে ডোম উপাদানটি তৈরি করেছেন এবং তারপরে নির্বাচক হিসাবে সেই ভেরিয়েবলটি jQuery এ চলে গেলেন, সম্ভবত আপনার কোডটি কাজ করছে না?
নিও

12
JQuery 3.0 হিসাবে, loadচলে গেছে। .on('load', function() { ... })পরিবর্তে ব্যবহার করুন।
ডপেলগঙ্গার

8

আপনার আইফ্রেমের অভ্যন্তরীণ এইচটিএমএল ফাঁকা কারণ আপনার আইফ্রেমে ট্যাগটি মূল দস্তাবেজের কোনও সামগ্রীকে ঘিরে না। পৃষ্ঠাগুলি থেকে iframe এর src বৈশিষ্ট্যটি উল্লেখ করা বিষয়বস্তুটি পেতে, আপনাকে iframe এর বিষয়বস্তু ডকুমেন্ট সম্পত্তি অ্যাক্সেস করতে হবে। যদিও এসসিআরটি অন্য কোনও ডোমেন থেকে আসে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হবে। এটি একটি সুরক্ষা বৈশিষ্ট্য যা আপনাকে অন্য কারও পৃষ্ঠায় স্বেচ্ছাসেবী জাভাস্ক্রিপ্ট কার্যকর করতে বাধা দেয়, যা ক্রস সাইট স্ক্রিপ্টিং দুর্বলতা তৈরি করে। এখানে আমি উদাহরণস্বরূপ কিছু কোড দিচ্ছি যা আমি বলছি:

<script src="http://prototypejs.org/assets/2009/8/31/prototype.js" type="text/javascript"></script>

<h1>Parent</h1>

<script type="text/javascript">
function on_load(iframe) {
  try {
    // Displays the first 50 chars in the innerHTML of the
    // body of the page that the iframe is showing.
    // EDIT 2012-04-17: for wider support, fallback to contentWindow.document
    var doc = iframe.contentDocument || iframe.contentWindow.document;
    alert(doc.body.innerHTML.substring(0, 50));
  } catch (e) {
    // This can happen if the src of the iframe is
    // on another domain
    alert('exception: ' + e);
  }
}
</script>
<iframe id="child" src="iframe_content.html" onload="on_load(this)"></iframe>

উদাহরণটি আরও জানাতে, এটিকে iframe এর সামগ্রী হিসাবে ব্যবহার করার চেষ্টা করুন:

<h1>Child</h1>

<a href="http://www.google.com/">Google</a>

<p>Use the preceeding link to change the src of the iframe
to see what happens when the src domain is different from
that of the parent page</p>

1
বিষয়বস্তু ডকুমেন্ট সম্পত্তি আই 7 দ্বারা সমর্থিত নয় এবং সম্ভবত আরও আইআই এরও, আইইয়ের সাথে ডিল করার উপায়টি উইন্ডো ['iframeid']। নথি বা ঠিক একই উইন্ডোফ্রেমস কি [[iframeid ']। ডকুমেন্ট প্রুফ লিঙ্কটি এখানে বিকাশকারী। mozilla.org/en/…
ওলগা

7

ওয়ার্ড ডক্স এবং পিডিএফএস এর মতো নথিগুলি যদি আইফ্রেমে প্রবাহিত হচ্ছিল এবং একটি সমাধান খুঁজে পেয়েছিল যা বেশ ভালভাবে কাজ করে I কীটি onreadystatechangediframe এ ইভেন্টটি পরিচালনা করছে ।

আপনার ফ্রেমের নামটি "মাইআইফ্রেম" বলতে দিন। আপনার কোড শুরু করার আগে কোথাও কোথাও (আইফ্রেমের পরে এটি কোনওখানেই ইনলাইন করি) ইভেন্ট হ্যান্ডলারটি রেজিস্টার করতে এই জাতীয় কিছু যুক্ত করুন:

document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;

আমি যদি ইফ্রামে একটি অ্যানডিস্টেটেচেজ অ্যাট্রিবিউট ব্যবহার করতে পারিনি, তবে কেন তা মনে করতে পারছি না, তবে অ্যাপ্লিকেশনটি আইই 7 এবং সাফারি 3 তে কাজ করতে হয়েছিল, যাতে এটি কোনও কারণ হতে পারে।

সম্পূর্ণ রাষ্ট্র কীভাবে পাওয়া যায় তার উদাহরণ এখানে রয়েছে:

function MyIframeReadyStateChanged()
{
    if(document.getElementById('myIframe').readyState == 'complete')
    {
        // Do your complete stuff here.
    }
}

6

আই ফ্রেমে যখন আই ফ্রেমের সামগ্রী পুরোপুরি লোড হয় তখন আমি ওয়েটিং স্পিনার ডিভটি আড়াল করতে চেয়েছিলাম, স্ট্যাকওভারফ্লো.কম-এ উল্লিখিত প্রতিটি সমাধানের আমি আক্ষরিক অর্থে চেষ্টা করেছি, কিন্তু আমি যা চাইছিলাম তেমন কিছুই করেনি।

তারপরে আমার ধারণা ছিল, যখন আই ফ্রেম সামগ্রী সম্পূর্ণ লোড হয়, তখন is (উইন্ডো) লোড ইভেন্টটি বরখাস্ত করা যেতে পারে। এবং ঠিক তাই ঘটেছে। সুতরাং, আমি এই ছোট স্ক্রিপ্টটি লিখেছি, এবং যাদুর মতো কাজ করেছি:

     $(window).load(function () {
     //alert("Done window ready ");
     var lblWait = document.getElementById("lblWait");
     if (lblWait != null ) {
         lblWait.style.visibility = "false";
         document.getElementById("divWait").style.display = "none";
     }
 });

আশাকরি এটা সাহায্য করবে.


এটি একটি সহজ সমাধান এবং পুরো পৃষ্ঠাটি লোড হওয়ার পরে আপনার জাভাস্ক্রিপ্টটি কার্যকর করতে চাইলে কাজ করে। এর অর্থ হ'ল প্রথমে আপনি সম্পূর্ণ লোড হওয়া পৃষ্ঠাটি, জেএস প্রভাব ছাড়াই দেখতে পাবেন এবং জাভাস্ক্রিপ্ট দ্বারা যা কিছু পরিবর্তন তৈরি হবে তা সম্ভবত দ্বিতীয় বা দু'বার (বোঝার উপর নির্ভরশীল) পরে ঘটবে। আমি ব্যক্তিগতভাবে আমার আইফ্রেমের আকার পরিবর্তন করতে চেষ্টা করেছি এবং আপনি যদি কোনও পৃষ্ঠায় ক্লিক করার পরে প্রথম তিন সেকেন্ডের জন্য পর্দার দিকে মনোযোগ না দেন তবে এটি কাজ করে তবে অন্যথায় এটি (আমার ক্ষেত্রে যেমন ছিল) কোডটিতে প্যাচওয়ার্ক হিসাবে উপস্থিত হতে পারে।
অ্যাম্পারস্যান্ডগুলি

1
আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ, এই সমাধানটি আমার কেস আকারে দুর্দান্ত কাজ করেছে, যেহেতু আমি চাইছিলাম পৃষ্ঠাটি লোড হওয়ার পরে iframe লোড করা উচিত।
নদা এন। হান্টুলি

2

আপনার মতো আমারও একই সমস্যা ছিল। আমি যা করেছি তা হ'ল আমি jQuery নামক কিছু ব্যবহার করি। আপনি তখন জাভাস্ক্রিপ্ট কোডটিতে যা করেন তা হ'ল:

$(function(){ //this is regular jQuery code. It waits for the dom to load fully the first time you open the page.

    $("#myIframeId").load(function(){
       callback($("#myIframeId").html());
       $("#myIframeId").remove();

    });

});

দেখে মনে হচ্ছে আপনি এটি থেকে এইচটিএমএল ধরার আগে আপনি আইফ্রেমে মুছে ফেলেছেন। এখন, আমি এটি দিয়ে একটি সমস্যা দেখতে পাচ্ছি: পি

আশাকরি এটা সাহায্য করবে :).


1

আমার প্রকল্পগুলিতে আমার অনুরূপ কোড রয়েছে যা সূক্ষ্মভাবে কাজ করে। আমার কোডটিকে আপনার কার্যক্রমে মানিয়ে নেওয়া, একটি সমাধান নিম্নলিখিত হতে পারে:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.id = 'myUniqueID';
    document.body.appendChild(iFrameObj);       
    iFrameObj.src = url;                        

    $(iFrameObj).load(function() 
    {
        callback(window['myUniqueID'].document.body.innerHTML);
        document.body.removeChild(iFrameObj);
    });
}

হতে পারে আপনার একটি খালি অভ্যন্তর এইচটিএমএল আছে কারণ (এক বা উভয় কারণ): ১. আপনার এটি শরীরের উপাদানটির বিরুদ্ধে ব্যবহার করা উচিত you


1

আমি মনে করি লোড ইভেন্টটি সঠিক। যা সঠিক নয় তা হ'ল আপনি যদি আইফ্রেমে কন্টেন্ট ডোম থেকে সামগ্রী পুনরুদ্ধার করতে ব্যবহার করেন।

আপনার যা দরকার তা হল পৃষ্ঠার এইচটিএমএল যদি ইফ্রেমে লোড করা হয় তবে আইফ্রেমে অবজেক্টের এইচটিএমএল নয়।

আপনাকে যা করতে হবে তা হ'ল বিষয়বস্তু দস্তাবেজটি অ্যাক্সেস করা iFrameObj.contentDocument । এটি যদি বর্তমান পৃষ্ঠার একই ডোমেইনে থাকে তবে এটি iframe এর ভিতরে থাকা পাতার ডোমটি প্রদান করে।

আমি iframe অপসারণ করার আগে বিষয়বস্তু পুনরুদ্ধার করতে হবে।

আমি ফায়ারফক্স এবং অপেরা পরীক্ষা করেছি।

তারপরে আমি মনে করি আপনি $(childDom).html()বা এর সাথে আপনার ডেটা পুনরুদ্ধার করতে পারেন$(childDom).find('some selector') ...


0

আমি অতীতে ঠিক একই সমস্যাটি পেয়েছি এবং এটির সমাধানের একমাত্র উপায়টি ছিল iframe পৃষ্ঠায় কলব্যাক যুক্ত করা। অবশ্যই এটি তখনই কাজ করে যখন আপনার যদি আইফ্রেমে সামগ্রীতে নিয়ন্ত্রণ থাকে।


22
আমি আপনাকে ভোট দিলাম না, তবে আমি ভেবেছিলাম আপনি ভোট পেয়েছেন কারণ তিনি ঠিক কী বলেছিলেন যে তিনি যা করতে পারবেন না - তিনি স্পষ্টভাবে বলেছিলেন, "আইএফআরএম এর সামগ্রীতে আমার কোনও নিয়ন্ত্রণ নেই, তাই আমি করতে পারি ' টি সেখান থেকে কলব্যাক ফায়ার করুন "
ডেভ হেইনেস

-1

onloadঅ্যাট্রিবিউট ব্যবহার করা আপনার সমস্যার সমাধান করবে।

এখানে একটি উদাহরণ।

function a() {
alert("Your iframe has been loaded");
}
<iframe src="https://stackoverflow.com" onload="a()"></iframe>

এই কমান্ডের সাহায্যে আপনি চান কি?

এখানে ক্লিক করুন আরও তথ্যের জন্য।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.