كيف يتم تغيير حجم الصفيح التلقائي؟
-
22-09-2019 - |
سؤال
لديّ tinymce تم تعيينه على نص ، وأريد أن تضع هذه المنطقة المحرر كل مساحة الوالد Div ، في جميع الأوقات.
لدي وظيفة JS التي تحصل على المساحة الحالية وتعيين textarea.style.
أيضا ، فإن النص له عرض: 100 ٪ ؛ لا يتم تغيير حجمه عن طريق عرض HTML عند استخدام Tinymce أيضًا.
أيه أفكار؟
المحلول
في الوقت الحاضر ، يجب عليك استخدام البرنامج المساعد التلقائي الذي يأتي مع tinymce. سيتعين عليك استدعاء Tinymce مثل هذا (إصدار jQuery):
$('.tinymce').tinymce({
theme : 'advanced',
plugins : 'autoresize',
width: '100%',
height: 400,
autoresize_min_height: 400,
autoresize_max_height: 800,
});
لقد صنعت التجربة ، وأنه قد يكون من المفيد استدعاء الحجم اليدوي في init_instance_callback
لتوفير الارتفاع الصحيح على init. أضف هذه المعلمة إلى الخيارات التي تم تمريرها ، إذا كنت بحاجة إلى هذا:
init_instance_callback: function (inst) { inst.execCommand('mceAutoResize'); }
نصائح أخرى
النقطة هي أن tinymce يولد iframe في مكان textarea ، مع هذا المعرف: OriginalId+"_ ifr" ، وجدول OriginalId+"_ tbl" لعقد عناصر التحكم ومنطقة المحرر.
لجعل عرض السوائل:
document.getElementById(id+'_tbl').style.width='100%'
لجعل ارتفاع السوائل:
تغيير ديناميا document.getElementById(id+'_ifr').style.height
إلى الارتفاع الذي تريده ، من خلال JS.
هذا هو البرنامج النصي الذي أستخدمه لهذا:
function toScreenHeight(id, minus) {
var height;
if (typeof(window.innerHeight) == "number") //non-IE
height = window.innerHeight;
else if (document.documentElement && document.documentElement.clientHeight) //IE 6+ strict mode
height = document.documentElement.clientHeight;
else if (document.body && document.body.clientHeight) //IE 4 compatible / IE quirks mode
height = document.body.clientHeight;
document.getElementById(id).style.height = (height - minus) + "px";
}
يمكنك استخدام الكود ومكالمات الوظائف في الداخل onload
و onresize
body
الأحداث.
في Tinymce 3.4.6 ، مجموعة
width:'100%'
في خيار init سيحل المشكلة.
إذا كنت تقوم بعمل MCE Tiny بشكل ديناميكي عبر JS ، فيمكنك مواجهة مشكلات توقيت حيث لم يكن محرر MCE متاحًا بعد للتعديلات على الأنماط. لمكافحة هذا ، يمكنك استخدام مهلة المدرسة القديمة.
في هذا المثال ، أستخدم مساحة اسم "J" لـ JQuery. إذا كان المحرر الخاص بك في div السائل يتغير حجمه ، فقد ترغب في تضمين هذا في $ (window) .resize (function () {}) ؛ المستمع.
setTimeout(function(){
$j('.mceEditor').css('width','100%').css('minHeight','240px');
$j('.mceLayout').css('width','100%').css('minHeight','240px');
$j('.mceIframeContainer').css('width','100%').css('minHeight','240px');
$j('#'+[INSERT TEXTAREA ID HERE]+'_ifr').css('width','100%').css('minHeight','240px');
},500)
لم يكن أي مما سبق يعمل بالنسبة لي في Tinymce V4 ، لذلك كان حلي هو حساب الارتفاع بناءً على أشرطة الأدوات/شريط القائمة/شريط الحالة ، ثم ضبط ارتفاع المحرر ، مع مراعاة تلك المرتفعات.
function resizeEditor(myHeight) {
window.console.log('resizeEditor');
myEditor = getEditor();
if (myEditor) {
try {
if (!myHeight) {
var targetHeight = window.innerHeight; // Change this to the height of your wrapper element
var mce_bars_height = 0;
$('.mce-toolbar, .mce-statusbar, .mce-menubar').each(function(){
mce_bars_height += $(this).height();
});
window.console.log('mce bars height total: '+mce_bars_height);
myHeight = targetHeight - mce_bars_height - 8; // the extra 8 is for margin added between the toolbars
}
window.console.log('resizeEditor: ', myHeight);
myEditor.theme.resizeTo('100%', myHeight); // sets the dimensions of the editable area
}
catch (err) {
}
}
}
في حالتي ، أردت أن تتطابق نافذة المحرر مع عرض وارتفاع الفعلي window
, ، منذ أن جاء المحرر في نافذة منبثقة. للكشف عن التغييرات والتغيير حجمها ، قمت بتعيين هذا على رد الاتصال:
window.onresize = function() {
resizeEditor();
}
مع الإصدار 4 وخيار استخدام Flexbox Layout في المتصفح ، قمت بما يلي للحصول على عرض كامل ، تجربة تحرير الارتفاع في Div.
يجب أن يكون من السهل وضع CSS في ملف إذا كنت تفضل إضافته إلى أنماطك الحالية.
var css = '.tinycme-full .mce-edit-area {display:flex;flex-flow:column;} .tinycme-full .mce-edit-area iframe {flex:1 1 auto;} .tinycme-full {height:100%;} .tinycme-full .mce-tinymce.mce-container { width:100%;height:100%;border:0; } .tinycme-full .mce-panel{border:0} .tinycme-full .mce-container-body.mce-stack-layout {display: flex; flex-flow: column;height: 100%;} .tinycme-full .mce-stack-layout-item{ flex: 0 0 auto;} .tinycme-full .mce-edit-area{flex:1 1 auto;} ',
head = document.head || document.getElementsByTagName('head')[0],
style = document.createElement('style');
style.type = 'text/css';
if (style.styleSheet) {
style.styleSheet["cssText"] = css;
} else {
style.appendChild(document.createTextNode(css));
}
head.appendChild(style);
والفكرة هي أنها تجعل جميع divs المطلوبة تشغل مساحة العمود أكبر من ذلك حسب الحاجة لملء الأصل 100 ٪ وفعله عن طريق وضع div حول النص الخاص بك: <div class="tinycme-full"> <textarea ... /></div>
لا توجد حاجة إلى أي jQuery أو التبعيات الأخرى وتوغل الآن الوالد بنسبة 100 ٪.
واجهت نفس المشكلة ، بعد قراءة هذا الموضوع ، انتهى بي الأمر بهذا الرمز
init_instance_callback: function (inst) {
setTimeout(function () {
document.getElementById(inst.id + '_ifr').style.height= (document.getElementById("theContainerDiv").offsetHeight-85) + 'px';
},1000);
},
أقوم بتغيير حجم العنصر "_ifm" بدلاً من "_tbl" ، لأن تغيير حجم "_tbl" لم يغير حجم منطقة التحرير بالنسبة لي. ثم أترك بعض المساحة لشريط الأدوات و status من خلال جعل "_ifr" 85 بكسل أقصر ثم الحاوية div.
اضطررت إلى استخدام setTimeout لجعلها تعمل ، ربما لأن لديّ رسوم متحركة تعرض عنصر الحاوية.
أنا أستخدم حل CSS النقي لتحقيق ذلك (Tinymce 4.0.20).
حدد ارتفاع IFRAME إلى 100 ٪:
tinymce.init ({ارتفاع: '100 ٪'})
أضف أنماطًا إلى حاوية iframe ذات الحجم التلقائي:
.mce-tinymce {الارتفاع: Auto ؛ العرض: 100 ٪ ؛ الموقف: مطلق ؛ اليسار: 0 ؛ أعلى: 0 ؛ القاع: 0 ؛ }
.bq-editor .mce-container-body {الارتفاع: 100 ٪ ؛ }
.bq-editor .Mce-Edit-area {position: absolute ؛ أعلى: 57 بكسل ؛ القاع: 0 ؛ العرض: 100 ٪ ؛ الارتفاع: السيارات ؛ }
ملحوظة: لدي خط شريط أدوات واحد ، وأعلى: 57 بكسل ؛ في .bq-editor .Mce-Edit-area هو حشوة شريط الأدوات.
Sycoder على حق لكنني تابعت مسارًا مختلفًا قليلاً على الرغم من أن نفس النتائج.
/*Container, container body, iframe*/
.mce-tinymce, .mce-container-body, #code_ifr {
min-height: 100% !important;
}
/*Container body*/
.mce-container-body {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
/*Editing area*/
.mce-container-body .mce-edit-area {
position: absolute;
top: 69px;
bottom: 37px;
left: 0;
right: 0;
}
/*Footer*/
.mce-tinymce .mce-statusbar {
position: absolute;
bottom: 0;
left: 0;
right: 0;
}
المنقحة لأن Tinymce يغير المعرف مع إضافات أو حذف شريط الأدوات. هذا يعمل بغض النظر عما تفعله به.
يعد غلاف IFRAME (إنهاء المعرف الخاص به بواسطة _ifr) أول أحد الوالدين للمتابعة التي يكون لها تطبيق كدور. وبالتالي ، للحصول على الغلاف:
$('span[role=application]').parents(':eq(0)')
لذلك لتغيير حجم الارتفاع:
$('[id$=_ifr]').css('height',$('span[role=application]').parents(':eq(0)').css('height'))
لتغيير حجم العرض
$('[id$=_ifr]').css('width',$('span[role=application]').parents(':eq(0)').css('width'))
لم يعمل أي من هذه الحلول بنسبة 100 ٪ بالنسبة لي. كنت بحاجة إلى الارتفاع للضبط على التهيئة وأثناء التعديلات. ما فعلته هو الاستيلاء على ارتفاع عنصر HTML في iframe ، ثم طبقت الارتفاع على iframe مع 100 بكسل إضافي.
إليك الحل الخاص بي: (تمت إضافة IMG Max-Width للصور المستجيبة)
على التهيئة
setup: function(editor) {
editor.on('init', function (e) {
$("#editor_textarea_ifr").contents().find('img').css("max-width","100%");
iframeHeight = $("#editor_textarea_ifr").contents().find("html").height();
$("#editor_textarea_ifr").css("height",iframeHeight + 100);
});
},
على تغيير العقدة (التعديلات)
init_instance_callback: function (editor) {
editor.on('NodeChange', function (e) {
$("#editor_textarea_ifr").contents().find('img').css("max-width","100%");
iframeHeight = $("#editor_textarea_ifr").contents().find("html").height();
$("#editor_textarea_ifr").css("height",iframeHeight + 100);
});
}