মূল পৃষ্ঠা থেকে একটি আইফ্রেমে জাভাস্ক্রিপ্ট কোড চালু করা vo


615

মূলত, আমার iframeএকটি পৃষ্ঠায় একটি এম্বেড iframeরয়েছে এবং প্যারেন্ট পৃষ্ঠা থেকে আমার জাভাস্ক্রিপ্টের রুটিনগুলি প্রয়োজন।

এখন বিপরীতটি বেশ সহজ কারণ আপনার কেবল কল করা দরকার parent.functionName(), তবে দুর্ভাগ্যক্রমে আমার এটির ঠিক বিপরীত দরকার।

দয়া করে মনে রাখবেন আমার সমস্যা উৎস পরিবর্তন করা হয় না URL টি এর iframe, কিন্তু একটি ফাংশন সংজ্ঞায়িত invoking iframe


42
প্যারেন্ট.ফুকটিওনাম () সম্পর্কে আপনার নোটটি iframe এর প্যারেন্ট এইচটিএমএলে কোনও ফাংশন কল করার আমার সমস্যার সমাধান করেছে। ধন্যবাদ!
সাইবারফোনিক

1
ডিবাগ করার সময় আপনি উইন্ডো.লোকেশন.href বা প্যারেন্ট.লোকেশন.হিরফের মতো আইফ্রেমের ইউআরএল দেখার জন্য যদি আপনি যাচাই করতে চান তবে আপনার যদি অনুসন্ধান করা আইফ্রেমে একটি রেফারেন্স আছে কিনা তা করতে পারেন Note
অ্যারোনলএস

@ ডরফিয়ারের উত্তর দেখুন ... আমার জন্য নিখুঁতভাবে কাজ করেছে।
এরিকবেস্ট

উত্তর:


542

ধরুন আপনার আইফ্রেমের আইডি "টার্গেটফ্রেম" এবং আপনি যে ফাংশনটিতে কল করতে চান তা হ'ল targetFunction():

document.getElementById('targetFrame').contentWindow.targetFunction();

window.framesপরিবর্তে ব্যবহার করে আপনি ফ্রেমেও অ্যাক্সেস করতে পারেন document.getElementById

// this option does not work in most of latest versions of chrome and Firefox
window.frames[0].frameElement.contentWindow.targetFunction(); 

3
এফএফ 7, ক্রোম 12, আইই 8/9, এবং সাফারি (এই সংস্করণটির বিষয়ে নিশ্চিত নয়)
ডারসি

3
এই সমাধানটি আমার গ্যাজেটের জন্য কাজ করে না, এখানে আমার কোড document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadg‌​et('verify_user');"রিমোট_আইফ্রেমেটি একটি অ্যাপাচি শ্যান্ডিগ সার্ভার দ্বারা প্রোগ্রামমেটিক্যালি তৈরি করা হয়েছে তবে window.parent.document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadg‌​et('verify_user');"কাজ করে
জে বোর্নে

3
@ ডার্টি হেনরি "jQuery ফাংশন" বলতে আপনার অর্থ কী? jQuery একটি জাভাস্ক্রিপ্ট লাইব্রেরি।
জোয়েল আনায়ের

8
@ জেলিকেলকিটিক্স কারণ বার্তাটি আপনাকে যেমন বলে তেমনি প্যারেন্ট পেজ এবং আইফ্রেমের পৃথক হোস্ট রয়েছে যা এটিকে ক্রস-অরিজিন ফ্রেম করে। যতক্ষণ না মূল পৃষ্ঠার প্রোটোকল, ডোমেন এবং পোর্ট এবং আইফ্রেমে মিল থাকে ততক্ষণ সবকিছু ঠিকঠাক কাজ করবে।
মার্ক আমেরিকা

1
আমি উল্লিখিত উইন্ডো.ফ্রেমস পদ্ধতিটি কীভাবে ব্যবহার করব সে সম্পর্কে একটি উদাহরণ যুক্ত করেছি।
এলিজা লিন

