除非字符串包含美元符号('$'),否则用于操作值的PHP函数不起作用

时间:2013-04-14 21:01:30

标签: php javascript string

PHP &下面显示的 JS 函数协同工作1)从数组中填充select个元素2)预先选择与 db 值匹配的options,以及3 )在select上操纵options元素focus的值。

PHP 辅助函数与 JS focus函数协同工作,如果db值包含后缀'_default',则操作字符串值,但只有在选项/字符串值包含美元符号('$')时才触发。代码中没有任何东西需要这个,但我已经测试了所有可能性,这是唯一似乎导致它的东西。

我在http://click2fit.com/sample_php_select.php发布了合并代码的功能示例。要查看问题的实际效果,请点击“提交”按钮,而不关注select元素,并echo两个select元素的已发布值,其中包含“默认”值 - 一个有美元符号,一个没有。出于演示问题的目的,我对值进行了硬编码,而不是从 db 中获取它们。另外,我在这里发布了 JS 函数的小提琴http://jsfiddle.net/chayacooper/JHAPp/6/

PHP& HTML

<?php
// Helper function that replaces a key while maintaining the entry's position in the array. It does not modify the given array, but returns a new array.
function replaceKey($array, $oldKey, $newKey) {
    $newArray = array();
    foreach ($array as $key => $value) {
        $newArray[($key === $oldKey) ? $newKey : $key] = $value;
    }
    return $newArray;
} 
// Function to select the option matching the value in the db
function printSelectOptions($dataArray, $currentSelection) {
    foreach ($dataArray as $key => $value) {
        echo '<option ' . (($key == $currentSelection) ? 'selected="selected"' : '') . ' value="' . $key . '">' . $value . '</option>';
    }
}
  try {  
    $stmt = $conn->prepare("SELECT * FROM price WHERE user_id = :user_id");  
    $stmt->bindValue(':user_id', $user_id); 
    $stmt->execute();
}  catch(PDOException $e) {echo $e->getMessage();}
$row = $stmt->fetch();
$search_default = array('_default');
$replace_default = array('');
$row_default = str_replace($search_default, $replace_default, $row);
?>

<select name="importance" id="importance">
<?php
    // Generates a <select> element with the options specified in this array
    $options = array("1"=>"1", "2"=>"2", "3"=>"3", "4"=>"4", "5"=>"5");
    // If these are different then the value from the database includes "_default"
    if ($row_default['importance'] !== $row['importance']) {
        // Change the key for the entry in $options so it includes "_default" 
        $options = replaceKey($options, $row_default['importance'], $row['importance']);
    }
    $selected = $row['importance'];
    // Pre-selects the option matching the db information
    echo printSelectOptions($options, $selected);
?>
</select>   

JS功能

 $(function () {
     $('select').focus(function () {
         var option = $(this).find("option[value*=default]");
         option.attr('value', option.attr('value').replace(/_default/g, ''));
     });
 });

JS功能的目的

我预先选择最常用的apx选项。 300 select个元素,并且正在使用此函数来区分这些值何时仍处于其初始预选/默认状态与用户在关注表单元素后主动选择该值之间的区别。

2 个答案:

答案 0 :(得分:1)

option没有获得任何价值,replace与jQuery无法合作。

改变这个:

$(function () {
  $('select').focus(function () {
     var option = $(this).find("option[value*=default]");
     option.attr('value', option.attr('value').replace(/_default/g, ''));
  });
});

对此:

$(function () {
  $('select').focus(function () {
    var default_option = $("option[value*=default]"); // Just added this part to a variable, for easy of use.
    var option = default_option.val(); // Got the option value that contains the word default.
    // This will replace the '_default' with '' and assign the new value to the option
    default_option.val(function(index, value) {
      return value.replace(/_default/g, '');
    });
  });
});

但是javascript不是你唯一的问题。你在PHP代码中遇到很多问题,我担心你会让它变得比实际上更复杂。

答案 1 :(得分:0)

在您的示例页面上找不到option,因为最初没有其值中包含_default的选项。你需要设置一个从开始或编辑你的JS,以包括一个选项,当没有找到选项时:

var option = $(this).find("option[value*=default]") ||  $(this).find("option:first-child");

但说实话,我不知道你试图用这段代码实现什么。