当我向选择添加选项时,选择变得更窄

时间:2009-02-13 20:03:17

标签: asp.net javascript html

继承了一个带有一个页面的应用程序,该页面有一个调用javascript函数addValueClick()的链接,当我这样做时会弹出一个对话框,我输入一些文本,然后将文本放入选择框中。每次向选择添加新选项时,它都会缩小约5个像素。我无法弄清楚为什么会发生这种情况,但它只发生在IE7中

这是javascript:

function addValueClick()
{
    var newValue = prompt("Please enter a new value.","");
    if (newValue != null && newValue != "")
    {
        var lst = document.getElementById("lstValues");
        var opt = document.createElement("option");
        opt.setAttribute("selected", "true");
        opt.appendChild(document.createTextNode(newValue));
        lst.appendChild(opt);
        updateBtns();
        copyValues();
    }
}

function copyValues()
{
    var frm = document.forms[0];
    var lst = frm.elements["lstValues"];
    var hid = frm.elements["hidValues"];
    var xml = "<root>";
    for (var i = 0; i < lst.options.length; i++)
    {
        xml += "<value seq_num=\"" + (i + 1) + "\">" +
          lst.options[i].text + "</value>";
    }
    xml += "</root>";
    hid.value = xml;
}

function updateBtns()
{
    var lst = document.getElementById("lstValues");
    var iSelected = lst.selectedIndex;
    var lnkEdit = document.getElementById("lnkEditValue");
    var lnkDelete = document.getElementById("lnkDeleteValue");
    var lnkUp = document.getElementById("lnkValueUp");
    var lnkDown = document.getElementById("lnkValueDown");
    if (iSelected == -1)
    {
        lnkEdit.style.visibility = "hidden";
        lnkDelete.style.visibility = "hidden";
        lnkUp.style.visibility = "hidden";
        lnkDown.style.visibility = "hidden";
    }
    else
    {
        lnkEdit.style.visibility = "visible";
        lnkDelete.style.visibility = "visible";

        if (iSelected == 0)
            lnkUp.style.visibility = "hidden";
        else
            lnkUp.style.visibility = "visible";

        if (iSelected == lst.options.length - 1)
            lnkDown.style.visibility = "hidden";
        else
            lnkDown.style.visibility = "visible";
    }
}

编辑: HTML,它实际上是ASP.NET。所有listValueChanged()方法都是调用上面的updateButtons()。

<tr>
    <TD class=body vAlign=top noWrap align=right><b>Values:</TD>
    <TD class=body vAlign=top noWrap align=left><asp:ListBox id="lstValues" runat="server" onchange="lstValuesChange();" Rows="9" onselectedindexchanged="lstValues_SelectedIndexChanged"></asp:ListBox></TD>
    <TD class=body vAlign=top noWrap align=left>
        <TABLE id="Table2" cellSpacing="2" cellPadding="2" border="0">
            <TR>
                <TD noWrap>
                    <asp:HyperLink id="lnkAddValue" runat="server" NavigateUrl="javascript:addValueClick();">Add</asp:HyperLink></TD>
            </TR>
            <TR>
                <TD noWrap>
                    <asp:HyperLink id="lnkEditValue" runat="server" NavigateUrl="javascript:editValueClick();">Edit</asp:HyperLink></TD>
            </TR>
            <TR>
                <TD noWrap>
                    <asp:HyperLink id="lnkDeleteValue" runat="server" NavigateUrl="javascript:deleteValueClick();">Delete</asp:HyperLink></TD>
            </TR>
            <TR>
                <TD noWrap>&nbsp;</TD>
            </TR>
            <TR>
                <TD noWrap>
                    <asp:HyperLink id="lnkValueUp" runat="server" NavigateUrl="javascript:valueUpClick();">Up</asp:HyperLink></TD>
            </TR>
            <TR>
                <TD noWrap>
                    <asp:HyperLink id="lnkValueDown" runat="server" NavigateUrl="javascript:valueDownClick();">Down</asp:HyperLink></TD>
            </TR>
        </TABLE>
    </TD>
</TR>

3 个答案:

答案 0 :(得分:0)

它可能与html有关,而不是脚本。包含的选择是什么?基于JS,我认为这里没有任何问题。

答案 1 :(得分:0)

我知道通过SelectElement.innerHTML = '...'; fails in IE (bug 274)添加选项。

但是我不知道通过.createElement()失败来添加选项......虽然我并不过分惊讶。

您可以使用JavaScript new Option();语法创建它们,我相当确定它可以正常运行。

答案 2 :(得分:0)

问题在于将选项添加到选项我将其更改为以下内容并且它完美运行:

function addValueClick()
{
    var newValue = prompt("Please enter a new value.","");
    if (newValue != null && newValue != "")
    {
        var lst = document.getElementById("lstValues");
        var opt = document.createElement("option");
        opt.text = newValue;
        opt.value = newValue;
        try {
            lst.add(opt, null); // real browsers
        }
        catch (ex) {
            lst.add(opt); // IE
        }

        updateBtns();
        copyValues();
    }
}