145

এখানে সচেতন হওয়ার জন্য কয়েকটি গণ্ডগোল রয়েছে।

  1. HTMLIFrameElement.contentWindowসম্ভবত এটি সহজ উপায়, তবে এটি কোনও প্রমিত সম্পত্তি নয় এবং কিছু ব্রাউজার এটি সমর্থন করে না, বেশিরভাগ বয়স্ক। এটি কারণ DOM স্তর 1 এইচটিএমএল স্ট্যান্ডার্ড windowঅবজেক্ট সম্পর্কে কিছুই বলার নেই ।

  2. আপনি চেষ্টাও করতে পারেন HTMLIFrameElement.contentDocument.defaultView, যা বেশ কয়েকটি পুরানো ব্রাউজারগুলি অনুমতি দেয় তবে আইই তা দেয় না। তবুও, স্ট্যান্ডার্ডটি স্পষ্টভাবে বলতে পারে না যে আপনি window(1) হিসাবে একই কারণে আপনি বস্তুটি ফিরে পেয়েছেন, তবে যত্ন নেওয়া যদি আপনি এখানে কিছু অতিরিক্ত ব্রাউজার সংস্করণ চয়ন করতে পারেন।

  3. window.frames['name']উইন্ডো ফিরিয়ে দেওয়া প্রাচীনতম এবং তাই সবচেয়ে নির্ভরযোগ্য ইন্টারফেস। তবে আপনাকে পরে name="..."নামের সাথে একটি ফ্রেম পেতে সক্ষম করতে একটি অ্যাট্রিবিউট ব্যবহার করতে হবে, যা সামান্য কুৎসিত / অবচিত / ট্রানজিশনাল। ( id="..."আরও ভাল হবে তবে আই আই পছন্দ করে না।)

  4. window.frames[number]এছাড়াও খুব নির্ভরযোগ্য, কিন্তু সঠিক সূচক জেনে রাখা কৌশল। আপনি এই উদ্যান সঙ্গে দূরে পেতে পারেন। যদি আপনি জানেন তবে আপনার পৃষ্ঠায় কেবলমাত্র একটি আইফ্রেম রয়েছে।

  5. শিশু ইফ্রেমে এখনও লোড হয়নি এমনটি সম্পূর্ণরূপে সম্ভব বা এটিকে অ্যাক্সেসযোগ্য করে তুলতে অন্য কিছু ভুল হয়েছে। আপনার যোগাযোগের প্রবাহকে বিপরীত করা সহজতর হতে পারে: এটি হ'ল, যদি সন্তানের window.parentলোড শেষ হয়ে যায় এবং ফিরে ডাকার জন্য প্রস্তুত হয় তবে শিশুটিকে যদি তার স্ক্রিপ্টটি অবহিত করে । প্যারেন্ট স্ক্রিপ্টে তার নিজস্ব একটি বস্তুর (যেমন: একটি কলব্যাক ফাংশন) পাস করার মাধ্যমে, পিতামাতা তারপরে কী HTML HTML ফ্রেম উপাদানটির সাথে সম্পর্কিত তা চিন্তা না করেই iframe এর স্ক্রিপ্টের সাথে সরাসরি যোগাযোগ করতে পারেন।


13
দুর্দান্ত জিনিস! বিশেষত আপনার পরামর্শ 5. অত্যন্ত মূল্যবান বলে দেখানো হয়েছে। Chrome এ পিতা-মাতার কাছ থেকে আইফ্রেম ফাংশনগুলি অ্যাক্সেস করার চেষ্টা করার সময় এটি আমার অনেক মাথা ব্যাথার সমাধান করে। আইফ্রেম থেকে ফাংশন অবজেক্টটি পাস করার ফলে এটি ক্রোম, এফএফ এবং এমনকি আইআই তে 9 থেকে নীচে 7 পর্যন্ত মনোযোগের মতো চালিয়ে যায় এবং ফাংশনটি ইতিমধ্যে লোড হয়েছে কিনা তা পরীক্ষা করে নেওয়া খুব সহজ করে তোলে। ধন্যবাদ!
জেপসি

