内容仅在延迟时显示

时间:2011-04-18 11:16:56

标签: php ajax jquery-ui-dialog

通过Ajax将内容加载到div时出现问题 我点击按钮时打开一个对话框。对话框加载到php文件中 在对话框的代码之后,我放置了一些代码,将某些内容加载到该php文件中的div中。我的代码:

function edit(serverpage, persoonid)
{
   $(".opendg").dialog(
    {
        open:function ()
        {
            $(this).load('/location/php/' + serverpage);
        },
        title: 'Change!',
        autoOpen: true,
        closeOnEscape: true,
        height: 335,
        width: 650,
        modal: true,
        resizable: false,
        close: function(){},
        buttons:
            {
                "Change": function()
                {
                    sendedit(serverpage, persoonid);
                    return;
                },
                "Cancel": function()
                {
                    $(this).dialog("close");
                }
            }
    });
    xmlhttp = ajaxFunction();
    if (xmlhttp)
    {
        var url = "/location/php/" + serverpage;
        var pagelength = serverpage.length;
        var value = serverpage.substr(0,pagelength - 4);
        var params = "edit=" + value + "&id=" + persoonid;
        xmlhttp.open("POST", url, true);
        xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        xmlhttp.setRequestHeader("Content-length", params.length);
        xmlhttp.setRequestHeader("Connection", "close");
        xmlhttp.onreadystatechange = function()
        {
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
            {
               if(xmlhttp.responseText != '')
               {
                value = value + 'form';
                alert('test');
                document.getElementById(value).innerHTML=xmlhttp.responseText;
                }
            }
        }
        xmlhttp.send(params);
    }
}

正如您所看到的,我在将responseText发送到div之前就发出了警告 我这样做是因为没有警报我得到一个空的表格!
我第一次打开对话框时什么都没看到。重新打开后,我看到了我想要的内容的短暂闪现,但在几毫秒内就消失了。

生成内容的代码:

<?php
    if($_POST['edit'] == 'editpersoneel')
    {
        //Query run here to get the results
        echo '<form>
            <table>
                <tr>
                    <td class="first">
                        Location: 
                    </td>
                    <td>
                        <input type="text" value="'.$result['location'].'" />
                    </td>
                    <td class="first">
                        phonenumber
                    </td>
                    <td>
                        <input type="text" value= "'.$result[phonenumber'].'" />
                    </td>
                </tr>
            </table>
        </form>';
    }
    ?>
<div id="editpersoneelform"></div>

我尝试用jQuery中的$(document).ready语句解决这个问题,但是没有按任何顺序工作 我认为问题在于,在发送内容时,div(以某种方式)对Ajax是未知的,但我确实得到了结果。

所以我的问题是:
- 当我在其中发出警报时,为什么我的代码会起作用? (我只需要在这里打开对话框)
- 为什么我的内容在此后的一毫秒内被加载和卸载?为什么我必须两次打开对话框?

更新
当我在发送responseText后发出警报时,我必须打开对话框两次才能看到警告框。

更新2
调用事件的代码:

<div class="jbutton">
    <a onclick="edit(\'editpersoneel.php\',\''.$b['id'].'\')">Adjust</a>
</div>

此按钮位于jquery-ui-accordion内。

1 个答案:

答案 0 :(得分:1)

我不完全理解为什么如此复杂的ajax调用和从serverpage解析值,但是你可能在更多的地方有一个JS代码用于多个编辑功能......但是到了这一点:

看起来您在调用AJAX的HTML中没有<div id="editpersoneelform"></div> ...

让我们假设您有类似的HTML文件(当您需要以原始方式调用AJAX时,我建议至少使用jQuery来处理元素):

<div id="editpersoneelform"></div>
<div class="jbutton">
    <a onclick="edit(\'editpersoneel.php\',\''.$b['id'].'\')">Adjust</a>
</div>
<script type="text/javascript">
    function edit(serverpage, persoonid) {
        $(".opendg").dialog({
            open:function () {
                $(this).load('/location/php/' + serverpage);
            },
            title: 'Change!',
            autoOpen: true,
            closeOnEscape: true,
            height: 335,
            width: 650,
            modal: true,
            resizable: false,
            close: function(){},
            buttons: {
                "Change": function() {
                    sendedit(serverpage, persoonid);
                    return;
                },
                "Cancel": function() {
                    $(this).dialog("close");
                }
            }
        });
        xmlhttp = ajaxFunction();
        if (xmlhttp) {
            var url = "/location/php/" + serverpage;
            var pagelength = serverpage.length;
            var value = serverpage.substr(0,pagelength - 4);
            var params = "edit=" + value + "&id=" + persoonid;
            xmlhttp.open("POST", url, true);
            xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xmlhttp.setRequestHeader("Content-length", params.length);
            xmlhttp.setRequestHeader("Connection", "close");
            xmlhttp.onreadystatechange = function() {
                if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    if(xmlhttp.responseText != '') {
                        value = value + 'form';
                        alert(value);
                        $('div#'+value).html(xmlhttp.responseText);
                    }
                }
            }
            xmlhttp.send(params);
        }
    }
</script>

然后你有你的AJAX调用的PHP文件:

<?php
if($_POST['edit'] == 'editpersoneel') {
    //Query run here to get the results
    $form = '<form>
        <table>
            <tr>
                <td class="first">Location: </td>
                <td><input type="text" value="'.$result['location'].'" /></td>
                <td class="first">phonenumber</td>
                <td><input type="text" value= "'.$result[phonenumber'].'" /></td>
            </tr>
        </table>
    </form>';
    echo $form;
}
?>

如果要将AJAX响应加载到某个元素,那么该元素必须是调用AJAX的代码中的最新元素。

试试这个,如果你成功了,请告诉我们。