【问题标题】:Mystery line break appears when outputting JavaScript with PHP.使用 PHP 输出 JavaScript 时出现神秘的换行符。
【发布时间】:2012-08-27 00:26:24
【问题描述】:

我正在使用 PHP 为 WordPress 短代码输出一些 JavaScript。我的 php 看起来像这样:

$output="<script type='text/javascript' >
jQuery(document).ready(function() {
    jQuery('#photo{$photo_id}').on('click', function(){ 
      Shadowbox.open({
        content: '<div id=\'popup{$photo_id}\' class=\'popup\'>{$content}</div>',
        player:     'html',
        height:     500,
        width:      1200,
        handleOversize: 'drag'
        }); 
    });
});       
</script>";

return $output;

但输出在 Shadowbox 的内容论证中的第一个引号之后有一个换行符。

像这样:

jQuery(document).ready(function() {
    jQuery('#stylistphoto1').on('click', function(){    
      Shadowbox.open({
        content: '
<div> id=\'popup1\' class=\'popup\'> . . .

这给了我一个“未终止的字符串文字”错误并使我的脚本失败。

发生了什么事?

注意事项: 一个。这是在没有 BOM 的 UTF-8 中编码的。 湾。这在某一时刻确实奏效了。 C。如果我传递一个空字符串作为内容争论,它就可以正常工作,当然,这对我没有帮助。

【问题讨论】:

  • 我在我的机器上运行了你的代码(windows XAMPP php 5.3.8),输出看起来很好,任何地方都没有意外的线刹车......
  • 感谢 PeterVR。不幸的是,即使有下面提到的建议,我也不能这样做。
  • 你试过我提供的代码了吗?

标签: php javascript wordpress shadowbox


【解决方案1】:

首先,我不会在 php 变量中定义 javascript 功能,然后在某处回显,这是一种非常糟糕的做法。

这里的问题可能是您的样式中的某些内容打破了该行,因为它很长。您可以采取以下措施来解决此问题:

$output="<script type='text/javascript' >
jQuery(document).ready(function() {
    jQuery('#photo{$photo_id}').on('click', function(){ 
      Shadowbox.open({
        content: '<div id=\'popup{$photo_id}\' ' +
                 'class=\'popup\'>{$content}</div>',
        player:     'html',
        height:     500,
        width:      1200,
        handleOversize: 'drag'
        }); 
    });
});       
</script>";

return $output;

【讨论】:

  • it's a very bad practice. 欢迎来到 Wordpress 插件世界。
  • 我自己不是 WordPress 专家,但我只是在谷歌上快速搜索了一下,发现了这个:Adding Scripts Properly to WordPress。也许那篇文章可以指导更干净的方法?
  • 我的意思是:不要在 wordpress 插件中寻找好的做法。 :) 这是不同的世界
  • 感谢 Xavier,我想如果我发布了这篇文章,我会得到一个评论,说用 PHP 输出 JavaScript 不是一个好习惯。我阅读了你提到的那篇文章,如果我使用文章中的方法,我没有这个问题,但是,我需要每次使用不同的变量多次运行这个脚本(因为每次编辑器都会应用它使用简码)。我无法调整文章中的方法以允许我这样做。不过感谢您的文章——它对我将来非常有用——我一直在想如何做到这一点!
  • 很高兴听到。最后一点,您如何设置一个对象,然后在模板上为该对象设置一些属性,然后在该函数上使用它们?这样,您的 javascript 代码将使用动态属性,具体取决于您在模板上设置所述对象的方式。不确定我是否解释过自己。
【解决方案2】:

WordPress 的自动格式化功能之一,wpautop 过滤器导致了问题。

我已经在使用 Chris Coyer 的“原始”简码 (http://css-tricks.com/sn-ps/wordpress/disable-automatic-formatting-using-a-shortcode/) 所以答案很简单将脚本包装在 [raw][/raw] 短代码中,然后再将其输出回内容区域。

哈哈哈!

【讨论】:

    【解决方案3】:

    在我看来content: '&lt;div id=\'popup{$photo_id}\' class=\'popup\'&gt;{$content}&lt;/div&gt;' 是个问题,因为参数content 的值被解释为'&lt;div id=\'。它停在下一个引号处。如果您的 PHP 版本不喜欢这个(看起来),您应该通过连接来分隔这部分变量。

        $output="<script type='text/javascript' >
    jQuery(document).ready(function() {
        jQuery('#photo{$photo_id}').on('click', function(){ 
          Shadowbox.open({";
    
    $output .= "
            content: '<div id=\"popup{$photo_id}\" class=\"popup\">{$content}</div>,'";
    
    $output .= "
            player:     'html',
            height:     500,
            width:      1200,
            handleOversize: 'drag'
            }); 
        });
    });       
    </script>";
    
    return $output;
    

    最好将 ' 用于 echo 语句,将 " 用于内部的所有内容,尽可能避免处理引号转义,例如 echo 'My friend says "hello", Tom.';

    【讨论】: