0

我正在尝试在某些 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'] 有值所以我做错了什么?

4

3 回答 3

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 ?>
于 2012-08-19T18:35:24.637 回答
2

不要将 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 和它所构建的本机 DOM 的 API,看看你是否能找到更好的方法。它存在。检查标签 wiki,我个人花时间确保其中有很棒的内容。

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

祝你好运。

于 2012-08-22T03:19:55.977 回答
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");
  }

?>

当然,未经测试。

于 2012-08-19T19:31:58.170 回答