2017-08-07 11 views
0

私はElement.matchesのためのメソッドをpolyfillしたいです。
私はMDNにこれらのコードを見つけました:なぜelement.matchesのpolyfillが機能しないのですか

if (!Element.prototype.matches) { 
Element.prototype.matches = 
    Element.prototype.matchesSelector || 
    Element.prototype.mozMatchesSelector || 
    Element.prototype.msMatchesSelector || 
    Element.prototype.oMatchesSelector || 
    Element.prototype.webkitMatchesSelector || 
    function(s) { 
     var matches = (this.document || 
    this.ownerDocument).querySelectorAll(s), 
      i = matches.length; 
     while (--i >= 0 && matches.item(i) !== this) {} 
     return i > -1;    
    }; 
} 

だから私のようないくつかのコードの書き込み:

function matches(node, selector) { 
if (node.matches) { 
    return node.matches(selector) 
} 

const match = node.matchesSelector || 
          node.webkitMatchesSelector || 
          node.mozMatchesSelector || 
          node.msMatchesSelector || 
          node.oMatchesSelector || 
          function (s) { 
      const matches = (node.ownerDocument || document).querySelectorAll(s) 
           let i = matches.length 
           while (--i >= 0 && matches[i] !== node) {} 
           return i > -1 
          } 
    return match(selector) 
    } 

もののを、私はこれはIE 除いてほとんどのブラウザ上で動作します知っている私は、コードの大部分を削除しましたそして、IEのためにそれをテストし、これが働いた:

function match(node, selector) { 
     return node.msMatchesSelector(selector) 
} 

私はこれが動作しない理由を不思議に思う:

function match(node, selector) { 
     var isMatch = node.msMatchesSelector 
     return isMatch(selector) 
} 
+0

[JavaScript関数のエイリアシングが動作しないようです](https://stackoverflow.com/questions/1007340/javascript-function-aliasing-doesnt-seem-to-work) – Andreas

+0

'querySelector ) 'を' querySelectorAll() 'の代わりにpolyfillに入れて、返された値に' .length'がなく、ループを入力することはできません。 –

+0

ええ、あなたは正しいです、私はそれを見つけて収集しましたが、それでも動作しませんでした。 –

答えて

0

第二場合、isMatchのコンテキスト(this)はundefined代わりにnodeあるため

return node.msMatchesSelector(selector) 

作品と

var isMatch = node.msMatchesSelector 
return isMatch(selector) 

がないことを理由。あなたは、IEがbind()をサポートしていますと仮定して、このようにそれを書くことができます:

var isMatch = node.msMatchesSelector.bind(node) 
return isMatch(selector) 

または単にちょうどあなたがbind()のサポートを必要としないことを確認するための関数をラップ:「

var isMatch = function (s) { return node.msMatchesSelector(s) } 
return isMatch(selector) 

が、それはあなたのため、非常に軽薄なようです関数を1回だけ使うだけなので、最初のメソッドを1行で使うこともできます。

+0

ええ、それはそれです。あなたのすばらしい答えがありがとう.IEはbind()をサポートしていないようです。 –

+0

@ xiaojieLuoこれが[あなたの質問に答えました](https://stackoverflow.com/help/someone-answers)であれば、それを[受け入れられた回答](https://stackoverflow.com/help/accepted-answer)としてマークしてください。 )。 –

関連する問題