Iframe සඳහා CSS අයදුම් කරන්නේ කෙසේද?


1035

මට සරල පිටුවක් ඇත, එය අයිෆ්‍රේම් කොටස් කිහිපයක් ඇත (ආර්එස්එස් සබැඳි පෙන්වීමට). එකම CSS ආකෘතිය ප්‍රධාන පිටුවේ සිට iframe හි පෙන්වන පිටුවට යෙදිය හැක්කේ කෙසේද?


66
එය කළ හැකි නමුත්
iframe

13
gawpertron, පැහැදිලි කිරීම සඳහා, ඔබ කියන්නේ මා පාලනය නොකරන වෙනත් වසමකින් iFrame අන්තර්ගතය භාවිතා කරන්නේ නම්, එම අන්තර්ගතය සඳහා CSS පාලනය කිරීමට මට ක්‍රමයක් නොමැතිද?
විලේ එම්

ඔබට අපගේ වෙනස්කම් බැලීමට හැකි වන පරිදි පිටුවට සබැඳියක් ලැයිස්තු ගත කළ හැකිද?

5
වසම, වරාය සහ ප්‍රොටෝකෝලය එක හා සමාන විය යුතුය, උප ඩොමේන් සමඟද ක්‍රියා නොකරයි.
ලී පෙන්ක්මන්

Answers:


441

සංස්කරණය කරන්න: සුදුසු CORS ශීර්ෂකය සකසා ඇත්නම් මිස මෙය හරස් වසම ක්‍රියා නොකරයි .

මෙහි වෙනස් කරුණු දෙකක් තිබේ: අයිෆ්‍රේම් බ්ලොක් වල ශෛලිය සහ අයිෆ්‍රේම් තුළ අන්තර්ගත කර ඇති පිටුවේ විලාසය. ඔබට සුපුරුදු පරිදි iframe අවහිර කිරීමේ විලාසය සැකසිය හැකිය:

<iframe name="iframe1" id="iframe1" src="empty.htm" 
        frameborder="0" border="0" cellspacing="0"
        style="border-style: none;width: 100%; height: 120px;"></iframe>

අයිෆ්‍රේම් තුළ අන්තර්ගත කර ඇති පිටුවේ ශෛලිය ළමා පිටුවට ඇතුළත් කිරීමෙන් සැකසිය යුතුය:

<link type="text/css" rel="Stylesheet" href="Style/simple.css" />

නැතහොත් එය ජාවාස්ක්‍රිප්ට් සමඟ මව් පිටුවෙන් පූරණය කළ හැකිය:

var cssLink = document.createElement("link");
cssLink.href = "style.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 
frames['iframe1'].document.head.appendChild(cssLink);

31
කරුණාකර සටහන් කරන්න, මීට පෙර පළ කරන ලද සමහර උදාහරණ දැන් html5 සඳහා වලංගු නොවන බව මට පෙනේ. ඔබට රාමුවේ අන්තර්ගතයට පහත පරිදි ප්‍රවේශ විය හැකිය : document.getElementById("myframe").contentDocument. සීඑස්එස් කාවැද්දීම තවමත් මට වැඩ කරන බවක් නොපෙනේ.
රෙහ්නෝ ලින්ඩෙක්

35
සබැඳිය දිස්විය හැක්කේ HEAD
Knu

18
මා වෙනුවෙන් වැඩ කළේ මා කළ විට පමණි ...document.head.appendChild(cssLink)- ෆයර්ෆොක්ස් සහ සෆාරි.
mojuba

24
මෙය සැබවින්ම හරස් වසම ක්‍රියාත්මක වේද? මම හිතන්නේ නැහැ එහෙම වෙයි කියලා.
සයිමන් ඊස්ට්

89
එය සොයා ගැනීම සඳහා වෙනත් අංක 1 ට එය පරීක්ෂා කළ යුතුය: නිවැරදි, එය හරස් වසම ක්‍රියා නොකරයි. රාමු ['නම'] කළ විගසම ඔබට "URL බ්ලහ් සමඟ රාමුවෙන් URL බ්ලා සමඟ රාමුවට ප්‍රවේශ වීමට අනාරක්ෂිත ජාවාස්ක්‍රිප්ට් උත්සාහයක් ලැබේ. වසම්, ප්‍රොටෝකෝල සහ වරායන් ගැලපිය යුතුය."
කෙවින්

207

මට මෙම ගැටළුව ගූගල් දින දර්ශනය සමඟ හමු විය . මට අවශ්‍ය වූයේ එය අඳුරු පසුබිමක හැඩගස්වා අකුරු වෙනස් කිරීමයි.

