অজ্যাক্স দ্বারা লোড করা সামগ্রীর প্রস্থে স্বয়ংক্রিয়ভাবে jQuery UI ডায়ালগটি পুনরায় আকার দিন


134

এ সম্পর্কে সুনির্দিষ্ট তথ্য এবং উদাহরণ খুঁজে পেতে আমার অনেক সমস্যা হচ্ছে। আমার অ্যাপ্লিকেশনটিতে .jax () কল সহ লোড হওয়া ডিভসের সাথে সংযুক্ত আমার বেশ কয়েকটি jQuery UI ডায়ালগ পেয়েছি। তারা সকলেই একই সেটআপ কল ব্যবহার করে:

 $(".mydialog").dialog({
        autoOpen: false,
        resizable: false,
        modal: true
 });

আমি কেবল কথোপকথনটি লোড হয়ে যাওয়া সামগ্রীর প্রস্থে আকার পরিবর্তন করতে চাই। এখনই, প্রস্থটি কেবল 300px (ডিফল্ট) এ থাকে এবং আমি একটি অনুভূমিক স্ক্রোলবার পাই।

আমি যতদূর বলতে পারি, "অটোআরাইজাইজ" ডায়ালগগুলির জন্য আর বিকল্প নয়, এবং আমি এটি উল্লেখ করার পরে কিছুই হয় না।

আমি প্রতিটি সংলাপের জন্য পৃথক ফাংশন না লেখার চেষ্টা করছি, তাই .dialog("option", "width", "500")সত্যই কোনও বিকল্প নয়, কারণ প্রতিটি সংলাপের আলাদা প্রস্থ থাকবে।

width: 'auto'কথোপকথনের বিকল্পগুলির জন্য উল্লেখ করা ব্রাউজার উইন্ডোটির প্রস্থের 100% ডায়ালগ গ্রহণ করে।

আমার বিকল্পগুলি কি? আমি jQuery UI 1.8rc1 এর সাথে jQuery 1.4.1 ব্যবহার করছি। দেখে মনে হচ্ছে এটি এমন কিছু হওয়া উচিত যা সত্যই সহজ।

সম্পাদনা: আমি এর জন্য একটি ক্লডজি ওয়ার্কআরাউন্ড বাস্তবায়ন করেছি, তবে আমি আরও ভাল সমাধানের সন্ধান করছি।

উত্তর:


250

আমি সবেমাত্র JQuery 1.4.1 এবং UI 1.8rc1 ব্যবহার করে একটি ক্ষুদ্র নমুনা অ্যাপ্লিকেশন লিখেছি। আমি যা করলাম তা সমস্তই কনস্ট্রাক্টর হিসাবে নির্দিষ্ট করা হয়েছিল:

var theDialog = $(".mydialog").dialog({
        autoOpen: false,
        resizable: false,
        modal: true,
        width:'auto'
});

আমি জানি আপনি বলেছিলেন যে এটি ব্রাউজার উইন্ডোটির 100% প্রস্থ নিতে পারে তবে এটি এখানে মিষ্টি কাজ করে, এফএফ 3.6, ক্রোম এবং আইই 8 তে পরীক্ষিত।

আমি এজেএক্স কলগুলি করছি না, কেবল ম্যানুয়ালি ডায়ালগের এইচটিএমএল পরিবর্তন করছি তবে মনে করবেন না যে এটি কোনও প্রোব তৈরি করবে। অন্য কিছু সিএসএস সেটিং এটিকে ছিটকে দিতে পারে?

এর সাথে একমাত্র সমস্যাটি হ'ল এটি প্রস্থটিকে অফ-সেন্টার করে তোলে তবে আমি এই সমর্থন টিকিটটি পেয়েছি যেখানে তারা dialog('open')সমস্যাটি সমাধানের জন্য একটি সেটটাইমআউটে বিবৃতিটি রাখার একটি কার্যকারিতা সরবরাহ করে।

