ব্রাউজারের আকার পরিবর্তন করার সময় কীভাবে যিকোরি ইউআই ডায়ালগটি অটো-সেন্টার করবেন?


101

আপনি যখন jquery UI ডায়ালগ ব্যবহার করেন, তখন একটি জিনিস ব্যতীত সমস্ত কিছুই ভালভাবে কাজ করে। যখন ব্রাউজারটি আকার পরিবর্তন করা হয়, তখন ডায়ালগটি কেবল প্রাথমিক অবস্থায় থাকে যা সত্যই বিরক্তিকর হতে পারে।

আপনি এটি পরীক্ষা করে দেখতে পারেন: http://jqueryui.com/demos/dialog/

"মডেল ডায়লগ" উদাহরণে ক্লিক করুন এবং আপনার ব্রাউজারটিকে আকার দিন।

ব্রাউজারের আকার পরিবর্তন হয়ে গেলে আমি ডায়লগগুলিকে অটো-সেন্টার করতে দিতে সক্ষম হতে চাই। এটি কি আমার অ্যাপ্লিকেশনটিতে আমার সমস্ত কথোপকথনের জন্য কার্যকর উপায়ে করা যেতে পারে?

অনেক ধন্যবাদ!

উত্তর:


162

positionবিকল্পটি সেট করা এটিকে বাধ্য করবে, সুতরাং আমি #dialogএখানে যে সমস্ত ডায়ালগ ব্যবহার করি সেগুলিতে কেবল একই নির্বাচকটি ব্যবহার করুন (যদি এটি খুঁজে না পায় তবে সমস্ত jQuery এর মতো কোনও পদক্ষেপ নেওয়া হয়নি):

jQuery UI 1.10 এর আগে

$(window).resize(function() {
    $("#dialog").dialog("option", "position", "center");
});

jQuery UI 1.10 বা উচ্চতর

$(window).resize(function() {
    $("#dialog").dialog("option", "position", {my: "center", at: "center", of: window});
});

এখানে একই একই jQuery UI ডেমো পৃষ্ঠাটি কেবল উপরের কোডটি যুক্ত করছে , আমরা উইন্ডোটির resizeইভেন্টে কেবলমাত্র একটি হ্যান্ডলার যুক্ত করছি .resize(), যাতে এটি উপযুক্ত সময়ে পুনরায় কেন্দ্রটি ট্রিগার করে। اور


ধন্যবাদ, এটি দুর্দান্ত দেখাচ্ছে হতে পারে আমার বলা উচিত ছিল যে আমার ডায়লগের আইডি কী তা আমি সবসময় জানি না (এই সংলাপটি আমি কীভাবে লক্ষ্যবস্তু করব?): Var $ কথোপকথন = d ('<div> <a href = "#" শিরোনাম = "বাতিল"> বাতিল করুন </a> </a> </div> ')। এইচটিএমএল (অ্যাসেটব্রোজার)। বোতাম, প্রস্থ: 840, উচ্চতা: 500}); $ কথোপকথন ডায়ালগ ('উন্মুক্ত');
জোরে

11
@ জোরে - আপনি একটি ডায়লগ তৈরি করার সময় তারা সবাই একই শ্রেণি পেতে পারে, সাধারণ করার জন্য আপনি এটি করতে পারেন: এটি $(".ui-dialog-content").dialog("option", "position", "center");কোনও সংলাপের জন্য পরীক্ষা করবে :)
নিক ক্র্যাভার

4
দুর্ভাগ্যক্রমে প্রস্তাবিত উত্তরগুলি ডায়ালগের খারাপ আকার পরিবর্তন করতে প্রভাবিত করে। আপনি যখন এসই হ্যান্ডেলটি দিয়ে এটি পুনরায় আকার দেওয়ার চেষ্টা করেন, তখন ডায়ালগটি সমস্ত চারদিকে পুনরায় আকার দেয়।

4
আমি পুনরায় আকারের ইভেন্টটি থ্রটলিং বা ডিবিউন করার পরামর্শ দিচ্ছি। আমি আই 7 এবং আই 8 ডায়ালগটি ভিউপোর্টের বাইরে "বহিরাগত" ডায়ালগটি সরানো দেখেছি পুনরায় আকারের হ্যান্ডলারটির কারণে অনেক বেশি সময় কার্যকর হয়েছে।
BStruthers

