Mathieu
Mathieu

Reputation: 4797

Target iframe src inside ajax_injected chunk of code

I have a block of code that is spit by oembed. then I need to target the src attribute of iframes and replace it with data-src.

Her's what I have currently:

embed_request = {
      url: url,
      dataType: "jsonp",
      cache: false,
      success: function (data) {
        try {          
          var embed_html = (data.html).replace('src', 'data-src');
          $( "div#item"+number).html(embed_html);
        } catch (err) {
          console.log(err);
        }
      }
    };    

$.ajax(embed_request);

The issue is that my replace() above changes too many src inside the chunk of code data.html

How can I tell via javascript or jquery here var embed_html = (data.html).replace('src', 'data-src'); to only change the iframe's src it runs into inside the chunk of html code.

Today unfortunately my current code changes not only the below iframe src but also the src of src="//platform.instagram.com/en_US/embeds.js":

<iframe src="https://www.instagram.com/p/64567SDFFDFS/embed/captioned/?cr=1&amp;v=7" class="instagram-media instagram-media-rendered" id="instagram-embed-0"  allowtransparency="true" frameborder="0" height="849" data-instgrm-payload-id="instagram-media-payload-0" scrolling="no" style="border: 1px solid rgb(219, 219, 219);"></iframe>
<script async="" defer="" src="//platform.instagram.com/en_US/embeds.js"></script>

So I get in the final spitted view:

<iframe data-src="https://www.instagram.com/p/64567SDFFDFS/embed/captioned/?cr=1&amp;v=7" class="instagram-media instagram-media-rendered" id="instagram-embed-0"  allowtransparency="true" frameborder="0" height="849" data-instgrm-payload-id="instagram-media-payload-0" scrolling="no" style="border: 1px solid rgb(219, 219, 219);"></iframe>
    <script async="" defer="" data-src="//platform.instagram.com/en_US/embeds.js"></script>

How to only target the iframe's src ?

Thanks

EDIT

Here are two examples of the html chunk code spitted by oembed

instagram

<div class="item active" id="item1">
<iframe class="instagram-media instagram-media-rendered" id="instagram-embed-0" src="https://www.instagram.com/p/BPodiIYgG3K/embed/captioned/?cr=1&amp;v=7" allowtransparency="true" frameborder="0" height="776" data-instgrm-payload-id="instagram-media-payload-0" scrolling="no" style="border: 1px solid rgb(219, 219, 219); margin: 1px 1px 12px; max-width: 320px; width: calc(100% - 2px); border-radius: 4px; box-shadow: none; display: block; padding: 0px; background: rgb(255, 255, 255);"></iframe>
    <script async="" defer="" src="//platform.instagram.com/en_US/embeds.js"></script>
</div>

Facebook