3 নম্বর কাজ করে, তবে আপনি যদি এটি করেন তবে ভাল @ ডরফায়ার এটিকে তার মন্তব্যে রাখেন। methode()অংশটি লক্ষ্য করুন ।
এরিকবেস্ট

দয়া করে নোট করুন যে আধুনিক ব্রাউজারগুলিতে সুরক্ষা বিধিনিষেধের কারণে (পরীক্ষিত এফএফ 29 এবং Chrome34) আপনি যেখানে আপনার ফাংশন কলটি রাখেন তা অনেকটাই গুরুত্বপূর্ণ। কেবলমাত্র কোনও স্ক্রিপ্ট ট্যাগ বা document (দস্তাবেজ) থেকে ফাংশনটি কল করা প্রস্তুতি () কাজ করবে না। পরিবর্তে শরীরের লোড থাকলে ট্যাগ ভিতরে কল করা, অথবা একটি নোঙ্গর <a href="javascript:doit();"> এটা </a> যেমন (দেখুন elswhere প্রস্তাব না মধ্যে stackoverflow.com/questions/921387/... )। কলব্যাক হিসাবে কোনও স্ক্রিপ্টে ফাংশন কল পাস করাও সাধারণত কাজ করে।
শিরোনাম

@ শেভি: না, এই সম্পর্কে বিবেকের উত্তরে স্পষ্টতা দেখুন।
বোবিনস

66

যে কোনও প্যারেন্ট জেএস ফাংশন থেকে কল iframeকরা সম্ভব, তবে কেবলমাত্র যখন পিতা-মাতা এবং এর মধ্যে থাকা পৃষ্ঠা উভয়ই iframeএকই ডোমেন অর্থাৎ abc.com থেকে আসে এবং উভয়ই একই প্রোটোকল ব্যবহার করে থাকে উভয়ই হয় হয় http://অথবা হয় https://

কলটি নীচে উল্লিখিত ক্ষেত্রে ব্যর্থ হবে:

  1. মূল পৃষ্ঠা এবং iframe পৃষ্ঠাটি বিভিন্ন ডোমেন থেকে আসে।
  2. তারা বিভিন্ন প্রোটোকল ব্যবহার করছে, একটি হ'ল http: // এ এবং অন্যটি https: // এ।

এই বিধিনিষেধের কোনও কার্যকারিতা অত্যন্ত নিরাপত্তাহীন হবে।

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


6
কার্যসংক্রান্ত সুন্দর এবং বিপজ্জনক ব্যবহার করা en.wikipedia.org/wiki/Cross-document_messaging
Laramie ডাক

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

1
দ্রষ্টব্য, এটি বিভিন্ন পোর্ট সংখ্যার জন্যও ব্যর্থ হবে। অর্থাত abc.com:80 = abc.com:8080!
prasanthv

31

আইএফআরএমে আপনার ফাংশনটি উইন্ডো অবজেক্টে সর্বজনীন করুন:

window.myFunction = function(args) {
   doStuff();
}

মূল পৃষ্ঠা থেকে অ্যাক্সেসের জন্য, এটি ব্যবহার করুন:

var iframe = document.getElementById("iframeId");
iframe.contentWindow.myFunction(args);

দুর্দান্ত উত্তর এখানে কনভেনশন সম্পর্কে নিশ্চিত নই। আমার একটি ফলোআপ প্রশ্ন আছে। আমার যদি নতুন প্রশ্ন শুরু করা উচিত তবে আমি করব। আমার একটা সমস্যা আছে আমার পৃষ্ঠার iframe গতিশীল পপুলেট হয়। এটিতে একটি বোতাম রয়েছে যার onclick()ইভেন্টটি কেবল কল করে window.print()। এই ছাপে বিষয়বস্তু এর iframeপুরোপুরি। তবে যখন ইফ্রামের পৃষ্ঠার পাবলিক ফাংশন কল করে window.print()এবং পিতামাতার পৃষ্ঠাটি যদি সর্বজনীন ফাংশন কল করে তবে পিতামাতার সামগ্রী মুদ্রিত হয়। আমার কীভাবে এটি কোড করা উচিত যাতে window.print()জনসাধারণের অনুষ্ঠানে কলটি onclickইভেন্টের মতো হয়?
কার্ল