4
JQuery UI এর নতুন সংস্করণগুলিতে, আমাকে "কেন্দ্র" এর পরিবর্তে {আমার: "কেন্দ্র", "সেন্টার", এর: উইন্ডো use ব্যবহার করতে হবে। আমি ব্যবহার করছি 1.11.0।
মাইক ডটারার

21

বিকল্পভাবে এল্লেসিলের জবাব,

এই সমাধানটি সরাসরি আমার জন্য কার্যকর হয়নি, সুতরাং আমি নিম্নলিখিতটি করলাম যা গতিশীল তবে সংক্ষিপ্ত সংস্করণ:

$( window ).resize(function() {
    $(".ui-dialog-content:visible").each(function () {
        $( this ).dialog("option","position",$(this).dialog("option","position"));
    });
});

যদিও এলেসিডিলের জন্য +1

সম্পাদনা:

অনেক সংক্ষিপ্ত সংস্করণ যা একক সংলাপগুলির জন্য দুর্দান্ত কাজ করে:

$(window).resize(function(){
    $(".ui-dialog-content").dialog("option","position","center");
});

.आচ () ব্যবহার করার প্রয়োজন নেই সম্ভবত আপনার যদি কিছু অনন্য সংলাপ থাকে যা আপনি স্পর্শ করতে চান না।


.ui-ডায়ালগ-বিষয়বস্তু ব্যবহার করে সমস্ত কথোপকথনের জন্য, গৃহীত উত্তরটি একটি নির্দিষ্ট ডায়ালগের জন্য
পিয়ের

আহ ঠিক. দুঃখিত সম্পাদনায় প্রথম নজরে পার্থক্যটি লক্ষ্য করেনি।
এল্লেসিল

আমি এই পদ্ধতিটি আধা-সফলভাবে ব্যবহার করছি। এটি বিজ্ঞাপন হিসাবে দেয় তবে আইওএস mobile টি মোবাইল সাফারি কীবোর্ডটি বন্ধ থাকলে সত্যিই চটকে যায়। আমি ইনপুটটি অস্পষ্ট করার () চেষ্টা করেছি কিন্তু জিঞ্জারব্রেড কীবোর্ডটিকে পুনরায় আকার দেওয়ার ইভেন্ট হিসাবে দেখায় এবং এমন লুপে আটকে যায় যা কখনই ইনপুট প্রবেশের অনুমতি দেয় না। অন্য কেউ এর মুখোমুখি?
জোসেফ জুহনকে

.resize()যদি কাউন্টার পৌঁছায় 10বা 20তার বাইরে ভিতরে একটি কাউন্টার যুক্ত করতে পারে তবে break;আমার এই সমস্যা হয়নি, আমি সেই ডিভাইসগুলি / ব্রাউজারগুলিকে যত্ন করি না। আপনার অবশ্যই একটি সমাধান চেষ্টা করতে হবে যে এটি আটকে থাকলে আপনি এ থেকে বেরিয়ে আসতে পারেন
পিয়েরে

আপনার প্রথম পরামর্শটি ফর্মটিতে কাজ করেছে এবং @ এলিলেসিলের উত্তরটি কার্যকর হয় নি।
akousmata

13

একটি আরও ব্যাপক উত্তর, যা নিকের উত্তরকে আরও নমনীয় উপায়ে ব্যবহার করে তা এখানে পাওয়া যাবে

সেই থ্রেড থেকে প্রাসঙ্গিকতার কোডটির একটি অভিযোজন নীচে রয়েছে। এই এক্সটেনশনটি মূলত অটোরেপজিশন নামে একটি নতুন ডায়ালগ সেটিং তৈরি করে যা সত্য বা মিথ্যা গ্রহণ করে। লিখিত হিসাবে কোডটি বিকল্পটিকে সত্য হিসাবে ডিফল্ট করে। এটি আপনার প্রকল্পের একটি .js ফাইলে রাখুন যাতে আপনার পৃষ্ঠাগুলি এটিকে উপকৃত করতে পারে।

    $.ui.dialog.prototype.options.autoReposition = true;
    $(window).resize(function () {
        $(".ui-dialog-content:visible").each(function () {
            if ($(this).dialog('option', 'autoReposition')) {
                $(this).dialog('option', 'position', $(this).dialog('option', 'position'));
            }
        });
    });

আপনি যখন আপনার পৃষ্ঠায় ডায়ালগ তৈরি করবেন এটি আপনাকে এই নতুন সেটিংয়ের জন্য "সত্য" বা "মিথ্যা" সরবরাহ করতে সহায়তা করে।

$(function() {
    $('#divModalDialog').dialog({
        autoOpen: false,
        modal: true,
        draggable: false,
        resizable: false,
        width: 435,
        height: 200,
        dialogClass: "loadingDialog",
        autoReposition: true,    //This is the new autoReposition setting
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
            }
        }
    });
});