এখানে আমার মাথার ট্যাগের বিষয়বস্তু রয়েছে:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery-ui.min.js"></script>
<link href="jquery-ui.css" rel="stylesheet" type="text/css" />
<script type="text/javascript">
    $(function(){
        var theDialog = $(".mydialog").dialog({
            autoOpen: false,
            resizable: false,
            modal: true,
            width: 'auto'
        });

        $('#one').click(function(){
            theDialog.html('some random text').dialog('open');
        });

        $('#two').click(function(){
            theDialog.html('<ul><li>Apple</li><li>Orange</li><li>Banana</li><li>Strawberry</li><li>long text string to see if width changes</li></ul>').dialog('open');
        });

        $('#three').click(function(){
            //this is only call where off-centre is noticeable so use setTimeout
            theDialog.html('<img src="./random.gif" width="500px" height="500px" />');
            setTimeout(function(){ theDialog.dialog('open') }, 100);;
        });
     });
</script>

আমি জেকারি ইউআই এর জন্য জেএসএস এবং সিএসএস http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc1.zip থেকে ডাউনলোড করেছি । এবং শরীর:

<div class='mydialog'></div>
<a href='#' id='one'>test1</a>
<a href='#' id='two'>test2</a>
<a href='#' id='three'>test3</a>

ফিরমিন - আপনার উদাহরণ এবং পোস্টের জন্য ধন্যবাদ। এটি সিএসএসে আসলেই সমস্যা ছিল তা প্রমাণিত হয়েছে, যদিও সঠিক সমস্যাটি এখনও এটি পরিষ্কার নয় (এটি ফায়ারব্যাগ থেকে অবশ্যই প্রকাশিত হয়নি)। আমার সমস্ত ডায়লগ ডিভগুলি শীর্ষ স্তরে নিয়ে যাওয়া এবং ডিফল্ট 1.8.1 সিএসএস (আমাদের থিমযুক্ত সংস্করণের পরিবর্তে) ব্যবহার করে এটি দুর্দান্ত কাজ করে। ১.৮.১ প্রকাশিত হলে আমি ধীরে ধীরে আমাদের থিমযুক্ত সংস্করণটি ফিরিয়ে আনব এবং সমস্যার মূলটি খুঁজে পাব। ধন্যবাদ!
womp

সমস্যা নেই, খুশী আমি সাহায্য করতে পারলাম। আমি আগে সেখানে ছিলাম, এটি একবারে 1 সিএসএস বিবৃতি সরিয়ে নিয়ে যাওয়ার ঘটনা .... উপভোগ করুন!
ফার্মিন

2
আই 7 টি যদিও ভাঙ্গা বলে মনে হচ্ছে
অ্যালেক্স

2
আপনি যদি সামগ্রীটি লোড করতে AJAX ব্যবহার করেন, সেটটাইমআউট () কোনও নির্ভরযোগ্য সমাধান সরবরাহ করতে পারে না (উদাহরণস্বরূপ, যদি সার্ভারটি ধীর ছিল এবং লোড হতে 100 মিমি বেশি সময় নেয়)। ওপেনটি ট্রিগার করার জন্য .ajax () পদ্ধতির কলব্যাক ফাংশনটি ব্যবহার করা আরও ভাল সমাধান হবে। পৃষ্ঠা লোড সম্পূর্ণ না হওয়া পর্যন্ত এটি খোলা হবে না।
njbair

1
{'width':'auto'}আইই 7 তে কাজ করে না এবং স্থির হবে না কারণ স্কট.gonzalez অনুসারে jQuery-UI দ্বারা{'width':'auto'} বিকল্পটি সমর্থন করে না : "ডায়ালগটি অটো প্রস্থকে সমর্থন করে না doc ডকসেস বলে যে বিকল্পটি কেবল একটি সংখ্যা গ্রহণ করে, যা ব্যবহৃত হবে পিক্সেল আকারের জন্য we আমরা অটো প্রস্থকে কেন সমর্থন করব না সে সম্পর্কে আলোচনার জন্য jquery-ui-dev থ্রেড দেখুন "
ভ্লাদিমির কর্নিয়া

11