1
@Karl আপনি কল করতে না চান onclick। আপনি কল করতে চান iframe.contentWindow.print()
তোমালাক

দুর্ভাগ্যক্রমে, এটি কাজ করে না। হয়তো আমার একটি নতুন প্রশ্ন শুরু করা উচিত এবং আমার কোডটি নথিভুক্ত করা উচিত? যেভাবেই হোক, পিতামাতার পৃষ্ঠার সামগ্রীগুলিও মুদ্রণ করে। document.getElementById('myFrame').contentWindow.print();' and the pubic function প্রিন্টকন্ট () `(অনকিক ইভেন্ট হ্যান্ডলার নয়) যা কল করে window.print()তাকে এইভাবে বলা হয়েছিল:document.getElementById('myFrame').contentWindow.printContent();
কার্ল

1
@ কার্ল - হ্যাঁ, তবে নতুন প্রশ্ন শুরু করা ভাল। যদি না প্যারেন্ট উইন্ডোটি আইফ্রেমের চেয়ে আলাদা ডোমেনে থাকে। তাহলে আপনার চেষ্টা করা কোনও কিছুই কার্যকর হবে না
টমলাক

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

20

যদি আইফ্রেমের লক্ষ্য এবং ধারণকৃত ডকুমেন্টটি অন্য কোনও ডোমেনে থাকে তবে পূর্বে পোস্ট করা পদ্ধতিগুলি কার্যকর নাও হতে পারে, তবে একটি সমাধান রয়েছে:

উদাহরণস্বরূপ, যদি ডকুমেন্ট এ-তে একটি আইফ্রেমে উপাদান থাকে যা ডকুমেন্ট বি এবং ডকুমেন্ট এ স্ক্রিপ্টে ডকুমেন্ট বি এর উইন্ডো অবজেক্টে পোস্ট ম্যাসেজ () কল করে থাকে, তবে সেই বার্তায় একটি বার্তা ইভেন্ট নিক্ষেপ করা হবে, এর উইন্ডো থেকে উত্পন্ন হিসাবে চিহ্নিত হয়েছে marked ডকুমেন্ট এ ডকুমেন্টের স্ক্রিপ্টটি দেখতে দেখতে এটির মতো হতে পারে:

var o = document.getElementsByTagName('iframe')[0];
o.contentWindow.postMessage('Hello world', 'http://b.example.org/');

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

window.addEventListener('message', receiver, false);
function receiver(e) {
  if (e.origin == 'http://example.com') {
    if (e.data == 'Hello world') {
      e.source.postMessage('Hello', e.origin);
    } else {
      alert(e.data);
    }
  }
}

এই স্ক্রিপ্টটি প্রথমে ডোমেনটি প্রত্যাশিত ডোমেনটি পরীক্ষা করে এবং তারপরে সেই বার্তাটি দেখায় যা এটি ব্যবহারকারীকে প্রদর্শন করে অথবা ডকুমেন্টটিতে বার্তা প্রেরণ করে যা প্রতিক্রিয়াটিকে প্রথম স্থানে প্রেরণ করে তাতে সাড়া দেয়।

http://dev.w3.org/html5/postmsg/#web- ম্যাসেজিংয়ের মাধ্যমে


1
ইজিএক্সডিএম পুরানো ব্রাউজারগুলির জন্য পোস্টমেসেজের উপরে বিমূর্ততা সরবরাহ করে (একগুঁয়ে ডাইনোসরগুলির জন্য একটি ফ্ল্যাশ (লোকাল সংযোগ) ফ্যালব্যাক সহ)।
জনি রিভিউস