වාසනාවකට මෙන්, කාවැද්දූ කේතයේ URL ය වෙත access ජු ප්‍රවේශයට කිසිදු සීමාවක් නොතිබුණි, එබැවින් PHP ශ්‍රිතය භාවිතා කිරීමෙන් file_get_contentsපිටුවෙන් සම්පූර්ණ අන්තර්ගතය ලබා ගත හැකිය. ගූගල් යූආර්එල් ඇමතීම වෙනුවට, ඔබේ සේවාදායකයේ පිහිටා ඇති පීඑච්පී ගොනුවක් ඇමතිය හැකිය, උදා. google.php, එහි මුල් අන්තර්ගතය වෙනස් කිරීම් සහිතව අඩංගු වේ:

$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');

ඔබගේ මෝස්තර පත්‍රයට මාර්ගය එක් කිරීම:

$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);

(මෙය ඔබගේ ස්ටයිල්ෂීට් එක අවසන් ටැගයට පෙර headඅවසන් වේ.)

Css සහ js සාපේක්ෂව හැඳින්වුවහොත් මූලික url එකෙහි මූලික url එක සඳහන් කරන්න:

$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);

අවසාන google.phpගොනුව මේ ආකාරයට විය යුතුය:

<?php
$content = file_get_contents('https://www.google.com/calendar/embed?src=%23contacts%40group.v.calendar.google.com&ctz=America/Montreal');
$content = str_replace('</title>','</title><base href="https://www.google.com/calendar/" />', $content);
$content = str_replace('</head>','<link rel="stylesheet" href="http://www.yourwebsiteurl.com/google.css" /></head>', $content);
echo $content;

ඉන්පසු ඔබ iframeකාවැද්දූ කේතය පහත පරිදි වෙනස් කරයි :

<iframe src="http://www.yourwebsiteurl.com/google.php" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>

වාසනාව!


71
ඔබට අවශ්‍ය නම් ඔබට එම අනවසරයෙන් නිර්වචනය කළ හැකිය. නමුත් ඔබ මීට වඩා හොඳ විසඳුමක් ඉදිරිපත් කළේ නැත ... මෙම විසඳුම ගූගල් සේවයට හානි කිරීමට හෝ ඔවුන්ගේ දුර්වලතාවය ගසාකෑමට මිනිසුන්ව රැවටීමට ක්‍රමයක් නොවේ.
SequenceDigitale.com

5
මෙම විසඳුම ගූගල් ලියකියවිලි සමඟ වැඩ කිරීමට ක්‍රමයක් සඳහා මම මරා දමමි. එය සියලු ආකාරයේ ජාවාස්ක්‍රිප්ට් දෝෂ විසි කරයි. "නොකැඩූ TypeError: නිර්වචනය නොකළ දේපල 'a' කියවිය නොහැක"
deweydb


9
H ක්‍රිස්හෝටන් FYI, එය මූලික වශයෙන් එසේ නොවේ. කෙසේ වෙතත්, එය සමස්ත අයිෆ්‍රේම් එක තේරුමක් නැති දෙයක් බවට පත් කළ හැකිය (නිදසුනක් ලෙස, අයිෆ්‍රේම් භාවිතා කිරීමට එක් හේතුවක් වන්නේ ආරක්ෂක අරමුණු සඳහා ය, උදා: කාඩ් ගෙවීම් සමඟ ය, ඔබ මෙහි යෝජනා කර ඇති දේ කළහොත් ඔබ බොහෝ විට ඔබට ගැටලු ඇති කරයි).
ඇලෙස්ටෙයාර්

10
මෙය කිරීමෙන් ඔබ සැමවිටම දින දර්ශනය පුරනය වී නැති පරිශීලකයෙකු ලෙස ලබා ගනී. සාමාන්‍ය HTML iframe සමඟ පරිශීලකයා ගූගල් වෙත ප්‍රවිෂ්ට වී ඇත්නම් ඔවුන්ගේ පුද්ගලික දින දර්ශනය දකිනු ඇත, නමුත් ඔබේ PHP කේතයට පරිශීලකයින් ගූගල් සැසි හැඳුනුම්පත දැනගත නොහැකි බැවින් එයට ඔවුන්ගේ පුද්ගලික දින දර්ශනය ලබා ගත නොහැක.
bdsl

74

අයිෆ්‍රේම් හි අන්තර්ගතය සම්පූර්ණයෙන්ම ඔබගේ පාලනය යටතේ නොමැති නම් හෝ විවිධ මෝස්තර වලින් විවිධ පිටු වලින් අන්තර්ගතයට ප්‍රවේශ වීමට ඔබට අවශ්‍ය නම් ඔබට එය ජාවාස්ක්‍රිප්ට් භාවිතයෙන් හැසිරවීමට උත්සාහ කළ හැකිය.

