SCRIPT5007:无法获取未定义或空引用的属性“值”

时间:2013-08-08 11:13:57

标签: javascript html5 internet-explorer-10

我有一个似乎在IE10中不起作用的html表单。当点击go按钮调试返回:“SCRIPT5007:无法获取未定义或空引用的属性'值'” 我在我的html页面中添加了这个标签

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />.

html包含myform中频率的下拉菜单选项。在下拉列表中选择任何选项后,我调用javascript函数。

function chooseFreqMenu(freqValues,freqTexts)
{
    var cf = document.myform;
    var freq1=document.myform.freq.value; // freq1="d"
    alert(freq1);// displaying freq1 value is "d" (ex:selected 'd' in html dropdown)
// checking some condition for freqValues.
    for(var i=4;i<freqValues.length;i++)
            selectStr += '<option value="'+freqValues[i]+'">'+freqTexts[i]+'\n';
    }
    selectStr += '</select>';
    // Assinging the selectedStr to innerHTML. After this statement i am getting empty for freq1 value. 
    //Its working fine in IE<10 browsers
    document.all.freqSel.innerHTML = selectStr; 
    alert(freq1); // displaying freq1 value is empty.
}   

在将myform发送到chooseFreqmenu之前,myform包含freq value =“d”(假设我在下拉列表中选择了'd') 在上面的函数之后,myform不包含freq值。 在上面的函数将myform传递给buildQueryStr之后。

function buildQueryStr(myform)
{

var freq=myform.freq.value; //Getting an error SCRIPT5007: Unable to get property 'value' of undefined or null reference in this line

//some other fields.

}

如何解决此问题?

有什么建议吗?在此先感谢。

3 个答案:

答案 0 :(得分:3)

我认为IE 10不再支持使用 myform.freq.value 语法访问元素。

访问Elements的标准方式(包括IE在内的所有浏览器都支持)使用 document.getElementById 函数

function buildQueryStr(myform) {

    //var freq=myform.freq.value; //Getting an error SCRIPT5007: Unable to get property 'value' of undefined or null reference in this line
    var freq=document.getElementById("freq").value;

    //some other fields.
}

答案 1 :(得分:2)

首先:您不应该使用document.all,而不是2013年:)这是一个旧的Microsoft扩展,我认为它已被弃用。使用getElementById。

我认为你创建selectStr的方式有问题。你将把它作为innerHTML用于Select so:

  • 它不应以</select>结尾。元素的结束标记不是其innerHTML afaik的一部分
  • 您应该拥有<option>元素的结束标记

我要更改以下代码:

// checking some condition for freqValues.
for(var i=4;i<freqValues.length;i++)
        selectStr += '<option value="'+freqValues[i]+'">'+freqTexts[i]+'\n';
}
selectStr += '</select>';

进入这个:

// checking some condition for freqValues.
for(var i=4;i<freqValues.length;i++)
        selectStr += '<option value="'+freqValues[i]+'">'+freqTexts[i]+'</option>\n';
}

注意:我已经读过某些地方,即使使用格式正确的代码,在SELECT控件上使用innerHTML也会产生依赖于浏览器的行为。我认为更强大的解决方案是使用removeChild和addChild以dinamically方式删除和添加选项节点。

答案 2 :(得分:2)

问题与文档模式有关,IE11默认文档模式是IE7。

在IE仿真中使用F12,您可以更改文档模式8,9和11

您可以使用以下标记来使用编程更改文档模式。

对于Internet Explorer 8及更高版本的版本,请执行以下操作:

<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7" />   

强制浏览器呈现为特定版本的标准。 IE7及以下版本不支持。

如果用分号分隔,它会为不同版本设置兼容级别。例如:

<meta http-equiv="X-UA-Compatible" content="IE=7; IE=9" />

将IE7和IE8渲染为IE7,但IE9为IE9。它允许不同级别的向后兼容性。但在现实生活中,你应该只选择其中一个选项:

<meta http-equiv="X-UA-Compatible" content="IE=8" />

这样可以更轻松地进行测试和维护。虽然通常更有用的版本是使用Emulate:

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />

为此:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

它会根据最新版本的标准强制浏览器呈现。就像在谷歌的CDN上使用最新版本的jQuery一样,这是最新的,但也可能会破坏您的代码,因为它不是固定版本。

最后,考虑添加这个小花絮:

<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />

添加&#34; chrome = 1&#34;将允许网站在ChromeFrame中为拥有它的那些(智能)用户呈现,而不会影响其他人。

`在这里输入代码

`https://technet.microsoft.com/en-us/itpro/internet-explorer/ie11-deploy-guide/fix-compat-issues-with-doc-modes-and-enterprise-mode-site-list

https://msdn.microsoft.com/library/ms533876(v=vs.85).aspx

http://www.chromium.org/developers/how-tos/chrome-frame-getting-started