最近ハマったのでメモ。解決策は以下の記事を参考にしました。
- JQuery Unobtrusive Validation in IE 7 Compatibility Mode causes "Member Not Found" Error in Page with Form - Stack Overflow
- #12577 ('SCRIPT3: Member not found' with .attr(novalidate or aria-nocomplete)) – jQuery Core - Bug Tracker
エラーの内容
jquery.validate.unobtrusive を IE10の互換モードで利用するとこんなエラーが出ることがあります。
行: 2699 エラー: メンバーが見つかりません。
どうやらページ内に form があるだけで起こるようで、jQuery その他のスクリプトが全滅して全く動かなくなります。怖い。
なんとなく IE10 の互換モードのバグっぽい雰囲気ですが、時間がなかったためあまり詳しく調べることができませんでした。(いいわけ)
jQuery の以下の set メソッド呼び出しで、novalidate という属性を設定しようとしてエラーが発生しているようです。
nodeHook = jQuery.valHooks.button = {
get: function( elem, name ) {
var ret;
ret = elem.getAttributeNode( name );
return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
ret.nodeValue :
undefined;
},
set: function( elem, value, name ) {
// Set the existing or create a new attribute node
var ret = elem.getAttributeNode( name );
if ( !ret ) {
ret = document.createAttribute( name );
elem.setAttributeNode( ret );
}
return ( ret.nodeValue = value + "" );
}
};
解決策
いろいろな記事を見て回ると、jQuery の中身を書き換えたりする方法もありましたが、ちょっと怖いので互換モードの指定で逃げました。
以下のように X-UA-Compatible で IE が利用可能な最新のレンダリングモードを指定します。
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
おわりに
いろいろなところでこの問題がおきてテンション下がりました。
jquery.validate.unobtrusive は ASP.NET MVC のテンプレートに入っているし、form がページ内にあるだけでエラーが起こるので、結構影響大きいのではと思うのですが、全然日本語の記事がなかったので書いてみました。