var frm = frames['frame'].document;
var otherhead = frm.getElementsByTagName("head")[0];
var link = frm.createElement("link");
link.setAttribute("rel", "stylesheet");
link.setAttribute("type", "text/css");
link.setAttribute("href", "style.css");
otherhead.appendChild(link);

ඔබ භාවිතා කරන බ්‍රව්සරය මත පදනම්ව මෙය ක්‍රියාත්මක වන්නේ එකම වසමෙන් සේවය කරන පිටුවල පමණක් බව සලකන්න.


83
පිටුව වෙනත් වසමක තිබේ නම් එකම මූල ප්‍රතිපත්තියක් මඟින් මෙම වැඩ කිරීම නවත්වන බව සඳහන් කිරීම වටී.
ConroyP

2
එකම චින්තනයෙන් නමුත් වඩාත් සංක්ෂිප්තව: <iframe onload="this.contentDocument.body.style.overflow='hidden';" />
ආරක්ෂකයා

ෆයර්ෆොක්ස් පවා CORS වෙත ගොස් ඇත

60
var $head = $("#eFormIFrame").contents().find("head");

$head.append($("<link/>", {
    rel: "stylesheet",
    href: url,
    type: "text/css"
}));

wedeweydb මම එය හරස් ඩොමේන් iframe සමඟ විශේෂයෙන් භාවිතා කළෙමි. නමුත් මට සමාව අයැදිය හැකිය.
රමී සරීඩින්

@ramie සහ ඔබ එය බ්‍රව්සර් කිහිපයකින් පරීක්ෂා කළාද? බොහෝ බ්‍රව්සර් ආරක්ෂක දෝෂයක් විසි කරයි.
deweydb

මම මෙම අදහස මීට පෙර දුටුවෙමි, නමුත් එහි විශිෂ්ට හා වෘත්තීයමය ගොනු කිරීම සඳහා සබැඳියක් එක් කරන්න ... + ඉහළට
J.Tural

30

<link>අමතර මෝස්තර පත්‍රයක් පැටවීම සඳහා භාවිතා නොකර CSS කේතය කෙලින්ම යෙදිය යුතු ආකාරය මෙන්න .

var head = jQuery("#iframe").contents().find("head");
var css = '<style type="text/css">' +
          '#banner{display:none}; ' +
          '</style>';
jQuery(head).append(css);

මෙය iframe පිටුවේ බැනරය සඟවයි. ඔබගේ යෝජනා වලට ස්තූතියි!


1
මේ සඳහා හැඳුනුම්පත සමඟ iframe iframeඅවශ්‍යද?
ජෙරමි

1
යන්තම් වෙනුවට @jmalais #iframeසමග #<id>හෝ iframeසියලු තෝරා ගැනීමට iframeඇති
Zeb McCorkle

3
මෙය මා වෙනුවෙන් වැඩ කරන බවක් නොපෙනේ. මම සංස්කරණය කිරීමට උත්සාහ කරන අයිෆ්‍රේම් එකෙහි කෙළින්ම පහළින් හිස නැත. ඉතින් එයින් අදහස් කරන්නේ මට html ලේඛනයේ හිසට ප්‍රවේශ විය යුතු බවද නැතහොත් jquery විසින් සොයා ගන්නා ශ්‍රිතයට තනිවම කළ හැකි දෙයක්ද?
ඩේවිඩ් ඒ. ප්‍රංශ

1
ඩොමේන් නොගැලපීම හේතුවෙන් කොන්සෝලය පරික්ෂා කර ඇති අතර එය අයිෆ්‍රේම් අන්තර්ගතයට ප්‍රවේශ වීම අවහිර කර ඇති බවක් පෙනේ. මම දැනට දේශීයව ක්‍රෝම් භාවිතා කරමින් මගේ ඩිව් පරිසරය සත්කාරකත්වය දරමි.
ඩේවිඩ් ඒ. ප්‍රංශ

හඳුනා නොගත් DOMException: මූලාරම්භයක් සහිත රාමුවක් අවහිර කිරීමෙන් එය මට මෙම දෝෂය ලබා දෙයි
ප්‍රියංකා පටෙල්

28

බොහෝ බ්‍රව්සර් විසින් iframe වෙනත් HTML පිටුවක් මෙන් විශ්වීයව හසුරුවනු ලැබේ. අයිෆ්‍රේම් හි අන්තර්ගතයට එකම මෝස්තර පත්‍රය යෙදීමට ඔබට අවශ්‍ය නම්, එහි භාවිතා කර ඇති පිටු වලින් එය යොමු කරන්න.


