【问题标题】:how can I get the code to be in single line when viewing the source code?查看源代码时如何使代码在单行中?
【发布时间】:2019-09-06 18:43:02
【问题描述】:

我正在尝试创建一个动态添加输入的按钮,由于我使用的是 Zend 框架,因此我使用此方法从表单文件中获取输入:<?php echo $this->formm->getElement('refA'); ?>

但我收到此错误:Uncaught SyntaxError: Unexpected identifier

那个添加按钮的jquery函数是:

$(document).ready(function (){
    var j = "<?php echo $this->formm->getElement('refA'); ?>";
    $("#add-more").click(function(){   
        $(".row").append(j);
    });
});

当我点击那个错误时,它会告诉我哪里有错误,它似乎在使用:

$(document).ready(function (){
    var j = "<label for="refA" class="optional">Article:</label>
             <select name="refA" id="refA" class="form-control">
               <option value="test1" label="test1">test1</option>
             </select>";
    $("#add-more").click(function(){   
        $(".row").append(j);
    });  
});

是否可以在单行中生成代码,以便我可以使按钮工作?

【问题讨论】:

标签: javascript forms zend-framework zend-form


【解决方案1】:

看起来这是一个引用问题 - PHP 在其中插入的数据有双引号,会不断终止您的字符串。尝试用单引号括起来 - 使用 refA 转义:


$(document).ready(function (){
    var j = '<?php echo $this->formm->getElement(\'refA\'); ?>';
    $("#add-more").click(function(){   
        $(".row").append(j);
    });
});

好的,在进行更多挖掘之后,您需要在它之前删除那些引号和空格。不幸的是,我不是 PHP 人 - 所以我希望语法是正确的 - 想法是从 refA 获取数据并将其存储在 $message 中 - 然后去掉任何空格并转义任何引号,然后回显要设置为'j'的值:

$(document).ready(function (){
   var j = '<?php $message = $this->formm->getElement("refA"); $message = preg_replace("/\r?\n/", "\\n", addslashes($message));echo $message?>'
   $("#add-more").click(function(){   
       $(".row").append(j);
   });
});

在此处找到的 PHP 方法: https://www.the-art-of-web.com/php/javascript-escape/

另一个完全解决问题的选项是使用 es6 - 模板字符串(反引号)


$(document).ready(function (){
    var j = `<?php echo $this->formm->getElement("refA"); ?>`;
    $("#add-more").click(function(){   
        $(".row").append(j);
    });
});

大多数现代浏览器都会原生处理 es6 Template Strings

【讨论】:

  • 我试过了,但它在 Visual Studio 代码上显示了这个:语法错误,意外的 ''refA\'); ?>'' (T_CONSTANT_ENCAPSED_STRING),期望标识符 (T_STRING)
  • 您是否将整行都用单引号括起来。然后在 refA 前后添加 \ 转义字符?从那个错误来看,您似乎只逃脱了第二个错误——而不是“refA”——切换到 \'refA\' - 让我知道这是否能解决问题
  • JS 代码呈现在客户端,而 PHP 呈现在服务器端。因此,PHP 中的引号不得转义。
  • 我试过了,但我得到了这个:Uncaught ReferenceError: $ is not defined
  • 你不是在用jQuery吗?
【解决方案2】:

正如 Kyle 所说,您遇到了引用问题。但是,与他所说的不同,引号 inside PHP 标签 不得 转义,因为它们是在服务器端呈现的。

这应该可以解决问题:

window.onload = function() {
    $(document).ready(function (){
        var j = '<?php echo  preg_replace("/\r|\n/", "", $this->formm->getElement('refA')); ?>';
        $("#add-more").click(function(){   
            $(".row").append(j);
        });
    });
}

编辑:查看您的屏幕截图和其他 cmets,您似乎正在尝试在加载之前访问 jQuery ($)(我想您正在加载所有 JS 依赖项布局)。 由于您不能在 JS 文件中使用 PHP 代码,因此您有两种选择:

  1. 您在模板 (ajouter.phtml) 中创建一个 JS 变量,例如 var inputTemplate = &lt;?php echo preg_replace(....);?&gt;;,然后在您的 JS 文件中使用该变量
  2. 您确保 that JS sn-p 仅在页面完全加载时执行(因此使用 window.onload = function(){}

就个人而言,我建议您使用第一个选项。在 phtml 中插入 JS 代码在概念上是错误的,因为如果你决定不再使用 jQuery,你就不必进入所有模板来找到那些 sn-ps。

【讨论】:

  • 您遇到了哪个错误?如果您收到T_CONSTANT_ENCAPSED_STRING,请检查您没有转义refA 引号。
  • 在 Visual Studio 中我没有收到任何错误,但我收到了 Uncaught SyntaxError: Unexpected identifier error
  • 你能用它的堆栈发布完整的错误吗?并显示产生该错误的确切代码?
  • “堆栈完全错误”,而不仅仅是错误消息。
  • 加:“显示产生该错误的确切代码”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多