如何逃离“;jQuery代码中的“[”字符


How to escape "[" character in jQuery code

我试图在一些INPUT元素中设置一些值,但我的代码不起作用。请参阅以下代码:

<?php foreach($languages as $language): ?>
   $('input[name="product_description''[<?php echo $language["language_id"]; ?>'']''[name'']]"').val(data.items[0]['volumeInfo']['title']);
   $('input[name="product_description''[<?php echo $language["language_id"]; ?>'']''[description'']]"').val(data.items[0]['volumeInfo']['description']);
<?php endforeach ?>

HTML标记如下所示:

<input type="text" value="" size="100" name="product_description[1][name]">

怎么了?jQuery没有返回任何错误和数据。items[0]['volumeInfo']['title']有值,所以我做错了什么?

不要将HTML、PHP和JavaScript混合在4行中。

行数少并不是更好的代码,混合语言是更糟糕的代码。尽最大努力将关注点分离,这使您的代码模块化,更易于使用。像这样的错误根本不会发生在有良好的关注点分离的代码中

你需要考虑的第一件事是:"为什么我写代码来写更多的代码很多次?"

在一天结束的时候,你只是试着用不同的foo和bar值来做很多次:

var inputElement = $('input[name="product_description[foo][bar]"]');
inputElement.val(data.items[0]['volumeInfo']['title']);

这显然适合作为JavaScript函数(而不是PHP代码):

function fooBar(foo, bar) {
  var inputElement = $('input[name="product_description[' + foo + '][' + bar+ ']"]');
  inputElement.val(data.items[0]['volumeInfo'][bar]);
}

仍然不是最干净的,但嘿,现在你的JavaScript只通过了一个点。

好的,现在你只需要给它一些数据,如果你有一个数组,比如:,你可以这样做

var baz=[{"language_id":"foo1","barVal":"bar1"},{"language_id":"foo2","barVal":"bar2"},{"language_id":"foo3","barVal":"bar3"},]

嘿,你可以用在PHP中生成

json_encode($languages); //Assuming you've set up a value for barVal...

所以现在你的jQuery只需要循环通过它

$.each(baz, function(key, val){
    fooBar(val["language_id"], val["barVal"]);
})

那么,你的整件事会是什么样子?

//Whatever.php
var baz = <?php echo json_encode($languages); ?>;
function fooBar(foo, bar) {
  var inputElement = $('input[name="product_description[' + foo + '][' + bar+ ']"]');
  inputElement.val(data.items[0]['volumeInfo'][bar]);
}
$.each(baz, function(key, val){
    fooBar(val["language_id"], val["barVal"]);
})

我在查看您的代码时遇到了一些问题。。。你没有提供足够的信息让我明白你到底在做什么。此外,我怀疑您不想在每个值中放入"data.items[0]['volumeInfo']",但这就是您的代码所说的,所以我使用了它。您应该能够查看上面的代码,并找到一些方法使其实现您想要的功能。

不要在生产中使用变量foo、bar、baz或buz。这些是占位符名称,仅作为示例代码。使用描述性变量名称,这些名称背后没有隐藏的含义(以防您以前从未见过这些名称)。

不要混淆你的代码,如果你这样做了,尽可能多地分离关注点。jQueryAPI中记录了转义行为,但从PHP中添加另一层转义复杂性会导致这种令人沮丧的情况。你可以通过这样做来避免将来的痛苦。

像这样使用名称和数组作为输入值确实一点也不理想。阅读jQuery的一些API和它所构建的原生DOM,看看是否可以找到更好的方法。它是存在的。查看标签维基,我个人花了一些时间来确保里面有很棒的内容。

最后,我没有测试或验证它是否运行,但代码结构是您应该遵循的。我不是在为你写代码,我是在向你展示一个结构来完成这项工作,当你必须在6个月内来维护它时,它会让你的头发完好无损。

祝你好运。

不要取消捕获不在PHP块中的字符,这部分代码不会被处理并按原样传递给浏览器:

<?php foreach($languages as $language): ?>
   $('input[name="product_description'[<?php echo $language["language_id"]; ?>']'[name']]"').val(data.items[0]['volumeInfo']['title']);
   $('input[name="product_description'[<?php echo $language["language_id"]; ?>']'[description']]"').val(data.items[0]['volumeInfo']['description']);
<?php endforeach ?>

尽管有关于更好地使用jQuery的重要建议,但使用更好的PHP并避免到处切换上下文如何?它很乱,很难阅读,而且(正如你的问题所表明的)可能会导致标点错误。

<?php
  $fmt="'$('input[name='"product_description[%s][%s]]'"').val(data.items[0]['volumeInfo']['%s']);'n";
  foreach ($languages as $language) {
    printf($fmt, $language["language_id"], "name", "title");
    printf($fmt, $language["language_id"], "description", "description");
  }
?>

当然是未经测试的。