27
ang හැන්ග්‍රි නමුත් ... කොහොමද?
දෙවියන්ගේ දරුවෙක්

26

හැන්ගි පැවසූ පරිදි ඔබ iframe හි පිටුව පාලනය කරන්නේ නම්, පහසුම ප්‍රවේශය වන්නේ පොදු මෝස්තර සහිත හවුල් CSS ගොනුවක් නිර්මාණය කිරීමයි, ඉන්පසු ඔබේ html පිටු වලින් එය සම්බන්ධ කරන්න.

එසේ නොමැතිනම් ඔබේ අයිෆ්‍රේම් හි බාහිර පිටුවකින් පිටුවක ශෛලිය ගතිකව වෙනස් කිරීමට ඔබට නොහැකි වනු ඇත. මෙයට හේතුව, කොල්ලකෑම සහ වෙනත් හක්ක සඳහා අනිසි ලෙස භාවිතා කිරීම හේතුවෙන් බ්‍රව්සර් හරස් රාමු ඩොම් ස්ක්‍රිප්ටින් වල ආරක්ෂාව දැඩි කර තිබීමයි.

මෙම නිබන්ධනය මඟින් පොදුවේ ස්ක්‍රිප්ටින් අයිෆ්‍රේම් පිළිබඳ වැඩි විස්තර ලබා දෙනු ඇත. හරස් රාමු ස්ක්‍රිප්ටින් ගැන IE දෘෂ්ටි කෝණයෙන් ආරක්ෂක සීමාවන් පැහැදිලි කරයි.


19

ඉහත සුළු වෙනසක් සහිතව ක්‍රියා කරයි:

var cssLink = document.createElement("link") 
cssLink.href = "pFstylesEditor.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 

//Instead of this
//frames['frame1'].document.body.appendChild(cssLink);
//Do this

var doc=document.getElementById("edit").contentWindow.document;

//If you are doing any dynamic writing do that first
doc.open();
doc.write(myData);
doc.close();

//Then append child
doc.body.appendChild(cssLink);

අවම වශයෙන් ff3 සහ ie8 සමඟ හොඳින් ක්‍රියා කරයි


7
MyData යනු කුමක්ද සහ එය පැමිණෙන්නේ කොහෙන්ද
Tigran

1
Ig ටයිග්‍රාන් එය සඳහාdynamic data
ආකාෂ්

13

පහත සඳහන් දෑ මා වෙනුවෙන් වැඩ කළේය.

var iframe = top.frames[name].document;
var css = '' +
          '<style type="text/css">' +
          'body{margin:0;padding:0;background:transparent}' +
          '</style>';
iframe.open();
iframe.write(css);
iframe.close();

1
දෝෂය:Uncaught TypeError: Cannot read property 'open' of undefined
කිං රයිඩර්

13

ඔබට ප්‍රධාන පිටුවෙන් CSS සහ JavaScript නැවත භාවිතා කිරීමට අවශ්‍ය නම් සමහර විට ඔබ <IFRAME>අජැක්ස් පටවා ඇති අන්තර්ගතයක් ආදේශ කිරීම ගැන සලකා බැලිය යුතුය . සෙවුම් බොට් වලට ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීමට හැකි වූ විට මෙය දැන් වඩා SEO හිතකාමී ය.

මෙය ඔබේ ලේඛනයට තවත් html පිටුවක් ඇතුළත් වන jQuery උදාහරණයකි. මෙය වඩා SEO හිතකාමී ය iframe. බොට්ස් ඇතුළත් කළ පිටුව සුචිගත නොකරන බවට වග බලා ගැනීම සඳහා එය ඇතුලත් කිරීමට ඉඩ දෙන්නrobots.txt

<html>
  <header>
    <script src="/js/jquery.js" type="text/javascript"></script>
  </header>
  <body>
    <div id='include-from-outside'></div>
    <script type='text/javascript'>
      $('#include-from-outside').load('http://example.com/included.html');
    </script> 
  </body>
</html>

ඔබට ගූගල් වෙතින් කෙලින්ම jQuery ඇතුළත් කළ හැකිය: http://code.google.com/apis/ajaxlibs/documentation/ - මෙයින් අදහස් කරන්නේ නව අනුවාදයන් ස්වයංක්‍රීයව ඇතුළත් කිරීම සහ සැලකිය යුතු වේග වැඩි වීමකි. එසේම, එයින් අදහස් වන්නේ ඔබට jQuery ලබා දීම සඳහා ඔබ ඔවුන්ව විශ්වාස කළ යුතු බවයි;)


