我正在尝试在ul中插入一个包含一个选择的li,并将其与通过Ajax从数据库获得的选择的选项中的数据一起使用。
事先为您的歉意...
几年前,我从Web开发中退休,在后来的几年中,我大量使用了Prototype。我现在有些生锈,但是我正在尝试做一些纯粹用于个人用途的开发。它不会在开放的Web上,而仅在我们的本地服务器上。一切都进行得很好(如果很慢!),但是现在我已经用Ajax撞墙了。
这就是我想要做的:
我有一个带有一个或多个选择的表单,每个选择都在自己的li内,都在一个ul中。
每个选择都包含来自MySQL数据库中表的相同项目列表。
最后一个选择未选择任何内容,并且具有“ addselect”类。
的想法是,如果我从最后一个选择中选择了某个内容,则会触发一个onChange事件,该事件将调用Ajax脚本以添加一个新选择(包含相同的项)。这是在页面加载时在javascript文件顶部的“ document.observe('dom:loaded',function()...”)中设置的。
每个选择都有一个顺序名称和ID,例如'name =“ country [0]” id =“ country_0”',下一个国家[1]和country_1,依此类推。新创建的选择将按顺序具有下一个名称和ID。 我希望一切都有意义。
所以... 在“ dom:loaded ...”中设置的处理函数获取下一个索引号,以获取新选择的名称和ID,并将其(“ entryindex”)和要搜索的表的名称(“ list”)发送出去到Ajax脚本,然后开始:
var pars = 'list=' + list + '&entryindex=' + newIndex;
var url = base + 'ajaxgetmenu';
// send request to do the business
var myAjax = new Ajax.Request (url, {
method: 'post',
parameters: pars,
onSuccess: function (req) {
var xml = req.responseText;
...
到目前为止,一切都是笨拙的。 Safari的Web检查器中的“资源”选项卡在“ XHRs”下显示了正确的结果-具有正确名称和内容的不错的新选择。因此,我知道脚本正在被调用并且正在正确运行。但是接下来要发生的事情是
var newhtml = xml.getElementsByTagName('newhtml')[0].firstChild.nodeValue;
这取自我在职业生涯中开发的脚本,我知道它工作得很好。但是这里有些问题,因为它不起作用!如果我在此行之前在('ok')中添加了警报,则会弹出警报,但是如果我在此行之后将其弹出,则不会。但是,没有错误报告。当然,下一行也不起作用:
$('thisid').up('ul').insert (newhtml);
(而且我知道“ $('thisid')”是正确的,因为我将其放在警报中进行了检查。)
所以我简化了它。我放弃了XML,而是将结果制成纯文本,以逐字插入。同样,该脚本在Safari的Web检查器中产生了完美的结果,但是即使newhtml是纯文本(并且我完全跳过了xml.getElementsByTagName行),它也会失败。再一次,插入行之前的警报起作用,但插入行之后的警报没有起作用。确实,我可以将newhtml放到警报中,并且显示正确(不是所有这些都在Safari中,我猜它太长了,但是在Firefox中就全部存在了。)
我已尽我所能,所以,如果有人对此有任何见识,我将非常感激。可能是死死的东西明显地盯着我...
回应卑鄙:
因为我要执行的操作不起作用,所以执行前后DOM都没有变化。这是相关的位:
<ul id="country">
<li><label>Countries:</label>
<select class="finput addselect" name="country[0]" id="country_0">
<options...
</select>
<li><label></label>
<select class="finput addselect" name="country[1]" id="country_1">
<options...
</select>
</li>
</ul>
onChange适用于#country_1,并且应该在此之后插入新的选择,所以up('ul')应该这样做吧?我尝试了(1),但还是没有用。我尝试只插入“测试”,但没有用...