Javascript add text to iframe

Поместив html внутри iframe (используя javascript)

Можно ли создать пустой iframe в качестве заполнителя, чтобы впоследствии вставить html в него?

В других словах предположим, что у меня есть пустой iframe с id,

Как мне вставить html в него?

Я использую jquery, если это упростит.

Вы можете сделать это без jQuery также:

var iframe = document.getElementById('iframeID'); iframe = iframe.contentWindow || ( iframe.contentDocument.document || iframe.contentDocument); iframe.document.open(); iframe.document.write('Hello World!'); iframe.document.close(); 

jQuery html разделяет тело, html и head теги из вставленного HTML.

Посмотрите на исходной странице этой страницы: http://mg.to/test/dynaframe.html Кажется, он делает именно то, что вы хотите сделать.

Нет, нет. Вы изменили бы script следующим образом:

iframeElementContainer = document.getElementById('BOX_IFRAME').contentDocument; iframeElementContainer.open(); iframeElementContainer.writeln("hello"); iframeElementContainer.close(); 

Да, я знаю, что это возможно, но главная проблема заключается в том, что мы не можем обрабатывать фрейм извне. Я уже загрузил какую-то другую вещь.

 

Тогда его невозможно ударить.

У меня та же проблема, где я должен показать фрагмент HTML-кода в iframe динамически из базы данных без атрибута SRC iframe, и я исправил ту же проблему с помощью следующего кода

Я надеюсь, что это поможет кому-то, кто имеет такое же требование, как я.

  

Источник

How to Load HTML, CSS, and JS Code into an iFrame

If you’re just here for the answer, not the story, the solution is at the bottom. If you’ve ever used JSFiddle, Codepen, or others, this problem will be familiar to you: The goal is to take some HTML, CSS, and JS (stored as strings) and create an iframe with the code loaded inside. This problem should be easy, but it isn’t. At least. It wasn’t, until I found the golden ticket I had been waiting for all along. But more on that later. Let’s start with all the things that didn’t work, because that’s more fun.

Attempt #1: Using srcdoc

After doing a bit of research, I was thrilled to discover that it’s possible to add a srcdoc attribute to iframes. If you pass in an HTML string, the iframe will load with that HTML content inside:

 srcdoc="

This text will appear in the iframe!

"
>

1. Browser Support for srcdoc is not great

If we want to support IE or Edge, we’ll need a different approach (or a polyfill).

2. It’s possible to «escape» from CSS/JS

function setIframeContent(iframe,  html, css, js >)  const source = `  $css>  $html> $js>   ` iframe.srcdoc = source > 

The problem? When writing CSS or JS, it’s possible to «escape» out into HTML land, simply by including

or in the code, respectively. This bug is actually quite common; both JSFiddle and Codepen are affected:

Attempt #2: Serverless Boomerang

To fix the browser support issue, let’s replace srcdoc with a regular src attribute. In order to do this, we’ll need to pass a real URL instead of just code. Perhaps we can set up a page which takes HTML, CSS, and JS «GET» parameters and spits out the same type of page as before, but this time loaded from an actual URL. This is a perfect time to use a serverless architecture, because we just want a single endpoint that does one thing. Here’s my attempt:

module.exports = (req, res) =>  // Code comes from GET params in URL const  html = '', css = '', js = '' > = req.query // Generate and send HTML page return res.send(`  $css>  $html> $js>   `) > 
  1. «Escaping» from CSS/JS into HTML is still a problem
  2. The entire source code is passed in a URL, which isn’t ideal.

Attempt #3: Serverless Boomerang (redux)

Our first boomerang solved the browser support problem, but still has the «escaping» issue to deal with.

Fortunately, due to the way that we pass in the code, this can actually be solved. Rather than inserting the CSS and JS into the page on the server, we can do it on the client! This works because the URL GET parameters are still accessible to the client’s computer.

The source here is a bit longer, but it does work:

module.exports = (req, res) =>  return res.send(`     $req.query.html || ''>  `) > 

Now, if a script or style includes scary HTML characters, the browser will handle them for us when inserting said script/style into the document.

This solution is. fine. It works, technically. But we still have the soft URL length limit to consider. Plus, we’re now dealing with something server-side that feels like it should happen on the client.

There must be a better way.

Solution: Blob URLs

This entire time, we’ve been trying to simulate loading data from a URL:

  • First we used srcdoc to load data instead of loading from a URL
  • Then we used the boomerang to load code from a URL
  • Next we updated our boomerang to attempt to simulate the «loading CSS/JS from an external URL» behavior, despite every resource coming from one URL.

