我有以下情况,我知道stackoverflow中有很多这个主题,但没有答案给出真正的解决方案,所以我再次发布。
首先看一下这段代码:
<tr>
<td align="right">Estado</td><td>
<select name="estado" onChange="javascript:Atualiza(this.value,'0');">
<option>[selecione]</option>
<?
$qry = "SELECT nome, uf FROM tb_estados";
$res = mysql_query($qry);
while ($ln = mysql_fetch_array($res)) {
echo "<option value='$ln[uf]'>".$ln['nome']."</option>";
}
?>
</select>
</td>
</tr>
现在在这段代码
<tr>
<td align="right">Cidade</td>
<td><div id="atualiza"></div></td>
</tr>
我有一个链接的组合,用于显示州和城市。
现在我的问题:
我无法从我的<div id="atualiza">
获取<select name="estado"
的值没有问题,因为它是我的表单的对象,但div标签不是表单的对象。
我需要INSERT INTO
我的数据库<div id="atualiza">
怎么做?
我想将值保存在隐藏字段中,并将表单发送到我的数据库中。
之前我遇到过类似的情况而且我解决了这个问题,但它太奇怪了,我知道有一个简单的方法可以做到这一点。
Atualiza功能
function Atualiza(valor,cid)
{
loadXMLDoc("combo_cidade.php",valor,cid);
}
也是我的页面combo_cidade.php
<?php
echo "<select name='cidade' id='cidade'>";
echo "<option>[selecione]</option>";
# my databse connection
include_once("config/config.php");
$sql = "SELECT tb_cidades.nome, tb_cidades.id FROM tb_cidades INNER JOIN tb_estados ON tb_cidades.uf=tb_estados.uf WHERE tb_cidades.uf='".$_GET["uf"]."'";
$resultado = mysql_query($sql);
while ($linha = mysql_fetch_array($resultado)){
if ($_GET["cid"]==$linha["id"]){$sel="selected";}else{$sel="";}
echo "<option value='$linha[id]' $sel>$linha[nome]</option>";
}
echo "</select>";
?>
以下是处理我的组合的整个脚本
// JavaScript Document
var req;
function loadXMLDoc(url,valor,cid)
{
req = null;
// Procura por um objeto nativo (Mozilla/Safari)
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
req.onreadystatechange = processReqChange;
req.open("GET", url+'?uf='+valor+'&cid='+cid, true);
req.send(null);
// Procura por uma versao ActiveX (IE)
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
req.onreadystatechange = processReqChange;
req.open("GET", url+'?uf='+valor+'&cid='+cid, true);
req.send();
}
}
}
function processReqChange()
{
// apenas quando o estado for "completado"
if (req.readyState == 4) {
// apenas se o servidor retornar "OK"
if (req.status == 200) {
// procura pela div id="atualiza" e insere o conteudo
// retornado nela, como texto HTML
document.getElementById('atualiza').innerHTML = req.responseText;
} else {
alert("Houve um problema ao obter os dados:\n" + req.statusText);
}
}
}
function Atualiza(valor,cid)
{
loadXMLDoc("combo_cidade.php",valor,cid);
}
答案 0 :(得分:1)
在页面中添加此JS代码:
<script type="text/javascript">
function AddHiddenValue(oForm) {
var strValue = document.getElementById("atualiza").innerHTML;
var oHidden = document.createElement("input");
oHidden.name = "atualiza";
oHidden.value = strValue;
oForm.appendChild(oHidden);
}
</script>
然后在表单标签中显示:
<form ... onsubmit="AddHiddenValue(this);">
最后从PHP代码中的请求中读取“atualiza”的值。
答案 1 :(得分:1)
在javascript中,value
属性用于表单元素,例如input
,select
和textarea
。如果你想获得DIV元素的“值”(我的意思是写在该标记内),你可以使用innerHTML
属性。例如,请考虑以下HTML:
<div id="d">Hello</div>
现在document.getElementById('d').innerHTML
将返回“Hello”。
回到您的代码,当您发送AJAX请求时,您会收到<select name='cidade' id='cidade'>...
文本并将其设置为innerHTML
标记的DIV
。您可以使用select
在内部document.getElementById('cidade').value
中获取所选值,并将隐藏input
的值设置为该值,因为当您将该字符串设置为innerHTML
时DIV
标记,将在select
内解析并转换为普通DIV
标记,即
<tr>
<td align="right">Cidade</td>
<td><div id="atualiza"><select name='cidade' id='cidade'><option>...</select></div></td>
</tr>
<强>结论:强>
将隐藏的input
名称cidade
放在内表单中
<form ...>
...
<input type="hidden" name="cidade" id="cidade_input" value="" />
并在select
的值更改时设置其值:
combo_cidade.php, line 2:
echo "<select name='cidade' id='cidade' onchange='f1(this.value);'>";
in your JavaScript:
function f1(value) {
document.getElementById('cidade_input').value = value;
}
或表单提交时:
your form tag:
<form ... onsubmit="f2()">
in JavaScript:
function f2() {
document.getElementById('cidade_input').value = document.getElementById('cidade').value;
}
关于代码的一些注意事项:
在你的php文件combo_cidade.php
中,在第8行,你不应该直接使用请求($ _GET)中给出的值。这可能会导致代码中出现SQL注入。相反,您应该使用addslashes function(或PHP手册中强烈推荐的mysql_real_escape_string)来防止对您网站的SQL注入攻击。那将是这样的:
$sql = "SELECT tb_cidades.nome, tb_cidades.id FROM tb_cidades INNER JOIN tb_estados ON tb_cidades.uf=tb_estados.uf WHERE tb_cidades.uf='".addslashes($_GET["uf"])."'";
另一个注意事项:对于单引号以外的HTML属性值,最好使用双引号。您可以将第二行PHP代码更改为:
echo '<select name="cidade" id="cidade" onchange="f1(this.value);">';
最后一点:您不需要在echo'ed name
中拥有select
属性,因为它不在表单中,并且该属性将无用。因此它会是这样的:
echo '<select id="cidade" onchange="f1(this.value);">';
如果您使用onchange
而非onsubmit
(即在组合更改时设置隐藏的input
值,而不是在提交表单时),id
属性也没用。这将改为:
echo '<select onchange="f1(this.value);">';
答案 2 :(得分:0)
试试这个(在javascript中)。
var value = document.getElementById("atualiza").firstChild.nodeValue;
或
var value = document.getElementById("atualiza").innerText;
至于如何将这个(javascript)包含在PHP中,我不在那个联盟中(至今)。
希望这有帮助。
答案 3 :(得分:0)
为什么不把选择放在表格中?如果需要,您可以在页面中包含多个表单。