<div class="item " id="item2">

          <div id="fb-root" class=" fb_reset"><div style="position: absolute; top: -10000px; height: 0px; width: 0px;"><div></div></div><div style="position: absolute; top: -10000px; height: 0px; width: 0px;"><div><iframe name="fb_xdm_frame_http" frameborder="0" allowtransparency="true" allowfullscreen="true" scrolling="no" title="Facebook Cross Domain Communication Frame" aria-hidden="true" tabindex="-1" id="fb_xdm_frame_http" src="http://staticxx.facebook.com/connect/xd_arbiter/r/0eWevUAMuoH.js?version=42#channel=f3e391184&amp;origin=http%3A%2F%2Flocalhost%3A3000" style="border: none;"></iframe><iframe name="fb_xdm_frame_https" frameborder="0" allowtransparency="true" allowfullscreen="true" scrolling="no" title="Facebook Cross Domain Communication Frame" aria-hidden="true" tabindex="-1" id="fb_xdm_frame_https" src="https://staticxx.facebook.com/connect/xd_arbiter/r/0eWevUAMuoH.js?version=42#channel=f3e391184&amp;origin=http%3A%2F%2Flocalhost%3A3000" style="border: none;"></iframe></div></div></div>
    <script>(function(d, s, id) {
      var js, fjs = d.getElementsByTagName(s)[0];
      if (d.getElementById(id)) return;
      js = d.createElement(s); js.id = id;
      js.src = "//connect.facebook.net/fr_FR/sdk.js#xfbml=1&version=v2.3";
      fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));</script><div class="fb-post fb_iframe_widget" data-href="https://www.facebook.com/cocacolafrance/posts/1526674334016658" data-width="536" fb-xfbml-state="rendered" fb-iframe-plugin-query="app_id=&amp;container_width=0&amp;href=https%3A%2F%2Fwww.facebook.com%2Fcocacolafrance%2Fposts%2F1526674334016658&amp;locale=fr_FR&amp;sdk=joey&amp;width=536"><span style="vertical-align: bottom; width: 536px; height: 404px;"><iframe name="f2115553f8" width="536px" height="1000px" frameborder="0" allowtransparency="true" allowfullscreen="true" scrolling="no" title="fb:post Facebook Social Plugin" src="https://www.facebook.com/v2.3/plugins/post.php?app_id=&amp;channel=http%3A%2F%2Fstaticxx.facebook.com%2Fconnect%2Fxd_arbiter%2Fr%2F0eWevUAMuoH.js%3Fversion%3D42%23cb%3Dfc155ce24%26domain%3Dlocalhost%26origin%3Dhttp%253A%252F%252Flocalhost%253A3000%252Ff3e391184%26relation%3Dparent.parent&amp;container_width=0&amp;href=https%3A%2F%2Fwww.facebook.com%2Fcocacolafrance%2Fposts%2F1526674334016658&amp;locale=fr_FR&amp;sdk=joey&amp;width=536" class="" style="border: none; visibility: visible; width: 536px; height: 404px;"></iframe></span></div></div>

Upvotes: 1

Views: 321

Answers (1)

Sarah Gro&#223;
Sarah Gro&#223;

Reputation: 10879

You can convert the markup string to HTML elements (off the DOM) first, then find any iframe elements, replace their attribute(s), and add the whole thing to the DOM:

embed_request = {
  url: url,
  dataType: "jsonp",
  cache: false,
  success: function (data) {
    try {          
      $(data.html).filter('iframe').each(function() {
        var $this = $(this);
        $this.attr('data-src', $this.attr('src')).removeAttr('src');
      }).end().appendTo("div#item"+number);
    } catch (err) {
      console.log(err);
    }
  }
};    

$.ajax(embed_request);

Here's a mockup (replaced the ajax call by a function call etc.) to show that it's working:

var number = 1,
    data = {html: atob("PGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vcC82NDU2N1NERkZERlMvZW1iZWQvY2FwdGlvbmVkLz9jcj0xJmFtcDt2PTciIGNsYXNzPSJpbnN0YWdyYW0tbWVkaWEgaW5zdGFncmFtLW1lZGlhLXJlbmRlcmVkIiBpZD0iaW5zdGFncmFtLWVtYmVkLTAiICBhbGxvd3RyYW5zcGFyZW5jeT0idHJ1ZSIgZnJhbWVib3JkZXI9IjAiIGhlaWdodD0iODQ5IiBkYXRhLWluc3Rncm0tcGF5bG9hZC1pZD0iaW5zdGFncmFtLW1lZGlhLXBheWxvYWQtMCIgc2Nyb2xsaW5nPSJubyIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIHJnYigyMTksIDIxOSwgMjE5KTsiPjwvaWZyYW1lPjxzY3JpcHQgYXN5bmM9IiIgZGVmZXI9IiIgc3JjPSIvL3BsYXRmb3JtLmluc3RhZ3JhbS5jb20vZW5fVVMvZW1iZWRzLmpzIj48L3NjcmlwdD4=")}; // this is the html provided by you, containing the iframe and script tag, but I had to base64 encode it, as otherwise the code snippet tool wouldn't let me insert it

(function (data) {
  try {          
    $(data.html).filter('iframe').each(function() {
      var $this = $(this);
      $this.attr('data-src', $this.attr('src')).removeAttr('src');
    }).end().appendTo("div#item"+number);
  } catch (err) {
    console.log(err.message);
  }
})(data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="item1"></div>

Upvotes: 2

Related Questions