3

背景故事:我正在尝试使用 SendGrid 的 Newsletter Widget,但他们目前不使用 SSL 提供它。因此,对 https:// 的任何请求都会重定向到 http://,然后浏览器会抱怨我的安全站点上的内容不安全。

好的,所以我在 PHP 中实现了这样的东西:

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

然后在我看来有这个:

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

执行后查看此页面的源代码表明它很好地提取了 javascript 小部件代码。但是,它不起作用。“不工作”是指 JavaScript 代码永远不会执行。

如果我使用以下脚本标记加载它(在非 https 开发环境中):

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

然后它工作得很好!

TL;博士; 什么会导致 javascript在脚本元素的src属性下加载时执行良好,而在脚本标签内作为内容回显时无法正常工作?

PS 您可以在此处查看 SendGrid 小部件源。

4

1 回答 1

1

解决了

结果是 SendGrid 代码检查以确保脚本标记使用以下脚本指向脚本:

// 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();

......之后还有更多,但这是重要的部分。通过将src属性添加到标签并将其指向正确的位置,浏览器将阻止正常加载它,但随后将执行我在其中使用 PHP 回显的代码。

可能相当具体到我的问题,但希望它会帮助别人。

于 2013-05-17T20:49:55.350 回答