1
এটি দুর্দান্ত ... উপরের উত্তরগুলি চেষ্টা করার পরে অবশেষে আমি আপনার উত্তর পেয়েছি, ধন্যবাদ!
ভিকেগুনাসেকরণ

9

কেবল রেকর্ডের জন্য, আমি আজ একই ইস্যুতে দৌড়েছি কিন্তু এবার পৃষ্ঠাটি কোনও আইবেমে এম্বেড করা হয়েছিল, আইফ্রেমে নয় (যেহেতু এটি একটি এক্সএইচটিএমএল 1.1 নথি ছিল)। এটি কীভাবে বস্তুর সাথে কাজ করে:

document
  .getElementById('targetFrame')
  .contentDocument
  .defaultView
  .targetFunction();

(কুরুচিপূর্ণ রেখা বিরতির জন্য দুঃখিত, একটি লাইনে ফিট হয়নি)


8

আইএফআরএএম frames[]সংগ্রহের মধ্যে থাকা উচিত । এর মতো কিছু ব্যবহার করুন

frames['iframeid'].method();

এই উত্তরটি অবশ্যই আরও কিছু তথ্য ব্যবহার করতে পারে, কারণ অবশ্যই অন্যান্য কিছু বিবেচনা রয়েছে। একটির জন্য, আমি ধরে নিচ্ছি দেবকে methodiframe এর windowঅবজেক্টটির একটি সম্পত্তি তৈরি করতে হবে ।
ম্যাটি

8

এই নিয়ে কুইরকসোডের একটি পোস্ট ছিল

যেহেতু পৃষ্ঠাটি এখন নষ্ট হয়ে গেছে এবং কেবল সংরক্ষণাগার.অর্গের মাধ্যমে অ্যাক্সেসযোগ্য তাই আমি এটি এখানে পুনরুত্পাদন করেছি:

আইফ্রেমগুলি

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

একটি আইফ্রেম হ'ল একটি ইনলাইন ফ্রেম, এমন একটি ফ্রেম যা তার নিজস্ব ইউআরএল সহ সম্পূর্ণ পৃথক পৃষ্ঠা থাকা সত্ত্বেও অন্য কোনও HTML পৃষ্ঠার ভিতরে স্থাপন করা হয়। এটি ওয়েব ডিজাইনে খুব সুন্দর সম্ভাবনা দেয়। সমস্যাটি হল iframe অ্যাক্সেস করা, উদাহরণস্বরূপ এটিতে একটি নতুন পৃষ্ঠা লোড করা। কীভাবে এটি করা যায় এই পৃষ্ঠাটি ব্যাখ্যা করে।

ফ্রেম বা অবজেক্ট?

মৌলিক প্রশ্নটি হচ্ছে যদি আইফ্রেমে ফ্রেম হিসাবে দেখা যায় বা কোনও অবজেক্ট হিসাবে।

  • ফ্রেম পৃষ্ঠাগুলির পরিচিতিতে যেমন ব্যাখ্যা করা হয়েছে , আপনি যদি ফ্রেম ব্যবহার করেন তবে ব্রাউজারটি আপনার ( top.frames[1].frames[2]এবং এ জাতীয়) জন্য একটি ফ্রেম স্তরক্রম তৈরি করে । আইফ্রেমে কি এই ফ্রেম শ্রেণিবিন্যাসের সাথে ফিট করে?
  • অথবা ব্রাউজারটি যদি একটি আইফ্রেমকে কেবল অন্য কোনও অবজেক্ট হিসাবে দেখায়, এমন একটি বস্তু যা একটি এসসিআর সম্পত্তি হিসাবে ঘটে থাকে? সেক্ষেত্রে আমাদের একটি স্ট্যান্ডার্ড ডিওএম কল ব্যবহার করতে হবে ( document.getElementById('theiframe'))এটি অ্যাক্সেস করার মতো general

NAME বৈশিষ্ট্য