It turns out that Javascript has a feature to do just this: Blob URLs.

Blobs

We can use the Blob constructor to create a pseudo-file. It’s not a real file loaded from disk or from a URL — it’s just stored in memory. But in many ways, it functions just like a real loaded file.

Then, we can use URL.createObjectURL(blob) to create a URL that can be used to load the contents of the blob.

Here’s how that works in practice:

const getBlobURL = (code, type) =>  const blob = new Blob([code],  type >) return URL.createObjectURL(blob) > console.log(getBlobURL('

My webpage

', 'text/html')) // blob:https://dev.to/9ca05e31-05ea-48f8-838d-cc1ad0949ec8

Try running the above code in the console to see it for yourself! It will log a URL. If you paste the URL into a new tab (including the blob: bit at the beginning), it will load a page containing the HTML.

Notice the ‘text/html’ passed to getBlobURL ? We can change that too. Generating a CSS or JS blob is easy: Just pass text/css or text/javascript respectively.

Another benefit of blob URLs is that they stick around, and can be accessed any way that you would access a regular URL. Which means that we can actually load our CSS and JS files from a separate URL, so the «escaping» trick is no longer a problem.

Here’s a bare-bones implementation of this in practice:

const getGeneratedPageURL = ( html, css, js >) =>  const getBlobURL = (code, type) =>  const blob = new Blob([code],  type >) return URL.createObjectURL(blob) > const cssURL = getBlobURL(css, 'text/css') const jsURL = getBlobURL(js, 'text/javascript') const source = ` $css && `$cssURL>" />`> $js && ``> $html || ''>  ` return getBlobURL(source, 'text/html') > const url = getGeneratedPageURL( html: '

Hello, world!

', css: 'p ', js: 'console.log("hi")' >) const iframe = document.querySelector('#iframe') iframe.src = url

Oh, and browser support for Blob URLs is much better than srcdoc. 😉

The Moral?

Don’t fight the language, I guess.

I knew what I wanted to do: Load data from URLs. It just never occurred to me to look for a non-hacky way to do just that!

Источник

Manipulate iFrame Content

When you can communicate with the code inside an iFrame, you can make any change you want to the code within that iFrame.

We’ve all been there. You need to make a change within an iFrame (from the outside), and it just won’t work. Change a class, add some text, adjust CSS. It just won’t work.

Well, I have good news and bad news (more of a GOTCHA!, really) for you.

The good news is it’s possible.

The bad news is you have to have access to the source of the code within the iFrame. In other words, you can’t take someone else’s website, render it in an iFrame, and then manipulate it in some (obviously clever) way.

But, when you have access to the content within an iFrame, you can use the postMessage function in JavaScript to communicate with it.

Demo

Here’s the demo. The grey background is the iFrame and the input field is what would be on your site. Type a message in the input field on your site and see it appear within the iFrame.

If you’re inspecting the page or viewing its source, this may feel a little strange. I use iFrames to render demos in the site. So, the entire example is in an iFrame, and then there’s another iFrame inside of that.

Your Site’s Code

First, let’s start with the code on your site. Your site is going to post to the site within the iFrame.

input 
type="text"
id="my-message"
placeholder="Type message . "
onkeyup="sendToFrame(event)"
/>

iframe src="/location/of/iframe" frameborder="0" id="my-iframe">iframe>

And the associated script that will post the message:

function sendToFrame(event)  
var iframe = document.getElementById("my-iframe");
if (iframe && iframe.contentWindow)
iframe.contentWindow.postMessage(event.target.value, "*");
>
>

Note the use of the asterisk ( * ). This is meant to be the target origin of the other window. In other words. It should match the source of your iframe if you only want it posting to one origin. In this case, we only have one iFrame on the page and we’re targeting it directly, so we’re okay to use the asterisk.

iFrame Site’s Code

The site with the iFrame will be receiving your posted message.

p> 
strong>Message:strong>
span id="my-message">span>
p>

And the associated script that will receive the message:

window.addEventListener( 
"message",
function (event)
if (event.origin === window.location.origin)
$("#my-message").text(event.data);
>
>,
false
);

Two important points to note here:

  1. We’re checking that the origin of the message is on the same domain as this iframe so we don’t accept messages from other domains.
  2. The data passed with the message is available on the event object as data (i.e. event.data contains the message from the input field in this example).

That’s it. Pretty simple, right? Now, assuming you have access to both the origin site and the source of the iframe, you can manipulate content within the iFrame by some action occurring outside of it.

Источник

Читайте также:  Class and structure in java
Оцените статью