IE9 以下で厄介な JavaScript エラーが発生します。私は2つの選択ボックスを持っています。1 つは「Select Your State」ボックスです。この選択は、選択のオプションをその状態のオプションにフィルターします。
IE以外で試したすべてで期待どおりに動作します。HTML サンプルでわかるように、オプションは optgroup で囲まれています。document.ready でオプションのオブジェクトを作成し、DOM から削除します。状態選択ボックスの変更時に、オプションのサブセットを optgroups とともにストア選択に配置します。ただし、IE は optgroup のみを配置し、オプションは配置しません。select に要素を追加するいくつかの異なる方法を試しましたが、IE は optgroups の子オプションを追加しません。
簡略化された html と該当する javascript を次に示します。これは Drupal サイトなので、jQuery 1.4.4 で作業しています。
<select id="edit-state">
<option value="AL">Alabama</option>
<option value="AZ">Arizona</option>
<option value="AR">Arkansas</option>
<option value="CA">California</option>
</select>
アリゾナが選択されたと仮定すると、これは 2 番目の選択ボックスの HTML になります。
<select id="edit-store">
<optgroup label="AZChandler">
<option value="SPCHRAZ">Store Name</option>
</optgroup>
<optgroup label="AZPhoenix">
<option value="SPPVAAZ">Store Name</option>
<option value="SPSCTAZ">Store Name</option>
</optgroup>
<optgroup label="AZScottsdale">
<option value="SPRNTAZ">Store Name</option>
</optgroup>
<optgroup label="AZTempe">
<option value="SPTEMAZ">Store Name</option>
</optgroup>
<optgroup label="AZTucson">
<option value="SPORAAZ">Store Name</option>
<option value="SPSPEAZ">Store Name.</option>
<option value="SPRRDAZ">Store Name</option>
</optgroup>
</select>
これがジャバスクリプトです。この関数は、#edit-state の変更時に呼び出されます。options 引数は、すべての optgroup とオプションのオブジェクトです。この関数は、それらをフィルタリングして追加します。
function setStateOptions(options){
var stateabbr = jQuery('#edit-state').find('option').filter(':selected').attr('value');
jQuery('#edit-store optgroup').remove();
jQuery(options).each(function() {
var label = jQuery(this).attr('label');
var abbr = label.substr(0, 2);
if(abbr == stateabbr){
var clone = jQuery(this).clone();
jQuery(clone).appendTo('#edit-store');
}
});
//remove postal code abbr from beginning of optgroup labels.
jQuery('#edit-store optgroup').each(function(){
var optlabel = jQuery(this).attr('label');
jQuery(this).attr('label', optlabel.substr(2));
});
}
ありがとう!