1
පිටුවේ අන්තර්ගතය කිසියම් ආකාරයකින් ගතික නම් මෙම විසඳුම ක්‍රියාත්මක නොවන බව සැලකිල්ලට ගත යුතුය.
nickdnk

10

රාමු අන්තර්ගතය පැටවීමේදී සිදුවන ප්‍රමාදයන් සමඟ සාර්ථකව කටයුතු කිරීම සඳහා ඉහත jQuery විසඳුම පුළුල් කිරීම.

$('iframe').each(function(){
    function injectCSS(){
        $iframe.contents().find('head').append(
            $('<link/>', { rel: 'stylesheet', href: 'iframe.css', type: 'text/css' })
        );
    }

    var $iframe = $(this);
    $iframe.on('load', injectCSS);
    injectCSS();
});

1
'$ මෙය' ක්‍රියාත්මක වීමට එය '$ (මෙය)' විය යුතුය. එය සිදු වූ විට සතුටක් :)
h.coates

9

මගේ සංයුක්ත අනුවාදය :

<script type="text/javascript">
$(window).load(function () {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }   
});
</script>

කෙසේ වෙතත්, සමහර විට iframeකවුළු පටවා ඇති විට එය සූදානම් නැත, එබැවින් ටයිමරයක් භාවිතා කිරීමේ අවශ්‍යතාවයක් පවතී .

භාවිතයට සුදානම් කේතය (ටයිමරය සමඟ):

<script type="text/javascript">
var frameListener;
$(window).load(function () {
    frameListener = setInterval("frameLoaded()", 50);
});
function frameLoaded() {
    var frame = $('iframe').get(0);
    if (frame != null) {
        var frmHead = $(frame).contents().find('head');
        if (frmHead != null) {
            clearInterval(frameListener); // stop the listener
            frmHead.append($('style, link[rel=stylesheet]').clone()); // clone existing css link
            //frmHead.append($("<link/>", { rel: "stylesheet", href: "/styles/style.css", type: "text/css" })); // or create css link yourself
        }
    }
}
</script>

... සහ jQuery සබැඳිය:

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>

8

මෙහි ඇති වෙනත් පිළිතුරු jQuery සහ CSS සබැඳි භාවිතා කරන බව පෙනේ.

මෙම කේතය වැනිලා ජාවාස්ක්‍රිප්ට් භාවිතා කරයි. එය නව <style>අංගයක් නිර්මාණය කරයි . එමඟින් එම මූලද්‍රව්‍යයේ පෙළ අන්තර්ගතය නව CSS අඩංගු නූලක් ලෙස සකසයි. තවද එය එම මූලද්‍රව්‍යය කෙලින්ම iframe ලේඛනයේ හිසට එකතු කරයි.

var iframe = document.getElementById('the-iframe');
var style = document.createElement('style');
style.textContent =
  '.some-class-name {' +
  '  some-style-name: some-value;' +
  '}' 
;
iframe.contentDocument.head.appendChild(style);

8

භාවිතයට මෙය උත්සාහ කළ හැකිය:

$('iframe').load( function() {
     $('iframe').contents().find("head")
     .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
  });

4
ඔබේ අයිෆ්‍රේම් විවිධ සම්භවයක් ඇති නම්, CORS යාන්ත්‍රණය මෙම ක්‍රියාකාරීත්වයට ඉඩ නොදේ.
ඇන්ඩර්සන් මහතා

සියලුම ස්ථාන සඳහා iframe-url CORS සක්‍රීය කර ඇත්නම් කුමක් කළ යුතුද?
adrhc

7

ඔබ "doc.open ()" යැයි පැවසූ විට එයින් අදහස් කරන්නේ ඔබට iframe තුළ ඕනෑම HTML ටැගයක් ලිවිය හැකි බවයි, එබැවින් ඔබ HTML පිටුව සඳහා සියලු මූලික ටැග් ලිවිය යුතු අතර ඔබේ iframe හිසෙහි CSS සම්බන්ධතාවයක් ලබා ගැනීමට අවශ්‍ය නම් පමණක් ලියන්න iframe එහි CSS සබැඳිය සමඟ. මම ඔබට උදාහරණයක් දෙන්නම්:

doc.open();

doc.write('<!DOCTYPE html><html><head><meta charset="utf-8"/><meta http-quiv="Content-Type" content="text/html; charset=utf-8"/><title>Print Frame</title><link rel="stylesheet" type="text/css" href="https://stackoverflow.com/css/print.css"/></head><body><table id="' + gridId + 'Printable' + '" class="print" >' + out + '</table></body></html>');

doc.close();

6

