jquery লোড হয়ে গেলে iframe সামগ্রীর উচ্চতা পান


85

আমার একটি হেল্প পৃষ্ঠা আছে, help.php যে আমি মেইন.এফপি-তে একটি আইফ্রেমের অভ্যন্তরে লোড করছি আমি কীভাবে এই পৃষ্ঠার ইফ্রেমে লোড হওয়ার পরে উচ্চতা পেতে পারি?

আমি এটি জিজ্ঞাসা করছি কারণ আমি iframe এর উচ্চতা 100% বা অটোতে স্টাইল করতে পারি না। এজন্য আমার মনে হয় আমার জাভাস্ক্রিপ্ট ব্যবহার করা দরকার .. আমি jQuery ব্যবহার করছি

সিএসএস:

body {
    margin: 0;
    padding: 0;
}
.container {
    width: 900px;
    height: 100%;
    margin: 0 auto;
    background: silver;
}
.help-div {
    display: none;
    width: 850px;
    height: 100%;
    position: absolute;
    top: 100px;
    background: orange;
}
#help-frame {
    width: 100%;
    height: auto;
    margin:0;
    padding:0;
}

জেএস:

$(document).ready(function () {
    $("a.open-help").click(function () {
        $(".help-div").show();
        return false;
    })
})

এইচটিএমএল:

<div class='container'>
    <!-- -->
    <div class='help-div'>
        <p>This is a div with an iframe loading the help page</p>
        <iframe id="help-frame" src="../help.php" width="100%" height="100%" frameborder="1"></iframe>
    </div>  <a class="open-help" href="#">open Help in iFrame</a>

    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
    <p>hello world</p>
</div>

আইফ্রেমের লিখিত সামগ্রীটি যে পৃষ্ঠায় রয়েছে তাতে একই ডোমেন থেকে আসছে?
অ্যান্ড্রু 14

হ্যাঁ এটি অ্যান্ড্রু, আমি
আইফ্রেমটি

উত্তর:


102

ঠিক আছে আমি অবশেষে একটি ভাল সমাধান পেয়েছি:

$('iframe').load(function() {
    this.style.height =
    this.contentWindow.document.body.offsetHeight + 'px';
});

কারণ কিছু ব্রাউজার (পুরানো সাফারি এবং অপেরা) সিএসএস রেন্ডারগুলির আগে অনলোড সম্পূর্ণ হয়ে গেছে আপনাকে একটি মাইক্রো টাইমআউট সেট করতে হবে এবং ফাঁকা আউট করতে হবে এবং iframe এর src পুনরায় সাইন ইন করতে হবে।

$('iframe').load(function() {
    setTimeout(iResize, 50);
    // Safari and Opera need a kick-start.
    var iSource = document.getElementById('your-iframe-id').src;
    document.getElementById('your-iframe-id').src = '';
    document.getElementById('your-iframe-id').src = iSource;
});
function iResize() {
    document.getElementById('your-iframe-id').style.height = 
    document.getElementById('your-iframe-id').contentWindow.document.body.offsetHeight + 'px';
}

এই সমাধানটি দুর্দান্ত কাজ করে কারণ উপরেরটি কেবল ধারকটির মধ্যে আইফ্রেমস কন্টেন্ট থেকে আকার পেয়েছে যখন এই realআকারটি পাওয়া যায়
রিক্যডাক্ক

4
আমি বিশ্বাস করি যে লোড ইভেন্টটি একই ইভেন্টের লুপে ট্রিগার করে তাই 1 মিলিসেকেন্ডের একটি সেটটাইমআউট ঠিক একইভাবে কাজ করবে
জর্জ

hhmmm পিতামাতী লোড করার সময় লুকানো কোনও iframe এর উচ্চতা কীভাবে পাবেন তা যে কেউ জানেন। এই পদ্ধতিটি 0.
জেটি ...

4
আপনি documentউচ্চতা নাও উচ্চতা চাইবেন body। JQuery ব্যবহার করে আপনি এটি দখল করতে পারেন $(this.contentWindow.document).height()
vpiTriumph

পুরানো হিসাবে, iframe.contentDocament.body.offsetHeight কাজ করবে। stackoverflow.com/questions/2684693/...
user1087079

50

কম জটিল উত্তরটি .contents()iframe এ পেতে ব্যবহার করা হয়। আকর্ষণীয়ভাবে, যদিও, এটি আমার মূল উত্তরে কোডটি আমি কীভাবে ব্যবহার করি তার থেকে আলাদা মান ফিরে আসে, শরীরে প্যাডিংয়ের কারণে, আমি বিশ্বাস করি।

$('iframe').contents().height() + 'is the height'

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

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

অন্য কথায়:

... হেল্প.এফপি তে:

var getDocumentHeight = function() {
    if (location.hash === '') { // EDIT: this should prevent the retriggering of onDOMReady
        location.hash = $('body').height(); 
        // at this point the document address will be something like help.php#1552
    }
};
$(getDocumentHeight);

... এবং মূল দস্তাবেজে:

var getIFrameHeight = function() {
    var iFrame = $('iframe')[0]; // this will return the DOM element
    var strHash = iFrame.contentDocument.location.hash;
    alert(strHash); // will return something like '#1552'
};
$('iframe').bind('load', getIFrameHeight );

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

মজাদার. আমি একটি চেক যুক্ত করেছি যা ইতিমধ্যে যদি সেখানে কোনও মান থাকে তবে হ্যাশটির সেটিংস প্রতিরোধ করে। আপনি যদি হ্যাশ মান (উদাহরণস্বরূপ <iframe src="../Help.php#introduction" />) দিয়ে হেল্প.এইচপিপি লোড করে থাকেন তবে আপনাকে এটি টুইট করতে হবে
অ্যান্ড্রু

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

