简体   繁体   中英

Why does file_get_contents() Javascript Output not Execute?

Backstory: I'm trying to use the Newsletter Widget from SendGrid but they currently don't offer it using SSL. So any requests to https:// just redirect to http:// and then browsers complain about insecure content on my secure site.

Ok fine, so I implement something like this in PHP:

$output = file_get_contents('http://sendgrid.com/newsletter/getSubscriptionWidget?p=xxx');

And then in my view have this:

 <script type="text/javascript">
    <?php echo($output); ?>
 </script>

Viewing the source of this page after execution shows that it pulls the javascript widget code in just fine. BUT , it doesn't work. By "not working" I mean the javascript code never executes.

If I load it (in a non-https development environment) using the script tag like:

<script type="text/javascript" src="http://sendgrid.com/newsletter/getSubscriptionWidget?p=xxx">

Then it works just fine!

TL;DR; What would cause javascript to execute fine when loaded under the src attribute of the script element and not work when echoed as content inside script tags?

PS You can view the SendGrid widget source here .

SOLVED

Turns out the SendGrid code checks to ensure the script tag is pointing at the script using this:

// replace each instance
$('script').each(function (wIdx, wElem) {
var tag, src, table, trSubmit, tdSubmit, form, emailInput, message, params;

tag = $(this);
src = tag.attr('src');
params = RegExp('p=' + '(.+?)(&|$)').exec(src);
// check if corret script
if ($.isArray(params) && params.length > 1 && key === params[1]) {
  form = $('<form />', {
    'class': 'SG_widget_form',
    'method': 'POST',
    'action': postURL,
    'accept-charset': 'UTF-8'
  });
  form.insertBefore(tag);
  tag.remove();
  message = $('<span />').insertBefore(form).hide();

... there is more after that, but that is the important piece. By adding the src attribute to the tag and pointing it at the correct location, the browser will block loading it normally, but will then execute the code I echoed with PHP inside of it.

Probably fairly specific to my problem, but hopefully it will help someone else.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM