0

我怎样才能避免这个错误?它有效,但我总是看到这个错误,这里是代码:

function Separe(price) {
    nStr = Number(document.getElementById(price).value) * 100
    nStr += '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(nStr)) {
        nStr = nStr.replace(rgx, '$1' + ' ' + '$2');
    }
    return nStr + " Centimes"
}

function Forma(price, dest) {
    var handler = function(e) {
        document.getElementById(dest).innerHTML = Separe(price)
    };
    document.getElementById(price).onchange = handler; //line 50
    document.getElementById(price).onkeyup = handler;
}

和 HTML:

<input id="prix" type="number" name="prix" min="1" step="1">
<script>
    Forma("prix", "hhh"); //profil 148
</script>
<h1 id="hhh" >&nbsp;</h1>

我的页面在加载时发出错误:

Uncaught TypeError: Cannot set property 'onchange' of null formatter.js:50
Forma formatter.js:50
(anonymous function) profil:148

我这样做是为了避免放onchange两次onkeyup

变量尚未生成,这是错误的原因,但我该如何避免呢?我什至尝试添加所有变量并将它们初始化为空值,但仍然出现错误!

4

2 回答 2

1

完全避免此错误的唯一方法是在查询时将您要求的元素在 DOM 中准备好。

假设你有这个 HTML:

<span id="monkey">Hey I'm a monkey</span>
Result for hopeful monkey:<span id="result"></span>
Result for not so hopeful monkey:<span id="noresult"></span>

这个javascript:

var hopefulMonkey = document.getElementById("monkey");
document.getElementById("result").innerHTML = hopefulMonkey;

var notSoHopefulMonkey = document.getElementById("noMonkeys");
document.getElementById("noresult").innerHTML = " "+notSoHopefulMonkey;

输出将是:

Hey I'm a monkey 
Result for hopeful monkey:[object HTMLSpanElement] 
Result for not so hopeful monkey: null

因此,如果您遇到该错误,您正在尝试访问显然尚不存在或根本不存在的元素。

也就是说,由于您发布的代码在 Chrome 中有效,因此您还有其他问题会导致您的麻烦。你运行的是什么版本?

我解决了你的问题:http: //jsfiddle.net/EqtQz/

我也做了一个小提琴来展示我的答案:http: //jsfiddle.net/vB2Jp/1/(它有猴子,所以也很有趣!)

于 2013-04-25T13:55:29.747 回答
0

看来我是代码中的重复函数!页面使用手风琴效果,函数被调用了两次(买入区,卖出区),奇怪的是,即使id是不同的,代码也会提示错误;但只有第一个电话有效,第二个电话无效。

在第二个是一个不同的 id:

<script>
Forma("hh", "max");
</script>

……

<script>
Forma("h", "min");
</script>

我所做的是更改为第二

<input .... onkeyup="document.getElementById('h').innerHTML = Separe('min')"  onchange="document.getElementById('h').innerHTML = Separe('min')"/>

它奏效了!现在 Chrome 甚至不会提醒我第一部分(购买)会像我的问题一样调用该函数!

于 2013-04-27T13:34:58.320 回答