একই সমস্যা ছিল এবং আপনাকে উল্লেখ করার জন্য ধন্যবাদ যে আসল সমস্যাটি সিএসএসের সাথে সম্পর্কিত ছিল আমি বিষয়টি খুঁজে পেয়েছি:

আপনার সিএসএস নিয়মের position:relativeপরিবর্তে সংলাপটি তৈরি করে এবং অদ্ভুত আচরণ করে।position:absolute.ui-dialogwidth:'auto'

.ui-dialog { position: absolute;}


2

আমি ভাসা বসানোর কল্পনা করেছি: ডায়ালগের জন্য বাম কাজ করবে। সম্ভবত ডায়ালগটি সম্পূর্ণরূপে প্লাগইন দ্বারা অবস্থিত, এক্ষেত্রে এর অবস্থানটি এটি দ্বারা নির্ধারিত হবে, তবে ভাসমানের পার্শ্ব-প্রতিক্রিয়া - উপাদানগুলি কেবল সামগ্রীতে রাখার জন্য যতটা প্রশস্ত করা দরকার - এখনও কার্যকর হবে।

যদি আপনি ঠিক একটি নিয়ম রাখেন তবে এটি কাজ করা উচিত

.myDialog {float:left}

আপনার স্টাইলশিটে, যদিও আপনাকে এটি jQuery ব্যবহার করে সেট করার প্রয়োজন হতে পারে


2

আমি সংশ্লিষ্ট থিমটি আপগ্রেড না করে jquery UI 1.8.1 এ আপগ্রেড করার সময় আমার একই সমস্যা ছিল। শুধুমাত্র থিমটিও আপগ্রেড করা দরকার এবং "অটো" আবার কাজ করে।


2

কোনও কারণে আমি আইই 7 এর সাথে এই পুরো পৃষ্ঠার প্রস্থের সমস্যাটি রেখেছি তাই আমি এই হ্যাকটি তৈরি করেছি:

var tag = $("<div></div>");
//IE7 workaround
var w;
if (navigator.appVersion.indexOf("MSIE 7.") != -1)
    w = 400;
else
    w = "auto";