24

আমি ক্রোম, ফায়ারফক্স এবং আই 11 এ কাজ করতে নিম্নলিখিতটি পেয়েছি:

$('iframe').load(function () {
    $('iframe').height($('iframe').contents().height());
});

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


ঠিক আছে তবে প্রস্থের জন্য আমাকে এটি করতে হবে বা বিষয়বস্তুগুলি কেটে যায় if ('iframe')। প্রস্থ ($ ('iframe') contents বিষয়বস্তু ()। প্রস্থ () + 30);
জিওমরিলো

@ আমিনগাদারী ফায়ারফক্স 40.0.3 এ আমার জন্য ভাল কাজ করে
মিশক্যাট

@ মিক্সক্যাট আমি এই সমাধান এবং এই বিষয়টির সমস্ত সমাধানের মাধ্যমে আইফ্রেমে একটি ওয়েবসাইট লোড করব তবে আমার জন্য কাজ করছে না! আমি মনে করি এই সমাধানগুলি এক পৃষ্ঠার জন্য কাজ করে এবং যখন আমরা কোনও ওয়েবসাইটকে iframe এ সম্পূর্ণ লোড করি তখন কাজ করে না। আমার ইংরেজি খুব খারাপ, আমি আশা করি আপনি বুঝতে পারবেন।
আমিন ঘাদেরী

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

9

JQuery ছাড়াই এটি করার কোডটি আজকাল নগণ্য:

const frame = document.querySelector('iframe')
function syncHeight() {
  this.style.height = `${this.contentWindow.document.body.offsetHeight}px`
}
frame.addEventListener('load', syncHeight)

ইভেন্টটি আনহুক করতে:

frame.removeEventListener('load', syncHeight)

4
সুন্দর এবং সহজ! দুর্ভাগ্যক্রমে ক্রস-ডোমেন iframes জন্য কাজ করবেন না :(
টিমোসোলো

4
হ্যাঁ ভাগ্যের বাইরে। আমি তার জন্য ইফ্রেমে-রাইজার লাইব্রেরিটি সংগ্রহ করতাম এটি কাজ করার জন্য অবশ্যই আপনার উভয় ডোমেনের নিয়ন্ত্রণে থাকতে হবে।
চ্যাচম্বরলাইন

6

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

এটি আপনার আইফ্রেমের ভিতরে নথিতে রাখুন।

$(document).ready(function() {
  parent.set_size(this.body.offsetHeight + 5 + "px");  
});

ছোট উইন্ডোজে স্ক্রোলবার নির্মূল করতে উপরের পাঁচটি যুক্ত করা হয়েছে, এটি আকারে কখনই নিখুঁত নয়।

এবং এটি আপনার পিতামাতার নথির ভিতরে।

function set_size(ht)
{
$("#iframeId").css('height',ht);
}

আপনি যদি iframe এর মধ্যে একটি পিডিএফ প্রদর্শন করছেন তবে এটিও কাজ করবে না।
জেসন ফোগলিয়া

দুঃখিত তবে আপনার "অভ্যন্তরের ফ্রেম" উদাহরণটি স্পষ্টভাবে jQuery ভিত্তিক।
টি-মোটি

4

এটি আমার পক্ষে কাজ করে এমন সঠিক উত্তর

$(document).ready(function () {
        function resizeIframe() {
            if ($('iframe').contents().find('html').height() > 100) {
                $('iframe').height(($('iframe').contents().find('html').height()) + 'px')
            } else {
                setTimeout(function (e) {
                    resizeIframe();
                }, 50);
            }
        }
        resizeIframe();
    });

4

সাধারণ ওয়ান-লাইনারটি একটি ডিফল্ট ন্যূনতম উচ্চতা দিয়ে শুরু হয় এবং সামগ্রীর আকারে বৃদ্ধি পায়।

<iframe src="http://url.html" onload='javascript:(function(o){o.style.height=o.contentWindow.document.body.scrollHeight+"px";}(this));' style="height:200px;width:100%;border:none;overflow:hidden;"></iframe>


2

গৃহীত উত্তরের $('iframe').loadএখন a.indexOf is not a functionত্রুটি ঘটবে । এতে আপডেট করা যেতে পারে:

$('iframe').on('load', function() {
  // ...
});

.loadJQuery 1.8 থেকে অবহেলিত অনুরূপ অন্য কয়েকজন : নতুন ফাউন্ডেশন প্রজেক্ট খোলার সময় "আনকাচড টাইপ এরিয়ার: a.indexOf কোনও ফাংশন নয়" ত্রুটি


1

এটি একটি jQuery মুক্ত সমাধান যা আইফ্রেমের অভ্যন্তরে এসপিএর সাথে কাজ করতে পারে

document.getElementById('iframe-id').addEventListener('load', function () {
  let that = this;
  setTimeout(function () {
    that.style.height = that.contentWindow.document.body.offsetHeight + 'px';
  }, 2000) // if you're having SPA framework (angularjs for example) inside the iframe, some delay is needed for the content to populate
});

1

এটি আমার ES6 বন্ধুত্বপূর্ণ নো-জেকারি নেওয়া

document.querySelector('iframe').addEventListener('load', function() {
    const iframeBody = this.contentWindow.document.body;
    const height = Math.max(iframeBody.scrollHeight, iframeBody.offsetHeight);
    this.style.height = `${height}px`;
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.