(Google Closure で生成された) ラベルを動的に入力する必要があるフォームがあります。Chrome では動作しましたが、Firefox で試してみると動作せず、次のエラーで失敗しました。
TypeError: this.document.getElementById(...)[$i].labels is undefined
....document.getElementById('dialog-form')[$i].labels[0].innerHTML = "$" + varNewPr...
Firebug コンソールで調べると、次のエラーが表示されます。
>>> this.document.getElementById('dialog-form')[4]
<input id="price1" type="radio" value="1" percentage="90" adoptname="90" name="price">
>>> this.document.getElementById('dialog-form')[4].labels
undefined
ただし、Chrome でネイティブ デバッグ コンソールを使用すると機能します (value= と adaptname= の値が異なるのは、フォームを動的に再利用するためです)。
>this.document.getElementById('dialog-form')[4]
<input type="radio" name="price" adoptname="180" id="price1" percentage="90" value="2">
>this.document.getElementById('dialog-form')[4].labels
[<label class="adopt-label" for="price1">$0</label>]
これは、Google Closure コンパイラから出力された後の html フォーム コードです。
// This file was automatically generated from basic.soy.
// Please don't edit this file by hand.
if (typeof examples == 'undefined') { var examples = {}; }
if (typeof examples.simple == 'undefined') { examples.simple = {}; }
examples.simple.adoptForm = function(opt_data, opt_ignored) {
return '<div class="adopt-general">
<div class="adopt-header">
....
<ul class="adopt-list">
<li><label>Tell me if the price drops below:</label>
<li><input type="radio" name="price" adoptname="$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.9)) + '" id="price1" percentage="90" value="' + soy.$$escapeHtml(opt_data.itemNumber) + '" />
<label class="adopt-label" for="price1">$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.9)) + '</label>
<input type="radio" name="price" adoptname="$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.8)) + '" id="price2" percentage="80" value="' + soy.$$escapeHtml(opt_data.itemNumber) + '" />
<label class="adopt-label" for="price2">$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.8)) + '</label>
<input type="radio" name="price" adoptname="$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.7)) + '" id="price3" percentage="70" value="' + soy.$$escapeHtml(opt_data.itemNumber) + '" />
<label class="adopt-label" for="price3">$' + soy.$$escapeHtml(Math.round(opt_data.price * 0.7)) + '</label></ul>
...;
};
JavaScript コードは次のとおりです。
for(var $i = 0; $i < $myDialogLength; $i++){
this.document.getElementById('dialog-form')[$i].setAttribute("value",skuNumber);
this.document.getElementById('dialog-form')[$i].checked = false;
if(this.document.getElementById('dialog-form')[$i].getAttribute("percentage") !== null){
varIdNum = this.document.getElementById("dialog-form")[$i].getAttribute("percentage");
var varNewPrice = (varIdNum*price/100);
this.document.getElementById('dialog-form')[$i].setAttribute("adoptname",varNewPrice);
this.document.getElementById('dialog-form')[$i].labels[0].innerHTML = "$" + varNewPrice;
}
....
}
コードの最後の行は、Firefox でエラーをスローしています。私も JQuery を使用しており、JavaScript の経験があまりないため、最適ではないコードについてお詫び申し上げます。どんな助けでも大歓迎です、ありがとう!