少し前にブラウザ(Javascript)の仕様変更があって一部の機能が動かなくなってました
一応このページで公開してるのはひと通り確認して問題あるとこは直ったはずです
一応このページで公開してるのはひと通り確認して問題あるとこは直ったはずです
修正したのは
pwo.crx
・パスワードの表示/非表示を切り替える拡張機能
dls.crx
・画像のダウンロードツール
の2つです
この2つをインストールして使ってる人は、動かなくなってるはずなので、新しくダウンロードして再インストールお願いします
再インストールは、拡張機能一覧画面で右の方にあるゴミバケツ

を押して今のバージョンを削除してから、もう一回インストールを行ってください
**原因とか説明**
変更があったところは、
今まではこれらのメソッドで持ってきたのはNodeListになってました
これらのメソッドで持ってこれるのは配列みたいな構造になっているのに配列のメソッドが使えなくて、使うには、
実行したいメソッドのcallメソッドに、第一引数を配列としてメソッドを実行したい配列のようなオブジェクト、第二引数以降にそのメソッドを実行するときの引数を渡して実行するとできます
ですが、こう書くのはめんどくさいですし見づらいです
そこで、普通の配列と同じ風に書くということで、プロトタイプをいじります
NodeList.prototype.__proto__(NodeListのプロトタイプにプロパティがなかったときに見る先)はObjectのprototypeになってます
なので、
これで、
今までは、
NodeList.prototypeにforEachがなかったときに、Array.prototypeからforEachを探すので見つかってforEachが使えるわけです
と、今まではこうしていたのですが、今回の変更でdocument.getElements系のメソッドで持ってくるのがNodeListではなくHTMLCollectionとなってしまいました
そのせいで、NodeListのプロトタイプに手を加えていたのが意味がなくなって動かなくなったんです
単純に
ところで 継承方法で、関数Aから作ったオブジェクト(インスタンス)でBのメソッドが使いたいとき場合、
下だとAのprototypeを書き換えます
そうするとNodeListやHTMLCollectionのprototypeにあるメソッドが消えてしまいます
といってもitemくらいしかつかうものないですけど
↑
上書き不可能になってました
なので何も起きないです
もともとのプロトタイプが消えることはないですが配列のメソッドが使えるようにもなりません
(writable属性をtrueにすることもできませんでした)
pwo.crx
・パスワードの表示/非表示を切り替える拡張機能
dls.crx
・画像のダウンロードツール
の2つです
この2つをインストールして使ってる人は、動かなくなってるはずなので、新しくダウンロードして再インストールお願いします
再インストールは、拡張機能一覧画面で右の方にあるゴミバケツ

を押して今のバージョンを削除してから、もう一回インストールを行ってください
**原因とか説明**
変更があったところは、
document.getElementsByClassNameでもってくるデータのコンストラクタです
や
document.getElementsByTagName
今まではこれらのメソッドで持ってきたのはNodeListになってました
これらのメソッドで持ってこれるのは配列みたいな構造になっているのに配列のメソッドが使えなくて、使うには、
Array.prototype.forEach.call(docment.getElementsByClassName("classname"),function(){});という風にして配列のメソッド(この場合はforEach)を無理やり実行します
実行したいメソッドのcallメソッドに、第一引数を配列としてメソッドを実行したい配列のようなオブジェクト、第二引数以降にそのメソッドを実行するときの引数を渡して実行するとできます
ですが、こう書くのはめんどくさいですし見づらいです
そこで、普通の配列と同じ風に書くということで、プロトタイプをいじります
NodeList.prototype.__proto__(NodeListのプロトタイプにプロパティがなかったときに見る先)はObjectのprototypeになってます
なので、
NodeList.prototype.__proto__ = Array.prototype;として、NodeListのプロトタイプのプロパティにメソッドがなかったときにArrayのメソッドをみるようにします
これで、
document.getElementsByClassName("classname").forEach(function(){});とかけるようになります
今までは、
document.getElementsByClassName("").forEachとしたときに、NodeList.prototypeの中にforEachがないので、次にObject.prototypeの中でforEachを探しても見つからないのでforEachが使えなかったのですが、プロトタイプをつなぎ変えたことで、
NodeList.prototypeにforEachがなかったときに、Array.prototypeからforEachを探すので見つかってforEachが使えるわけです
と、今まではこうしていたのですが、今回の変更でdocument.getElements系のメソッドで持ってくるのがNodeListではなくHTMLCollectionとなってしまいました
そのせいで、NodeListのプロトタイプに手を加えていたのが意味がなくなって動かなくなったんです
単純に
HTMLCollection.prototype.__proto__ = Array.prototype;にするだけでは、document.getElements系で持ってくるのが頻繁に変わると困るので
document.getElementsByClassName("").constructor.prototype.__proto__ = Array.prototype;にして変わっても問題ないようにしておきました
ところで 継承方法で、関数Aから作ったオブジェクト(インスタンス)でBのメソッドが使いたいとき場合、
A.prototype.__proto__ = B.prototype;をよく見ますが、今回のような時は下を使ってはダメです
と
A.prototype = new B;
下だとAのprototypeを書き換えます
そうするとNodeListやHTMLCollectionのprototypeにあるメソッドが消えてしまいます
といってもitemくらいしかつかうものないですけど
↑
上書き不可能になってました
なので何も起きないです
もともとのプロトタイプが消えることはないですが配列のメソッドが使えるようにもなりません
(writable属性をtrueにすることもできませんでした)
コメントする