ইফ্রামে সামগ্রীটি লোড হওয়ার পরে সনাক্ত করা হচ্ছে (ক্রস ব্রাউজার)


91

আমি যখন কোনও আইফ্রেমে এবং এর সামগ্রীতে লোড হয়েছে তবে ভাগ্য বেশি নয় তা সনাক্ত করার চেষ্টা করছি। আমার অ্যাপ্লিকেশনটি প্যারেন্ট উইন্ডোতে পাঠ্য ক্ষেত্রে কিছু ইনপুট নেয় এবং একটি 'লাইভ পূর্বরূপ' সরবরাহ করতে iframe আপডেট করে

আইফ্রেমে লোড ইভেন্টটি কখন ঘটে তা সনাক্ত করতে আমি নিম্নলিখিত কোড (YUI) দিয়ে শুরু করেছি।

$E.on('preview-pane', 'load', function(){
    previewBody = $('preview-pane').contentWindow.document.getElementsByTagName('body')[0];
}

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

মূলত, আমি যদি জিজ্ঞাসা করছি যে ব্রাউজারগুলি জুড়ে সঠিক পদ্ধতিটি কী তা সনাক্ত করতে যখন আইফ্রেমটি লোড হয়ে গেছে এবং এর নথিটি প্রস্তুত রয়েছে?


4
YUI দিয়ে শুরু করা একটি খারাপ ধারণা (পাশাপাশি অন্য কোনও জেএস লাইব্রেরি)। কেন? কারণ আপনি জানেন না যে সেই লাইব্রেরিটি কী জাদু করছে। যদি তারা পুরোপুরি "লোড" সমর্থন করতে না পারে তবে আপনি নিজের থেকে পরিষ্কার এবং পঠনযোগ্য জাভাস্ক্রিপ্টে আরও ভাল করতে চাই।
খ্রিস্টান

4
আপনি প্রায়শই @ ক্রিশ্চিয়ানের লাইব্রেরির উত্স কোডটি পড়তে পারেন। আমি দেখতে পাই এটি সাধারণত আপনি কীভাবে তা প্রয়োগ করতে পারেন তা আপনি তার বাস্তবায়ন ব্যবহার করেন কিনা তা নির্বিশেষে আপনাকে দুর্দান্ত টিপস দেয় find
এজেপি

@ এজেপি আপনি আমার বক্তব্য ভুল বুঝেছেন। আপনি যদি এমন কিছু করছেন যা আপনি নিশ্চিত নন, কম কোড থাকা ভাল তাই ত্রুটির জন্য কম জায়গা রয়েছে।
খ্রিস্টান

4
তুমি কিভাবে এটি দেখ তার উপর নির্ভর করে। আমি জানতাম যে ওয়াইইউআইয়ের ইভেন্ট হ্যান্ডলিং সেই সময়ে কাজ করেছিল, তাই কোডের সেই অংশটি নিয়ে আমাকে চিন্তা করতে হবে না। আমি নিজের অ্যাডএভেন্ট হ্যান্ডলারটি কীভাবে লিখতে হবে তাও জানতাম, এটি নয় যে এই সমস্যাটি সম্পর্কিত YUI এর চেয়ে ভাল কোনও কাজ করেছে।
ডেভিড স্নাবেল-কাউন্ট

4
@ নিকো প্রশ্নটি YUI কে বোঝায় এবং Y YUI এর ডোম র‌্যাপারের একটি উপনাম।
ডেভিড স্নাবেল-কাউন্ট

উত্তর:


73

যখন iframe লোড হয়েছে এবং এর নথি প্রস্তুত আছে তা সনাক্ত করতে?

আপনি যদি ফ্রেমের অভ্যন্তরে কোনও স্ক্রিপ্ট থেকে নিজেকে জানানোর জন্য iframe পেতে পারেন তবে এটি আদর্শ। উদাহরণস্বরূপ এটি প্রস্তুত হওয়ার জন্য এটি সরাসরি কোনও পিতামাতার ফাংশনকে কল করতে পারে। ক্রস-ফ্রেম কোড সম্পাদন সহ সর্বদা যত্নের প্রয়োজন হয় কারণ জিনিসগুলি আপনি যে ক্রমটি আশা করেন না সেভাবে ঘটতে পারে। আরেকটি বিকল্প হ'ল 'var isডি = সত্য;' এর নিজস্ব সুযোগে এবং 'কন্টেন্টউইন্ডো.আইস্রিডিয়' এর জন্য পিতামাতার স্ক্রিপ্টটি শুকনো করুন (এবং না থাকলে ওভারলোড হ্যান্ডলার যুক্ত করুন)।

যদি কোনও কারণে যদি ইফ্রেমে ডকুমেন্টটি সহযোগিতা করা ব্যবহারিক না হয় তবে আপনি প্রচলিত লোড-রেসের সমস্যাটি পেয়েছেন, যেমন উপাদানগুলি একে অপরের পাশে থাকলেও:

<img id="x" ... />
<script type="text/javascript">
    document.getElementById('x').onload= function() {
        ...
    };
</script>

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

লোড-দৌড়ের উপায়গুলি হ'ল:

  1. আইই তে, আপনি 'রেডিস্টেট' সম্পত্তি ব্যবহার করতে পারেন কোনও কিছু ইতিমধ্যে লোড হয়েছে কিনা তা দেখতে;

  2. যদি কেবল জাভাস্ক্রিপ্ট সক্ষম থাকা আইটেমটি উপলব্ধ থাকে তবে তা গ্রহণযোগ্য হয়, আপনি উত্স নির্ধারণের আগে এবং পৃষ্ঠায় সংযোজন করার আগে 'ওললোড' ইভেন্টের ক্রিয়াকলাপটি সেট করে গতিশীলভাবে এটি তৈরি করতে পারেন। এক্ষেত্রে কলব্যাক সেট হওয়ার আগে এটি লোড করা যায় না;

  3. মার্কআপে এটি অন্তর্ভুক্ত করার পুরাতন স্কুল পদ্ধতি:

    <img onload="callback(this)" ... />

এইচটিএমএল-এ ইনলাইন 'অনসামিং' হ্যান্ডলারগুলি প্রায়শই সবসময় ভুল জিনিস এবং এড়ানো যায়, তবে এই ক্ষেত্রে কখনও কখনও এটি সর্বনিম্ন খারাপ বিকল্প।


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

8
-1 - ইনলাইন ইভেন্টগুলি "খারাপ" নয়, এটি কেবলমাত্র বর্তমান অভ্যাস। প্রকৃতপক্ষে, ইনলাইন ইভেন্টগুলি ডিবাগ করা এবং বুঝতে সহজ, তাদের যাদুকর অংশগুলির তুলনায় (যা অন্যদিকে সংযুক্তি, স্ট্যাক এবং বিজোড়ভাবে ব্যবহার করা সহজ)।
খ্রিস্টান

4
@ ক্রিশ্চিয়ান, যখন আপনাকে একটি দীর্ঘ দীর্ঘ তালিকার প্রতিটি উপাদানগুলির সাথে কোনও ইভেন্ট সংযুক্ত করার দরকার হয় তখন ইনলাইন ইভেন্টগুলিও সেরা বিকল্প। যেহেতু আপনি সার্ভার সাইডে তালিকাটি তৈরি করতে ইতিমধ্যে লুপিং করছেন তাই ইনলাইন-ইভেন্টটি সংযুক্ত করা আরও বেশি দক্ষ।
haknick

16
@haknick আপনি কি তালিকার একক ইভেন্ট শ্রোতাদের ব্যবহার করতে এবং কোনও ইভেন্ট প্রতিনিধি ব্যবহার করতে চান না? এটি আরও দক্ষ হবে।
ডেভিড স্নাবেল-কাউন্ট

4
যদি iframe ক্রস-ডোমেন হয় তবে এটি কাজ করবে না। Iframe এর ভিতরে স্ক্রিপ্টটি প্যারেন্ট উইন্ডোতে অ্যাক্সেস করতে পারে না।
সুধীর সোমেশ্বর

48

দেখুন এই ব্লগ পোস্টে। এটি jQuery ব্যবহার করে তবে এটি ব্যবহার না করা সত্ত্বেও এটি আপনাকে সহায়তা করবে।

মূলত আপনি এটি আপনার যুক্ত করুন document.ready()

$('iframe').load(function() {
    RunAfterIFrameLoaded();
});

আকর্ষণীয়, তবে আমার সমস্যাটি লোড ইভেন্ট এবং সময় নিয়ে with আমি নিবন্ধটির পরামর্শ অনুযায়ী লোড ইভেন্টের জন্য শুনছি।
ডেভিড স্নাবেল-কাউন্ট

আমি সঙ্গে এই চেষ্টা করেছি console.log। এটি iframe লোড হওয়ার পরে লগ হয়।
shorif2000 11

12

যাঁরা প্রতিক্রিয়া ব্যবহার করছেন, তাদের ক্ষেত্রে একই-উত্সযুক্ত iframe লোড ইভেন্টটি সনাক্ত onLoadকরা আইফ্রেমে উপাদানটিতে ইভেন্ট শ্রোতাদের সেট করার মতোই সহজ ।

<iframe src={'path-to-iframe-source'} onLoad={this.loadListener} frameBorder={0} />


onLoadইভেন্টটি কি কেবল একই-উত্সের ইফ্রেমের জন্য ট্রিগার করতে পারে ?
L_K

2

আম্বর ব্যবহারকারী যে কোনও ব্যক্তির ক্ষেত্রে, এটি প্রত্যাশা অনুযায়ী কাজ করা উচিত:

<iframe onLoad={{action 'actionName'}}  frameborder='0' src={{iframeSrc}} />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.