সর্বাধিক গুরুত্বপূর্ণ নিয়মটি হল যে কোনও আইফ্রেমে আপনি কোনও nameঅ্যাট্রিবিউট তৈরি করেন তা দেওয়া , এমনকি আপনি যদি কোনও ব্যবহার করেন তবে id

<iframe src="iframe_page1.html"
    id="testiframe"
    name="testiframe"></iframe>

বেশিরভাগ ব্রাউজারের nameফ্রেম শ্রেণিবিন্যাসের iframe অংশ তৈরি করতে অ্যাট্রিবিউটের প্রয়োজন হয় । কিছু ব্রাউজারকে (উল্লেখযোগ্যভাবে মজিলা) idআইফ্রেমকে একটি অবজেক্ট হিসাবে অ্যাক্সেসযোগ্য করে তুলতে প্রয়োজন । Iframe এ দুটি বৈশিষ্ট্য নির্ধারণ করে আপনি আপনার বিকল্পগুলি খোলা রাখবেন। তবে এর nameচেয়ে অনেক বেশি গুরুত্বপূর্ণ id

প্রবেশ

হয় আপনি আইটেম হিসাবে iframe অ্যাক্সেস এবং এর পরিবর্তন srcবা আপনি একটি ফ্রেম হিসাবে iframe অ্যাক্সেস এবং এটি পরিবর্তনlocation.href

document.getElementById ('iframe_id') s src = 'newpage.html'; ফ্রেম ['iframe_name']। অবস্থান.href = 'newpage.html'; ফ্রেম সিনট্যাক্সটি কিছুটা পছন্দনীয় কারণ অপেরা 6 এটি সমর্থন করে তবে অবজেক্ট সিনট্যাক্স নয়।

আইফ্রেমে অ্যাক্সেস করা হচ্ছে

সুতরাং সম্পূর্ণ ক্রস-ব্রাউজার অভিজ্ঞতার জন্য আপনার আইফ্রেমে একটি নাম দেওয়া উচিত এবং এটি ব্যবহার করা উচিত

frames['testiframe'].location.href

বাক্য গঠন. আমি যতদূর জানি এটি সর্বদা কাজ করে।

দস্তাবেজ অ্যাক্সেস করা হচ্ছে

আইফ্রেমের ভিতরে ডকুমেন্ট অ্যাক্সেস করা বেশ সহজ, যদি আপনি nameবৈশিষ্ট্যটি ব্যবহার করেন । আইফ্রেমে নথিতে লিঙ্কের সংখ্যা গণনা করতে, করুন frames['testiframe'].document.links.length

উত্পাদিত iframes

আপনি যখন ডাব্লু 3 সি ডোমের মাধ্যমে একটি আইফ্রেম তৈরি করেন তবে আইফ্রেমে তত্ক্ষণাত framesঅ্যারে প্রবেশ করা হয় না , এবংframes['testiframe'].location.href বাক্য কাজ করবে না। Iframe অ্যারে আপ করার আগে ব্রাউজারের একটু সময় প্রয়োজন, এমন সময় যা কোনও স্ক্রিপ্ট চলতে পারে না।

দ্য document.getElementById('testiframe').srcসিনট্যাক্স সব পরিস্থিতিতে কাজ করে জরিমানা।

targetএকটি লিঙ্ক অ্যাট্রিবিউট উত্পন্ন অনুরোধকে সঙ্গে পারেন কাজ করে না, অপেরা ছাড়া, যদিও আমি আমার আইফ্রেম উত্পন্ন উভয় একটি দিয়েছিলাম nameএবং একটিid

অভাব targetসমর্থনের অর্থ হ'ল জেনারেটেড আইফ্রেমের বিষয়বস্তু পরিবর্তন করতে আপনার অবশ্যই জাভাস্ক্রিপ্ট ব্যবহার করতে হবে, তবে যেহেতু এটি প্রথম স্থানে তৈরি করার জন্য আপনার যেভাবেই জাভাস্ক্রিপ্টের প্রয়োজন আছে, তাই আমি এটিকে তেমন সমস্যা হিসাবে দেখছি না।

