如何在jQuery代码中转义“[”字符

时间:2012-08-19 18:32:39

标签: php javascript jquery

我正在尝试在某些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没有返回任何错误,data.items [0] ['volumeInfo'] ['title']有值,所以我做错了?

3 个答案:

答案 0 :(得分:2)

不要转换不在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 ?>

答案 1 :(得分:2)

不要将HTML,PHP和JavaScript混合在一起。

较少的行不是更好的代码,混合语言是更糟糕的代码。尽力区分问题,这使您的代码模块化,更易于使用。像这样的错误根本不会出现在关注点很好的代码中。

您需要考虑的第一件事是:“为什么我要编写代码来编写更多代码?”

在一天结束时,您只是尝试使用不同的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和它构建的本机DOM的一些API,看看你是否能找到更好的方法。它存在。 Check the tag wiki, I've personally spent time making sure there's great content in it.

最后,我没有测试它或验证它运行,但代码结构是你应该遵循的。我不会为你编写代码,我正在向你展示一个结构,以便在你必须在6个月内保持头发时保持头发完整。

祝你好运。

答案 2 :(得分:0)

尽管你有更好的使用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");
  }

?>

当然没有经过测试。