24

Piszę trochę JavaScript, który używa metody Object.bind.Jak radzić sobie z brakiem metody JavaScript Object.bind() w IE 8

funcabc = function(x, y, z){ 
    this.myx = x; 
    this.playUB = function(w) { 
     if (this.myx === null) { 
      // do blah blah 
      return; 
     } 

     // do other stuff 
    }; 
    this.play = this.playUB.bind(this); 
}; 

Odkąd rozwijać w WinXP z Firefox i czasami testu w Win7 z IE 9 lub 10, nie zauważyłem lub zwrócić uwagę na fakt, że IE8 i poniżej nie obsługują bind.

Ten konkretny skrypt nie używa płótna, więc trochę waham się, aby odpisać wszystkich użytkowników IE 8.

Czy istnieje standardowe obejście?

W JavaScripcie nie ma nic złego, ale nadal jestem trochę noob. Więc wybacz mi, jeśli rozwiązanie jest całkowicie oczywiste.

+0

@micha Tak, brakuje: 'Nie jest obsługiwany w następujących trybach dokumentu : Dziwactwa, standardy Internet Explorer 6, standardy Internet Explorer 7, standardy Internet Explorer 8. " – Alexander

Odpowiedz

49

Jest dobry skrypt kompatybilności na tej stronie: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

Wystarczy skopiować i wkleić go do skryptu.

EDYCJA: umieszczenie poniższego skryptu w celu zwiększenia czytelności.

if (!Function.prototype.bind) { 
    Function.prototype.bind = function(oThis) { 
    if (typeof this !== 'function') { 
     // closest thing possible to the ECMAScript 5 
     // internal IsCallable function 
     throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP && oThis 
       ? this 
       : oThis, 
       aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 
+2

To działało jak czar.Znaleziono poprawkę dotyczącą problemu z bindami i nauczyłem się szukać słowa kluczowego Zgodność w dokumentach mozilla. – Claude

+0

Nawiasem mówiąc, okazuje się, że IE 8 ma zbyt wiele brakujących funkcji. Zasadniczo muszę trzymać się przeglądarek zgodnych z HTML5. Bez poręcznego dźwięku() nie ma sensu. – Claude

+0

@alex - czy wiesz, czy IE10 obsługuje bind, czy potrzebuje obejścia, o którym wspomniałeś? –

4

Najlepszym rozwiązaniem może być instalacja Modernizr.

Modernizor informuje, czy bieżąca przeglądarka ma tę funkcję wbudowaną natywnie, czy nie i zapewnia program do ładowania skryptów, dzięki czemu można wciągnąć wieloryby do funkcji wypełniania w starych przeglądarkach.

Oto link wygenerować modernizr niestandardową wersję:
http://modernizr.com/download/#-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes

+0

Jak sprawdzić, czy bieżąca przeglądarka ma tę funkcję wbudowane lub nie korzysta z Modernizera? – dragonfly

+3

Ta odpowiedź jest całkowicie błędna i nieco poprawna! To jest całkowicie błędne, ponieważ Modernizr nie oferuje testu na dostępność powiązania funkcji (prawdopodobnie dlatego, że test jest tak prosty jak sprawdzenie, czy 'Function.prototype.bind! == undefined'). Jednak jest to trochę poprawne, ponieważ Modernizr faktycznie zawiera funkcję polyfill sam w sobie! Szczegółowe informacje o włączeniu tutaj: https://github.com/Modernizr/Modernizr/issues/478 – WickyNilliams

+0

Modernizacja> 3 nie zawiera już polyfill dla wiązania – gunnx

0

Konstruktor Funkcja jest staromodny sposób to zrobić:

var foo = function(x,y,z){ return Function("x,y,z","return Math.max.call(this, x, y, z)")(x,y,z) } 
 
    
 
var bar = function(x,y,z){ return Function("x,y,z","return Math.min.call(this, x, y, z)")(x,y,z) } 
 
    
 
console.log(foo(1,2,3)); 
 
    
 
console.log(bar(3,2,1));

Referencje

2

Function.prototype.bind nie jest obsługiwana w programie Internet Explorer 8 i poniżej. Tabela zgodności tutaj: http://kangax.github.io/es5-compat-table/

Mozilla Developer Network zapewnić tę alternatywę dla starszych przeglądarek, które nie realizowanych .bind() natywnie:

if (!Function.prototype.bind) { 
    Function.prototype.bind = function (oThis) { 
    if (typeof this !== "function") { 
     // closest thing possible to the ECMAScript 5 internal IsCallable function 
     throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); 
    } 

    var aArgs = Array.prototype.slice.call(arguments, 1), 
     fToBind = this, 
     fNOP = function() {}, 
     fBound = function() { 
      return fToBind.apply(this instanceof fNOP && oThis 
           ? this 
           : oThis, 
           aArgs.concat(Array.prototype.slice.call(arguments))); 
     }; 

    fNOP.prototype = this.prototype; 
    fBound.prototype = new fNOP(); 

    return fBound; 
    }; 
} 
Powiązane problemy