ඔබට iframe හි අන්තර්ගතය මේ ආකාරයෙන් හැඩගස්වා ගැනීමට නොහැකි වනු ඇත. මගේ යෝජනාව වනුයේ සර්වර්සයිඩ් ස්ක්‍රිප්ටින් (පීඑච්පී, ඒඑස්පී, හෝ පර්ල් ස්ක්‍රිප්ට්) භාවිතා කිරීම හෝ ජාවාස්ක්‍රිප්ට් කේතයට සංග්‍රහයක් පරිවර්තනය කරන සබැඳි සේවාවක් සොයා ගැනීමයි. එය කළ හැකි අනෙක් ක්‍රමය වනුයේ ඔබට සේවාදායකයක් කළ හැකි නම් ඇතුළත් වේ.


29
යමක් කළ නොහැකි යැයි ඔබ පවසන විට ප්‍රවේශම් වන්න, යථාර්ථයේ දී එය දුෂ්කර වන විට
ලතාන්

6

එකම වසම් සඳහා බොහෝ පිළිතුරු ලියා ඇති බැවින්, හරස් වසම්වල මෙය කරන්නේ කෙසේදැයි මම ලියමි.

පළමුව, ඔබ තැපැල් පණිවිඩ API දැනගත යුතුය . කවුළු දෙකක් අතර සන්නිවේදනය කිරීමට අපට පණිවිඩකරුවෙකු අවශ්‍යය.

මෙන්න මම නිර්මාණය කළ පණිවිඩකරුවෙක්.

/**
 * Creates a messenger between two windows
 *  which have two different domains
 */
class CrossMessenger {

    /**
     * 
     * @param {object} otherWindow - window object of the other
     * @param {string} targetDomain - domain of the other window
     * @param {object} eventHandlers - all the event names and handlers
     */
    constructor(otherWindow, targetDomain, eventHandlers = {}) {
        this.otherWindow = otherWindow;
        this.targetDomain = targetDomain;
        this.eventHandlers = eventHandlers;

        window.addEventListener("message", (e) => this.receive.call(this, e));
    }

    post(event, data) {

        try {
            // data obj should have event name
            var json = JSON.stringify({
                event,
                data
            });
            this.otherWindow.postMessage(json, this.targetDomain);

        } catch (e) {}
    }

    receive(e) {
        var json;
        try {
            json = JSON.parse(e.data ? e.data : "{}");
        } catch (e) {
            return;
        }
        var eventName = json.event,
            data = json.data;

        if (e.origin !== this.targetDomain)
            return;

        if (typeof this.eventHandlers[eventName] === "function") 
            this.eventHandlers[eventName](data);
    }

}

සන්නිවේදනය සඳහා කවුළු දෙකකින් මෙය භාවිතා කිරීමෙන් ඔබේ ගැටළුව විසඳා ගත හැකිය.

ප්රධාන කවුළුවල,

var msger = new CrossMessenger(iframe.contentWindow, "https://iframe.s.domain");

var cssContent = Array.prototype.map.call(yourCSSElement.sheet.cssRules, css_text).join('\n');
msger.post("cssContent", {
   css: cssContent
})

ඉන්පසු, සිදුවීම අයිෆ්‍රේම් වෙතින් ලබා ගන්න.

Iframe හි:

var msger = new CrossMessenger(window.parent, "https://parent.window.domain", {
    cssContent: (data) => {
        var cssElem = document.createElement("style");
        cssElem.innerHTML = data.css;
        document.head.appendChild(cssElem);
    }
})

වැඩි විස්තර සඳහා සම්පූර්ණ ජාවාස්ක්‍රිප්ට් සහ අයිෆ්‍රේම්ස් නිබන්ධනය බලන්න.


4

ඔබට iframe පිටුවට ප්‍රවේශය තිබේ නම් සහ වෙනත් CSS එකක් ඒ සඳහා අයදුම් කිරීමට අවශ්‍ය නම් ඔබ එය ඔබගේ පිටුවේ iframe හරහා පටවන විට පමණක් මෙහි දී මම මෙවැනි දේ සඳහා විසඳුමක් සොයා ගතිමි

iframe වෙනත් වසමක් පූරණය කළත් මෙය ක්‍රියාත්මක වේ

ගැන පරීක්ෂා කරන්න postMessage()

සැලැස්ම නම්, css වැනි පණිවිඩයක් iframe වෙත යවන්න

iframenode.postMessage('h2{color:red;}','*');

* iframe හි කුමන වසම කුමක් වුවත් මෙම පණිවිඩය යැවීමයි

පණිවිඩය iframe වලින් ලබාගෙන ලැබුණු පණිවිඩය (CSS) එම ලේඛන ශීර්ෂයට එක් කරන්න.

