Направляющие более стары, имеет больше плагинов, имеет большую базу пользователей, имеет в наличии лучшую документацию и поддержку. Это может также работать на JRuby предоставляющий доступа к библиотекам Java, если Вы требуете.
Grails имеет некоторые интересные качества, но не может утверждать, что произошел там с направляющими просто все же. Однако, если Вы - преимущественно Java или отличный разработчик, можно предпочесть его. Иначе, хотя, я предложил бы использовать направляющие для проектов среднего размера прямо сейчас.
Это известная ошибка в Opera. В дополнение к приведенным выше идеям обходных путей вы можете поиграть с чем-то вроде этого:
var clone=document.documentElement.cloneNode(true)
var win=window.open('about:blank');
win.document.replaceChild(clone, win.document.documentElement);
win.print();
Я не тестировал это, но он должен создать копию страницы во всплывающем окне и распечатать ее без необходимости загружать контент второй раз с сервера или потеря любых модификаций DOM, которые вы хотите распечатать.
Я не могу воспроизвести вашу проблему с Chrome. Opera, однако, действительно по-прежнему печатает всю внешнюю страницу при попытке распечатать только iframe.
Я разработал обходной путь, и, хотя он в основном работает, он не на 100% безопасен (среди прочего, потому что Opera переносит строки для печати ; Я не знаю, как правильно рассчитать высоту в таких случаях). Тем не менее, следующий код работает как минимум разумно (с использованием jQuery для удобства):
if ($.browser.opera) {
var ifr = $('#youriframe');
var ifrbody = ifr.get(0).contentDocument.body;
var sheet = $([
'<style type="text/css" media="print">',
'body * {',
' display: none;',
'}',
'#youriframe {',
' border: none;',
' display: block;',
' height: ', ifrbody.scrollHeight, 'px;',
' margin: 0px;',
' padding: 0px;',
' width: ', ifrbody.scrollWidth, 'px;',
'}',
'<\/style>'
].join(''));
$('head').append(sheet);
window.print();
sheet.remove();
}
Надеюсь, это поможет.
Насколько я понимаю, невозможно реализовать печать iframe без открытия нового окна.
Моя функция печати:
if ($.browser.opera || (/chrome/.test(navigator.userAgent.toLowerCase()))) {
var href = contentWindow.location.href;
href = href.indexOf("?") > -1 ? href + "&print=1" : href + "?print=1";
var printWindow = window.open(href, "printWindow", "scrollbars=yes");
printWindow.focus();
}
else {
contentWindow.focus();
contentWindow.print();
}
Также я добавил следующий код в конец тела (когда print == 1):
<script type='text/javascript'>
function invokePrint() {
if (document.readyState && document.readyState!='complete')
setTimeout(function() { invokePrint(); }, 50);
else if (document.body && document.body.innerHTML=='false')
setTimeout(function() { invokePrint(); }, 50);
else {
focus();
print();
}
}
invokePrint();
</script>