Iframes এ পাঠ্য আকার

একটি কৌতূহলী এক্সপ্লোরার 6 কেবল বাগ:

আপনি যখন ভিউ মেনুটির মাধ্যমে পাঠ্যের আকার পরিবর্তন করেন, আইফ্রেমে পাঠ্যের মাপগুলি সঠিকভাবে পরিবর্তিত হয়। যাইহোক, এই ব্রাউজারটি মূল পাঠ্যে লাইন বিরতি পরিবর্তন করে না, যাতে পাঠ্যের অংশটি অদৃশ্য হয়ে যেতে পারে বা লাইনটি বিরতি ঘটতে পারে যখন লাইনটি এখনও অন্য শব্দ ধারণ করতে পারে।


5
সেই লিঙ্কটি ভেঙে গেছে বলে মনে হচ্ছে।
জাফোদ

1
এবং বিষয়টিকে আরও খারাপ করার জন্য, আমি সম্পর্কিত পৃষ্ঠাটি কোয়ার্কস্মোডে কোথাও খুঁজে পাচ্ছি না।
stricjux


7

আমি বেশ একটি মার্জিত সমাধান পেয়েছি।

আপনি যেমন বলেছিলেন, পিতামাতার নথিতে অবস্থিত কোডটি কার্যকর করা মোটামুটি সহজ। এবং এটি আমার কোডের ভিত্তি, ঠিক বিপরীতে করুন।

যখন আমার আইফ্রেম লোড হয়, আমি আইফ্রামের নথিতে অবস্থিত স্থানীয় ফাংশনটির একটি রেফারেন্স হিসাবে আর্গুমেন্ট হিসাবে পাস করে প্যারেন্ট ডকুমেন্টে অবস্থিত একটি ফাংশন কল করি। এই রেফারেন্সের মাধ্যমে প্যারেন্ট ডকুমেন্টের এখন আইফ্রেমের ফাংশনে সরাসরি অ্যাক্সেস রয়েছে।

উদাহরণ:

পিতামাতার উপর:

function tunnel(fn) {
    fn();
}

ইফ্রেমে:

var myFunction = function() {
    alert("This work!");
}

parent.tunnel(myFunction);

যখন iframe লোড হয়, এটি প্যারেন্ট.টিউনেল (আপনারFunctionReferences) কল করবে, যা প্যারামিটারে প্রাপ্ত ফাংশনটি কার্যকর করবে।

এটি সহজ, বিভিন্ন ব্রাউজারের সমস্ত অ-মানক পদ্ধতিগুলির সাথে ডিল না করেই।


হাই, আপনি বিভিন্ন ব্রাউজারের সমস্ত মানহীন পদ্ধতির সাথে চুক্তি না করেই "এই সহজটি" নিশ্চিত করতে পারেন?
মিলচে প্যাটার্ন

1
আমি বিভিন্ন প্রকল্পে এই পদ্ধতিটি ব্যবহার করি, মনে হয় খুব ভাল কাজ করে। আমি ব্যক্তিগতভাবে সমস্ত ব্রাউজারগুলি প্রচলনে পরীক্ষা করে দেখিনি, তবে এটির জন্য আমি কখনও কোনও বাগ রিপোর্ট পাইনি।
জুলিয়েন এল

মোহন, আইই ১১, ক্রোম ~ 50 এর মতো কাজ করে।
অগাস্টাস

1
অনুমান করুন যে এটি ক্রস-ডোমেন নয় .. তাই না?
তুষার শুক্লা

@ তুষারশুকলা দুর্ভাগ্যক্রমে না, তা নয়।
জেফ-এইচ

6

এই উত্তরগুলির মধ্যে কয়েকটি সিওআরএস ইস্যুটিকে সম্বোধন করে না, বা যোগাযোগটি সম্ভব করার জন্য আপনি কোড স্নিপেটগুলি কোথায় রাখেন তা স্পষ্ট করে না।