iframe පිටුවට එක් කිරීමට කේතය

window.addEventListener('message',function(e){

    if(e.data == 'send_user_details')
    document.head.appendChild('<style>'+e.data+'</style>');

});

3

මේ ආකාරයට ශෛලිය ප්‍රධාන HTML තුළ තැබීමට මම තවත් විසඳුමක් සොයා ගතිමි

<style id="iframestyle">
    html {
        color: white;
        background: black;
    }
</style>
<style>
    html {
        color: initial;
        background: initial;
    }
    iframe {
        border: none;
    }
</style>

ඉන්පසු iframe හි මෙය කරන්න (js onload බලන්න)

<iframe  onload="iframe.document.head.appendChild(ifstyle)" name="log" src="/upgrading.log"></iframe>

සහ ජේ

<script>
    ifstyle = document.getElementById('iframestyle')
    iframe = top.frames["log"];
</script>

එය හොඳම විසඳුම නොවිය හැකි අතර එය නිසැකවම වැඩිදියුණු කළ හැකි නමුත් මව් කවුළුව තුළ "ස්ටයිල්" ටැගයක් තබා ගැනීමට ඔබට අවශ්‍ය නම් එය තවත් විකල්පයකි


3

මෙන්න, වසම තුළ කරුණු දෙකක් තිබේ

  1. iFrame අංශය
  2. පිටුව iFrame තුළ පටවා ඇත

එබැවින් ඔබට එම කොටස් දෙක පහත පරිදි සැකසීමට අවශ්‍යය,

1. iFrame කොටස සඳහා ශෛලිය

එම ගෞරවනීය idහෝ classනම සහිත CSS භාවිතා කර එය ශෛලිය කළ හැකිය . ඔබට එය ඔබේ මව් ස්ටයිල් ෂීට් වලද මෝස්තර කළ හැකිය.

<style>
#my_iFrame{
height: 300px;
width: 100%;
position:absolute;
top:0;
left:0;
border: 1px black solid;
}
</style>

<iframe name='iframe1' id="my_iFrame" src="#" cellspacing="0"></iframe>

2. අයිෆ්‍රේම් තුළ පටවා ඇති පිටුව මෝස්තර කරන්න

මෙම ශෛලීන් ජාවාස්ක්‍රිප්ට් ආධාරයෙන් මව් පිටුවෙන් පූරණය කළ හැකිය

var cssFile  = document.createElement("link") 
cssFile.rel  = "stylesheet"; 
cssFile.type = "text/css"; 
cssFile.href = "iFramePage.css"; 

ඉන්පසු එම CSS ගොනුව ගෞරවනීය iFrame කොටසට සකසන්න

//to Load in the Body Part
frames['my_iFrame'].document.body.appendChild(cssFile); 
//to Load in the Head Part
frames['my_iFrame'].document.head.appendChild(cssFile);

මෙන්න, ඔබට මේ ආකාරයෙන් iFrame තුළ පිටුවේ ප්‍රධාන කොටස සංස්කරණය කළ හැකිය

var $iFrameHead = $("#my_iFrame").contents().find("head");
$iFrameHead.append(
   $("<link/>",{ 
      rel: "stylesheet", 
      href: urlPath, 
      type: "text/css" }
     ));

2

මම හිතන්නේ පහසුම ක්‍රමය නම් අයිෆ්‍රේම් හා සමාන ස්ථානයක තවත් ඩිව් එකක් එකතු කිරීමයි

එය z-indexඅයිෆ්‍රේම් කන්ටේනරයට වඩා විශාල කරන්න, එවිට ඔබට පහසුවෙන් ඔබේම විලාසිතාව සැකසිය හැකිය. ඔබට එය මත ක්ලික් කිරීමට අවශ්‍ය නම්, pointer-events:noneඔබේම කොටස භාවිතා කරන්න, එවිට ඔබට එය මත ක්ලික් කිරීමට අවශ්‍ය නම් iframe ක්‍රියා කරයි;)

එය යමෙකුට උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි;)


2

අපට විලාසිතාවේ ටැගය iframe තුළට ඇතුළු කළ හැකිය. මෙහි ද පළ කර ඇත ...

<style type="text/css" id="cssID">
.className
{
    background-color: red;
}
</style>

<iframe id="iFrameID"></iframe>

<script type="text/javascript">
    $(function () {
        $("#iFrameID").contents().find("head")[0].appendChild(cssID);
        //Or $("#iFrameID").contents().find("head")[0].appendChild($('#cssID')[0]);
    });
</script>