এখন এই ডায়ালগটি সর্বদা নিজেরাই প্রতিস্থাপন করবে। অটোরপজিশন (বা আপনি যাকেই সেটিং বলুন) এমন কোনও ডায়ালগ হ্যান্ডেল করতে পারে যেগুলির ডিফল্ট অবস্থান নেই এবং উইন্ডোটির আকার পরিবর্তন করার সাথে সাথে সেগুলি স্বয়ংক্রিয়ভাবে পুনঃস্থাপন করতে পারে। যেহেতু আপনি ডায়ালগটি তৈরি করার সময় আপনি এটি সেট করছেন, আপনার কোনওরকম কোনও ডায়ালগ শনাক্ত করার প্রয়োজন হবে না কারণ পুনঃস্থাপনের কার্যকারিতা ডায়ালগটিতেই তৈরি হয়ে যায়। এবং সর্বোত্তম অংশটি হ'ল যেহেতু এটি প্রতি ডায়ালগ সেট করা হয়েছে, তাই আপনার কিছু ডায়ালগ তাদের নিজেরাই প্রতিস্থাপন করতে পারে এবং অন্যরা যেখানে থাকে সেখানে থেকে যায়।

সম্পূর্ণ সমাধানের জন্য jQuery ফোরামে ব্যবহারকারী স্কট.gonzalez এ toণ।


এই অ্যাডন / সম্পাদনাটি জুলাই ২০১৪ সালের মতো আর কাজ করবে না বলে মনে হয় @ @ পিয়ারের উত্তর এখনও কার্যকর।
অধঃপতন করুন

@ জেনারেট: এটি সম্ভব যে jQuery- এ আপডেটগুলি সিনট্যাক্সে কিছুটা পরিবর্তন আনতে পারে। আমি এই প্রকল্পটি বাস্তবায়িত করেছি এমন প্রকল্পে আমি আর কাজ করছি না এমনকি অ্যাক্সেসও পাচ্ছি না (আসলে, আমি বর্তমানে এপিআই লিখছি), সুতরাং সাম্প্রতিক jQuery সংস্করণগুলির জন্য কোনও পরিবর্তন প্রয়োজন কিনা তা নির্ধারণ করার আমার কাছে সহজ উপায় নেই।
এলিলেসিল

এই উত্তরটি সাম্প্রতিক সংস্করণগুলির জন্য কাজ করে না। তবে ধারণাটি দুর্দান্ত। এটি আমার উইন্ডো $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });
রাইজ

@ nacho4d: উত্তরটি সম্পাদন করতে নির্দ্বিধায় এবং আপনি নীচে যে jquery সংস্করণে কাজ করছেন তার জন্য নতুন কোড যুক্ত করুন।
এলেসিডিল

4
@ এলিলেসিল আমি আপনার প্রথম কোডের কোডের কয়েকটি লাইন পরিবর্তন করেছি। আসলে এটিই স্কট.gonzalez থ্রেডে প্রথম লিখেছিল। আমি জানি না কেন তিনি পরিবর্তিত না $( "#dialog" ).dialog( "option", "position" ) করতে $(this).data("dialog").options.positionপরে। যাইহোক, এখন এই উত্তর কাজ করে!
nacho4d

2

আর একটি সিএসএস-কেবল বিকল্প যা এটি কাজ করে। নেতিবাচক মার্জিনগুলি আপনার উচ্চতা এবং প্রস্থের অর্ধেকের সমান হওয়া উচিত। সুতরাং এই ক্ষেত্রে, আমার ডায়ালগটি 400px লম্বা 720px প্রশস্ত। এটি উল্লম্ব এবং অনুভূমিকভাবে এটি কেন্দ্র করে।

.ui-dialog {
  top:50% !important;
  margin-top:-200px !important; 
  left:50% !important;
  margin-left:-360px !important
}


0

সবাইকে অভিবাদন!

ভ্যানিলা জেএস সমাধান:

(function() {
  window.addEventListener("resize", resizeThrottler, false);

  var resizeTimeout;

  function resizeThrottler() {
    if (!resizeTimeout) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
      }, 66);
    }
  }

  function actualResizeHandler() {
    $(".ui-dialog-content").dialog("option", "position", { my: "center", at: "center", of: window });
  }
}());

$.isVanillaJS == false
অ্যান্ড্রু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.