এখানে একটি দৃ concrete় উদাহরণ। বলুন আমি প্যারেন্ট পৃষ্ঠার একটি বোতাম ক্লিক করতে চাই এবং iframe এর ভিতরে কিছু করব। আমি এটি কিভাবে করব তা এখানে।

parent_frame.html

<button id='parent_page_button' onclick='call_button_inside_frame()'></button>

function call_button_inside_frame() {
   document.getElementById('my_iframe').contentWindow.postMessage('foo','*');
}

iframe_page.html

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event)
    {
      if(event) {
        click_button_inside_frame();
    }
}

function click_button_inside_frame() {
   document.getElementById('frame_button').click();
}

অন্য দিকে যেতে (iframe এর বাইরে মেথড কল করার জন্য iframe এর ভিতরে বোতামটি ক্লিক করুন) কেবল কোড স্নিপেট যেখানে থাকে সেখানে স্যুইচ করুন এবং এটি পরিবর্তন করুন:

document.getElementById('my_iframe').contentWindow.postMessage('foo','*');

এটি:

window.parent.postMessage('foo','*')

4

জোয়েলআনাইরের উত্তর দিয়ে চালিয়ে যাওয়া :

আরও দৃust়তার জন্য, নিম্নলিখিত হিসাবে ব্যবহার করুন:

var el = document.getElementById('targetFrame');

if(el.contentWindow)
{
   el.contentWindow.targetFunction();
}
else if(el.contentDocument)
{
   el.contentDocument.targetFunction();
}

কবজির মতো কাজ করেছে :)


3

নীতিন বানসালের জবাব ভঙ্গ করছেন

এবং আরও দৃust়তার জন্য:

function getIframeWindow(iframe_object) {
  var doc;

  if (iframe_object.contentWindow) {
    return iframe_object.contentWindow;
  }

  if (iframe_object.window) {
    return iframe_object.window;
  } 

  if (!doc && iframe_object.contentDocument) {
    doc = iframe_object.contentDocument;
  } 

  if (!doc && iframe_object.document) {
    doc = iframe_object.document;
  }

  if (doc && doc.defaultView) {
   return doc.defaultView;
  }

  if (doc && doc.parentWindow) {
    return doc.parentWindow;
  }

  return undefined;
}

এবং

...
var el = document.getElementById('targetFrame');

var frame_win = getIframeWindow(el);

if (frame_win) {
  frame_win.targetFunction();
  ...
}
...


2

একই জিনিস তবে কিছুটা সহজ উপায় হ'ল কীভাবে আইফ্রেমে পৃষ্ঠা থেকে পিতামাতার পৃষ্ঠাটি রিফ্রেশ করা যায় । পৃষ্ঠাটি পুনরায় লোড করার জন্য জাভাস্ক্রিপ্ট ফাংশন শুরু করতে কেবল পিতামাতার পৃষ্ঠার ফাংশনটি কল করুন:

window.location.reload();

অথবা ইফ্রেমে পৃষ্ঠা থেকে সরাসরি এটি করুন:

window.parent.location.reload();

দুটোই কাজ করে।



1

আপনি যদি অন্য কোনও ফাংশন প্রাক্তন শ্যাডবক্স বা লাইটবক্স দ্বারা উত্পাদিত iframe থেকে প্যারেন্টে জাভাস্ক্রিপ্ট ফাংশনটি চালু করতে চান।

আপনার windowঅবজেক্টটি ব্যবহার করার চেষ্টা করা উচিত এবং প্যারেন্ট ফাংশনটি শুরু করা উচিত:

window.parent.targetFunction();

আমি বিশ্বাস করি ওপি অন্য দিকে যাওয়ার চেষ্টা করছে
কমান্ডজেড

-3

প্যারেন্ট পৃষ্ঠায় একটি ফ্রেমের ফাংশন কল করতে নিম্নলিখিত ব্যবহার করুন

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