1
මෙය ක්‍රියාත්මක නොවේ. ස්ටයිල් ටැගය නිවැරදිව ඇතුළු කළ බව පෙනේ, නමුත් එහි අන්තර්ගතයක් සහ හැඳුනුම්පතක් නොමැත.
darylknight

2

var link1 = document.createElement('link');
    link1.type = 'text/css';
    link1.rel = 'stylesheet';
    link1.href = "../../assets/css/normalize.css";
window.frames['richTextField'].document.body.appendChild(link1);


1
මම මෙම පිළිතුර බොහෝ වාරයක් පරීක්ෂා කර ඇත්තෙමි richTextFieldමෙහි ඇත්තේ කුමක්ද?
කිරන්කුමාර් ඩෆ්ඩා

1
එය අයිෆ්‍රේම් නමයි
ජීව

මම උත්සාහ කළේ නැහැ, නමුත් මම හිතන්නේ එය සෑන්ඩ්බොක්ස් වලට විරුද්ධ නිසා නොවේ
ජීව

1

නෝඩ් එකක් අයිෆ්‍රේම් අනුවාදයක් මගින් ප්‍රතිස්ථාපනය කරන අපූරු පිටපතක් තිබේ. CodePen Demo

රූප විස්තරය මෙහි ඇතුළත් කරන්න

භාවිත උදාහරණ:

// Single node
var component = document.querySelector('.component');
var iframe = iframify(component);

// Collection of nodes
var components = document.querySelectorAll('.component');
var iframes = Array.prototype.map.call(components, function (component) {
  return iframify(component, {});
});

// With options
var component = document.querySelector('.component');
var iframe = iframify(component, {
  headExtra: '<style>.component { color: red; }</style>',
  metaViewport: '<meta name="viewport" content="width=device-width">'
});

1
ඔබට එය කිරීමට අවශ්‍ය ඇයි?!
ඩිලන් වොට්සන්

1

විකල්පයක් ලෙස, ඔබට පහත දැක්වෙන පරිදි CSS-in-JS තාක්ෂණය භාවිතා කළ හැකිය:

https://github.com/cssobj/cssobj

එය ජේඑස් වස්තුව CSS ලෙස iframe වෙත ගතිකව එන්නත් කළ හැකිය


1

මෙය සංකල්පයක් පමණි, නමුත් ආරක්ෂක පරීක්ෂාවන් සහ පෙරහන් නොමැතිව මෙය ක්‍රියාත්මක නොකරන්න! නැතිනම් ස්ක්‍රිප්ටයට ඔබේ වෙබ් අඩවිය හැක් කළ හැකිය!

පිළිතුර: ඔබ ඉලක්ක වෙබ් අඩවිය පාලනය කරන්නේ නම්, ඔබට ග්‍රාහක ස්ක්‍රිප්ට් සැකසිය හැක:

1) styleපරාමිතිය සමඟ iframe සබැඳිය සකසන්න , වැනි:

http://your_site.com/target.php?color=red

(අවසාන වාක්‍ය ඛණ්ඩය a{color:red} කේතනය කර ඇත්තේ ශ්‍රිතයෙනි urlencode.

2) ග්‍රාහක පිටුව target.phpමේ ආකාරයට සකසන්න :

<head>
..........
$col = FILTER_VAR(SANITIZE_STRING, $_GET['color']);
<style>.xyz{color: <?php echo (in_array( $col, ['red','yellow','green'])?  $col : "black") ;?> } </style>
..........

3
අවවාදයයි: මෙය උපරිමයෙන් එන්නත් කිරීමකි.
කැනෝ

1
ඔව්, ඔබේ සේවාදායකයේ පෙන්-ටෙස්ට් බොට්ස් සහ ස්ක්‍රිප්ට්
කිඩ්ඩි

1
අමතර ආරක්ෂක අනතුරු ඇඟවීමක් සහිතව මම දැන් පිළිතුර යාවත්කාලීන කර ඇත
ටී. ටොඩුවා

-18

හොඳයි, මම මෙම පියවර අනුගමනය කර ඇත්තෙමි.

  1. පැවැත්වීමට පන්තියක් සමඟ බෙදන්න iframe
  2. එකතු iframeකිරීමට div.
  3. CSS ගොනුවේ,
divClass { width: 500px; height: 500px; }
divClass iframe { width: 100%; height: 100%; }

මෙය IE 6 හි ක්‍රියාත්මක වේ. වෙනත් බ්‍රව්සර්වල වැඩ කළ යුතුදැයි පරීක්ෂා කරන්න!


9
iframe ඇතුළත div පාලනය කිරීමට අවශ්‍යයි, මෙය එසේ නොවේ
MSD
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.