Ошибка скрипта при вставке из Твиттера
Уважаемые коллеги,
В файле engine/lib/internal/template/js/main.js происходит переопределение метода .bind():
Вроде бы невинная проверка, но она падает, если в заметку вставлен эмбед Твиттера, поскольку в подключаемом widgets.js идёт прямой вызов .bind() с нуллом:
Это приводит к выбрасыванию исключения «Function.prototype.bind: cant be bound to null» (как есть, без апострофа).
Я эту ситуацию смог воспроизвести: jsfiddle.net/NPC42/z89o15em/ (см. консоль), но только если поставить запуск JQuery на onDomready, иначе всё работает без проблем (каким-то образом).
Вопрос мой состоит из двух частей — во-первых, может я что-то не так понял? :) Проблема происходит при определённых обстоятельствах, и я не до конца понимаю, при каких именно. С полгода назад вставка Twitter работала, а теперь мы видим, что начала падать на этом месте — хотя теоретически должна была падать всегда.
Во-вторых, будет ли безопасно поменять определение в main.js следующим образом?
Проблему вставки Твиттера это решает, но я тревожусь, не поломает ли это что-то ещё, ведь по какой-то причине LS решил определить собственный метод .bind() (для поддержки IE8, возможно?).
Буду благодарен за любые объяснения и подсказки.
В файле engine/lib/internal/template/js/main.js происходит переопределение метода .bind():
Function.prototype.bind = function(context) { var fn = this; if(jQuery.type(fn) != 'function'){ throw new TypeError('Function.prototype.bind: call on non-function'); }; if(jQuery.type(context) == 'null'){ throw new TypeError('Function.prototype.bind: cant be bound to null'); }; return function() { return fn.apply(context, arguments); }; };
Вроде бы невинная проверка, но она падает, если в заметку вставлен эмбед Твиттера, поскольку в подключаемом widgets.js идёт прямой вызов .bind() с нуллом:
e.exports = {tweet: o(r.bind(null, "tweet")),timeline: i,video: o(r.bind(null, "video")),tweetRefresh: r.bind(null, "tweet")}
Это приводит к выбрасыванию исключения «Function.prototype.bind: cant be bound to null» (как есть, без апострофа).
Я эту ситуацию смог воспроизвести: jsfiddle.net/NPC42/z89o15em/ (см. консоль), но только если поставить запуск JQuery на onDomready, иначе всё работает без проблем (каким-то образом).
Вопрос мой состоит из двух частей — во-первых, может я что-то не так понял? :) Проблема происходит при определённых обстоятельствах, и я не до конца понимаю, при каких именно. С полгода назад вставка Twitter работала, а теперь мы видим, что начала падать на этом месте — хотя теоретически должна была падать всегда.
Во-вторых, будет ли безопасно поменять определение в main.js следующим образом?
if (!Function.prototype.bind) { Function.prototype.bind = function(context) { var fn = this; if(jQuery.type(fn) != 'function'){ throw new TypeError('Function.prototype.bind: call on non-function'); }; if(jQuery.type(context) == 'null'){ throw new TypeError('Function.prototype.bind: cant be bound to null'); }; return function() { return fn.apply(context, arguments); }; }; }
Проблему вставки Твиттера это решает, но я тревожусь, не поломает ли это что-то ещё, ведь по какой-то причине LS решил определить собственный метод .bind() (для поддержки IE8, возможно?).
Буду благодарен за любые объяснения и подсказки.