tag.html('My message').dialog({
    width: w,
    maxWidth: 600,
    ...

2

আপনি সর্বোচ্চ প্রস্থ নির্দিষ্ট করে 100% প্রস্থের সমস্যাটি এড়াতে পারবেন। maxWidthবিকল্প কাজ বলে মনে হচ্ছে না; সুতরাং max-widthপরিবর্তে ডায়ালগ উইজেটে সিএসএস সম্পত্তি সেট করুন ।

আপনি যদি সর্বোচ্চ উচ্চতাও সীমাবদ্ধ করতে চান তবে maxHeightবিকল্পটি ব্যবহার করুন । এটি যখন প্রয়োজন হবে তখন সঠিকভাবে স্ক্রোলবারটি প্রদর্শন করবে।

$(function() {
  var $dialog = $("#dialog");
  $dialog.dialog({
    autoOpen: false,
    modal: true,
    width: "auto"
  });
  /*
   * max-width should be set on dialog widget because maxWidth option has known issues
   * max-height should be set using maxHeight option
   */
  $dialog.dialog("widget").css("max-width", $(window).width() - 100);
  $dialog.dialog("option", "maxHeight", $(window).height() - 100);
  $(".test-link").on("click", function(e) {
    e.preventDefault();
    $dialog.html($(this.hash).html());
    // if you change the content of dialog after it is created then reset the left
    // coordinate otherwise content only grows up to the right edge of screen
    $dialog.dialog("widget").css({ left: 0 });
    $dialog.dialog("open");
  });
});
@import url("https://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.min.css");
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>

<div id="dialog"></div>

<!-- test links -->

<p>
  <a href="#content-1" class="test-link">Image (Landscape)</a>
  <a href="#content-2" class="test-link">Image (Portrait)</a>
  <a href="#content-3" class="test-link">Text Content (Small)</a>
  <a href="#content-4" class="test-link">Text Content (Large)</a>
</p>
<p>If you are viewing in Stack Snippets > Full page then reload the snippet so that window height is recalculated (Right click > Reload frame).</p>

<!-- sample content -->

<div id="content-1" style="display: none;">
  <img src="https://i.stack.imgur.com/5leq2.jpg" width="450" height="300">
</div>

<div id="content-2" style="display: none;">
  <img src="https://i.stack.imgur.com/9pVkn.jpg" width="300" height="400">
</div>

<div id="content-3" style="display: none;">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sodales eu urna sit amet fermentum. Morbi ornare, leo ut ornare volutpat, nibh diam mattis elit, eget porta sapien quam eu mi. Nullam sollicitudin, nibh non suscipit commodo, nisi metus bibendum urna, vitae congue nisl risus eu tellus. Praesent diam ligula, hendrerit eget bibendum quis, convallis eu erat. Aliquam scelerisque turpis augue, sit amet dictum urna hendrerit id. Vestibulum luctus dolor quis ex sodales, nec aliquet lacus elementum. Mauris sollicitudin dictum augue eget posuere. Suspendisse diam elit, scelerisque eu quam vel, tempus sodales metus. Morbi et vehicula elit. In sit amet bibendum mi.</p>
</div>

<div id="content-4" style="display: none;">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sodales eu urna sit amet fermentum. Morbi ornare, leo ut ornare volutpat, nibh diam mattis elit, eget porta sapien quam eu mi. Nullam sollicitudin, nibh non suscipit commodo, nisi metus bibendum urna, vitae congue nisl risus eu tellus. Praesent diam ligula, hendrerit eget bibendum quis, convallis eu erat. Aliquam scelerisque turpis augue, sit amet dictum urna hendrerit id. Vestibulum luctus dolor quis ex sodales, nec aliquet lacus elementum. Mauris sollicitudin dictum augue eget posuere. Suspendisse diam elit, scelerisque eu quam vel, tempus sodales metus. Morbi et vehicula elit. In sit amet bibendum mi.</p>
  <p>Aenean eu magna tempor, pellentesque arcu eget, mattis enim. Cras at volutpat mi. Aenean id placerat felis, quis imperdiet nunc. Aenean a iaculis est, quis lacinia nisl. Sed aliquet sem eget justo convallis congue. Quisque rhoncus nulla sit amet cursus maximus. Phasellus nec auctor urna. Nam mattis felis et diam finibus consectetur. Etiam finibus dignissim vestibulum. In eu urna mattis dui pharetra iaculis. Nam eleifend odio et massa imperdiet, et hendrerit mauris tempor. Quisque sapien lorem, dapibus ut ultricies ut, hendrerit in nulla. Nunc lobortis mi libero, nec tincidunt lacus pretium at. Aliquam erat volutpat.</p>
  <p>Fusce eleifend enim nec massa porttitor tempor a eget neque. Quisque vel augue ac urna posuere iaculis. Morbi pharetra augue ac interdum pulvinar. Duis vel posuere risus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Ut vitae lectus non nisl iaculis volutpat nec vitae ante. Maecenas quis condimentum elit. Sed nisl urna, convallis ut pellentesque sit amet, pellentesque eget quam. Pellentesque ornare sapien ac scelerisque pretium. Pellentesque metus tortor, accumsan in vehicula iaculis, efficitur eget nisi. Donec tincidunt, felis vel viverra convallis, lectus lectus elementum magna, faucibus viverra risus nulla in dolor.</p>
  <p>Duis tristique sapien ut commodo laoreet. In vel sapien dui. Vestibulum non bibendum erat. Etiam iaculis vehicula accumsan. Phasellus finibus, elit et molestie luctus, massa arcu tempor nulla, id hendrerit metus mauris non mi. Morbi a ultricies magna. Proin condimentum suscipit urna eu maximus. Mauris condimentum massa ac egestas fermentum. Praesent faucibus a neque a molestie. Integer sed diam at eros accumsan convallis.</p>
</div>


1

আমারও একই সমস্যা ছিল।

আমার widthপক্ষে ঠিকঠাক "auto"কাজ করার জন্য সেট করা কিন্তু ডায়লগটিতে যখন অনেকগুলি পাঠ্য থাকে তখন maxWidthসেটিংসটিকে উপেক্ষা করে পৃষ্ঠার পুরো প্রস্থকে বিস্তৃত করে তোলে ।

ঠিকঠাক কাজের maxWidthউপর সেট করা createযদিও:

$( ".selector" ).dialog({
  width: "auto",
  // maxWidth: 660, // This won't work
  create: function( event, ui ) {
    // Set maxWidth
    $(this).css("maxWidth", "660px");
  }
});

1

আমি ভাল হিসাবে এই সমস্যা ছিল।

আমি এটি দিয়ে এটি কাজ করে:

.ui-dialog{
    display:inline-block;
}

1

আপনার যা করতে হবে তা কেবল যুক্ত করা:

width: '65%',

ওপির প্রশ্নের ভিত্তিতে, এটি তার সমস্ত ডায়ালগ বাক্সের জন্য কাজ করবে না এবং তারপরেও প্রতিটি ডায়ালগ বাক্স পৃথকভাবে সেট করা দরকার।
Roelofs

0

আমার একই সমস্যা আছে এবং অবস্থান আছে: আপনার .ui- ডায়ালগ absolute} CSS এ পরম ছিল না enough আমি সেই অবস্থানটি লক্ষ্য করেছি: আপেক্ষিকটি প্রকৃত উপাদানটির সরাসরি স্টাইলে সেট করা হচ্ছে, তাই .ui-ডায়ালগ সিএসএস সংজ্ঞাটি ওভাররাইট করা হচ্ছে। অবস্থান নির্ধারণ: ডিভের উপর নিখুঁত আমি একটি সংলাপ তৈরি করতে যাচ্ছিলাম স্থিতিশীলভাবেও কাজ হয়নি।

এই কাজটি করার জন্য শেষ পর্যন্ত আমি আমার স্থানীয় jQuery এ দুটি স্থান পরিবর্তন করেছি।

আমি jQuery এ নিম্নলিখিত লাইনটি পরিবর্তিত করেছি:

elem.style.position = "absolute";

https://github.com/jquery/jquery/blob/1.8.0/src/offset.js#L62

এছাড়াও, যেহেতু আমার ডায়লগটি টেনে নেওয়ার মতো সেট করা হয়েছিল, তাই jQuery-ui তেও আমাকে এই লাইনটি পরিবর্তন করতে হয়েছিল:

this.element[0].style.position = 'absolute';

https://github.com/jquery/jquery-ui/blob/1-8-stable/ui/jquery.ui.draggable.js#L48

আমার আরও ভাল করে স্টাইলের মধ্য দিয়ে যাওয়ায় জিনিসগুলি ঠিক হয়ে যাবে, তবে ভেবেছিলাম কীভাবে আমি এই কাজটি করব তা ভাগ করে নেব।


0

আইই 7 এ কাজ করার জন্য আপনার যদি এটির প্রয়োজন হয় তবে আপনি অনিবন্ধিত, বগী এবং অসমর্থিত {'width':'auto'} বিকল্পটি ব্যবহার করতে পারবেন না । পরিবর্তে, আপনার নিম্নলিখিতটি যুক্ত করুন .dialog():

'open': function(){ $(this).dialog('option', 'width', this.scrollWidth) }

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

আপনি width: 0আপনার .dialog()বিকল্পগুলির মধ্যে অন্তর্ভুক্ত করতে চাইতে পারেন , যেহেতু এই পদ্ধতিটি প্রস্থটি কখনই কমবে না, কেবল এটি বৃদ্ধি করবে।

আই 7, আই 8, আই 9, আই 10, আই 11, ফায়ারফক্স 30, ক্রোম 35 এবং অপেরা 22 এ কাজ করার জন্য পরীক্ষিত।


-1

এই বেলো সম্পাদনা করুন:

$("#message").dialog({
	autoOpen:false,
	modal:true,
	resizable: false,
	width:'80%',


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