如何在JavaScript中调用PHP函数获取对应语言ID的语言名称?
问题原因
PHP是服务器端先运行,生成页面后才发送给浏览器;JS是浏览器端后运行。你原来的写法试图把JS变量language_id传给PHP函数,但PHP运行时这个JS变量根本还不存在,所以肯定拿不到正确的语言名称。
解决方案(两种可选)
方案一:提前把所有语言数据传给JS
在script.php里先把所有语言的ID和名称转成JS可直接用的对象,之后JS直接从这个对象里取值:
- 在
script.php开头,先获取所有语言的ID-名称映射并转成JSON:
$Language = Registry::get('Language'); // 假设$languages是product.php中遍历的语言数组,确保script.php能访问到这个变量 $languageMap = []; foreach ($languages as $lang) { $languageMap[$lang['id']] = $Language->getLanguagesName($lang['id']); } // 转成JSON字符串,供JS使用 $languageJson = json_encode($languageMap);
- 修改EOD里的JS代码,引入这个映射并取值:
<script defer> // 把PHP生成的JSON转成JS对象 const languageMap = <?php echo $languageJson; ?>; $('[id^="seo_default_title_h"]').each(function(index) { let button = '{$content}'; let newButton = $(button).attr('data-index', index); let inputId = $(this).attr('id'); let regex = /(\d+)/g; let idSeoDefaultTitleH = regex.exec(inputId)[0]; let language_id = parseInt(idSeoDefaultTitleH); // 直接从映射里取对应语言名称 let language_name = languageMap[language_id]; let questionResponse = '{$question_title}' + ' ' + '{$store_name}' + ' : traduction ' + language_name newButton.click(function() { let message = questionResponse; $.post("{$url}", {message: message}, function(data) { $("#output-input").val(data); $("#seo_default_title_h_" + idSeoDefaultTitleH).val(data); }); }); $(this).append(newButton); }); </script>
方案二:在HTML元素里嵌入语言名称(更简单)
直接在product.php的循环里,给对应的输入框容器加上data-language-name属性,JS直接读取这个属性值:
- 修改product.php里的代码,给div添加数据属性:
<div class="col-md-7 input-group" id="seo_default_title_h<?php echo $languages[$i]['id']; ?>" data-language-name="<?php echo $Language->getLanguagesName($languages[$i]['id']); ?>"> <?php echo ' ' . HTML::inputField('seo_defaut_language_title_h1_[' . $languages[$i]['id'] . ']', ($seo_defaut_language_title[$languages[$i]['id']] ?? SeoAdmin::getSeoTitleH1($seo->seo_id, $languages[$i]['id'])), 'maxlength="70" size="77" id="seo_default_title_h_' . $languages[$i]['id'] . '"', false); ?> </div>
- 修改script.php里的JS代码,直接读取数据属性:
let language_name = $(this).data('language-name');
替换原来那句出错的let language_name = '{$Language->getLanguagesName(' + language_id + ')}';即可,其他代码不用改。
内容的提问来源于stack exchange,提问作者Juliana
相关产品推荐
相关产品推荐

