Ошибка скрипта при вставке из Твиттера

Уважаемые коллеги,

В файле 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, возможно?).

Буду благодарен за любые объяснения и подсказки.

7 комментариев

avatar
Собственный bind для поддержки старых браузеров.
Интересно, что и стандартная замена нативного bind от сюда developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill тоже не работает с твиттером.
  • ort
  • +1
avatar
В моём JSFiddle меня удивляет зависимость от настроек JQuery — если подключить его на load, то в кастомный bind код заходит уже после того, как твиттеровский ембед «улучшен» (картинка появляется), и context не нулловый. Но если onDomready, то заходит до улучшения картики, и падает из-за нулла.

А проблема эта не возникала раньше наверное потому, что твиттеровский widgets.js был по-другому написан. Других отличий от ранее работающего кода я не вижу.
avatar
походу тоже столкнулся с такой проблемой, поставил addthis.com
кнопки то выводятся, то не выводятся и в консоли вот такая ошибка

Uncaught TypeError: Function.prototype.bind: cant be bound to null
avatar
avatar
По сути получается, что они тоже рекомендуют делать «if (!Function.prototype.bind) {», т.е. bind() вообще не переопределяется на всех современных браузерах.
avatar
Не так давно в Твитере появились нововведения. Например, там появилась поддержка трансляции видео. Соответственно widgets.js они тоже переписали. Скорее всего из-за этого и перестало работать. Возможно еще и ошибки будут какие-нибудь исправлять в ближайшее время…
avatar
Да, надо посматривать, чтобы опять что-нибудь не поломалось.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.