Проверьте, собирается ли созданное изображение работать в ограниченном поле размера.
function check_size($font_size, $font, $text, $width, $height) {
if (!is_string($text)) {
throw new Exception('Invalid type for $text');
}
$box = imagettfbbox($font_size, 0, $font, $text);
$box['width'] = abs($box[2] - $box[0]);
if ($box[0] < -1) {
$box['width'] = abs($box[2]) + abs($box[0]) - 1;
}
$box['height'] = abs($box[7]) - abs($box[1]);
if ($box[3] > 0) {
$box['height'] = abs($box[7] - abs($box[1])) - 1;
}
return ($box['height'] < $height && $box['width'] < $width) ? array($font_size, $box['width'], $height) : $this->check_size($font_size - 1, $font, $text, $width, $height);
}
Определенно "поддерживается". Это ваша веб-страница, вы делаете с ней все, что хотите.
Я уже делал это, чтобы отслеживать события аналитики, не изменяя библиотеку, а скрываясь в событиях.
Используйте шаблон прокси:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
Вы также можете обойти вызов исходной функции, если вы хотите (проксировать)
Подробнее здесь: Типы JQuery #Proxy Pattern
Я думаю, что каждая реализация Javascript будет поддерживать это, и в этом нет никакой опасности. Обычно это делается для замены простых окон предупреждений в стиле ОС на что-то более элегантное с HTML / CSS. Это означает, что вам не нужно изменять существующий код! Тот факт, что это возможно, делает Javascript потрясающим.
Мой опыт переопределения функции alert () показывает, что однажды мы использовали ее для «взлома» пробной версии библиотеки JavaScript, которая отображала «Пожалуйста, зарегистрируйтесь!»
Мы просто определили нашу собственную функцию alert () и вуаля.
Это было только для целей тестирования, мы купили полную версию позже, так что здесь ничего аморального не происходит; -)
Все реализации JavaScript в современных браузерах поддерживают переопределение.
Опасности довольно просты: вы можете свести с ума других членов команды, переопределив широко известные функции, такие как alert ().
Так что, если вы не переопределяете функции как инструмент для отладки или взлома существующего кода, я не вижу причин для этого. Просто создайте новую функцию.
Когда дело доходит до функций браузера js window.alert
является выдающимся и наиболее известным, люди, которые не знают js, знают alert ()
- будьте уверены, он поддерживается всеми браузерами , которые используются сегодня , и ваш фрагмент кода тоже. Однако я бы не стал отменять (ну, это больше похоже на рефакторинг, а не на переопределение в смысле ООП) alert ()
для конкретного варианта использования, как у вас, потому что когда вам действительно нужно использовать alert ( )
без шаблона, и вы, вероятно, будете, тогда для этого вам понадобится другая функция без предупреждения.
Хотя большинство браузеров поддерживают его переопределение, будьте осторожны с тем, что вы с ним делаете.
Поскольку окно предупреждения по умолчанию блокирует поток выполнения, некоторые библиотеки, которые полагаются на это поведение, могут не работать больше (в лучшем случае).
Вы должны быть хорошим гражданином и не трогать собственный API. Если вы это сделаете, вы можете сломать ситуацию при использовании стороннего кода.
Тем не менее, если вы хотите переопределить поведение предупреждений в определенном контексте, вы можете заключить его в анонимную функцию, например:
/* new funky alert */
function myFunkyAlert(msg) {
/* here goes your funky alert implementation */
alert("Look ma!\n" + msg);
}
(function(alert) { // anonymous function redefining the "alert"
/* sample code */
alert("Hello World!");
})(myFunkyAlert);
Он точно работает в firefox и ie8. Я не вижу, чтобы был какой-нибудь браузер, в котором он не работал бы. Это в значительной степени основа того, как работает javascript, хотя нечасто можно увидеть его использование с такими нативными функциями =)
В функции предупреждения о переопределении нет никаких опасностей. Каждый браузер поддерживает его.
например:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');