jQuery UIダイアログをajaxによって読み込まれたコンテンツの幅に自動的にサイズ変更


134

これに関する特定の情報と例を見つけるのに多くの問題を抱えています。私のアプリケーションには、.ajax()呼び出しで読み込まれるdivに接続された多数のjQuery UIダイアログがあります。それらはすべて同じセットアップ呼び出しを使用します。

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

ロードされるコンテンツの幅に合わせてダイアログのサイズを変更したいだけです。現在、幅は300px(デフォルト)のままで、水平スクロールバーが表示されます。

私の知る限り、 "autoResize"はダイアログのオプションではなくなり、指定しても何も起こりません。

ダイアログごとに個別の関数を作成しないよう.dialog("option", "width", "500")にしています。ダイアログごとに幅が異なるため、実際にはオプションではありません。

指定 width: 'auto'ダイアログオプションをすると、ダイアログがブラウザウィンドウの幅の100%を占めるだけになります。

私のオプションは何ですか?私はjQuery 1.4.1とjQuery UI 1.8rc1を使用しています。これは本当に簡単なことのようです。

編集:私はこれのためにkludgy回避策を実装しましたが、私はまだより良い解決策を探しています。

回答:


250

JQuery 1.4.1とUI 1.8rc1を使用して小さなサンプルアプリを作成しました。私がしたことは、コンストラクタを次のように指定することだけです。

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

これによりブラウザウィンドウの幅が100%になるとのことですが、ここではFF3.6、Chrome、IE8でテストされてうまくいきます。

私はAJAX呼び出しを行っていません。ダイアログのHTMLを手動で変更するだけですが、問題が発生するとは考えていません。他のCSS設定がこれをノックアウトしていますか?

これの唯一の問題は、幅が中心から外れることですが、問題を修正するためにsetTimeoutにステートメントを配置する回避策を提供するこのサポートチケットを見つけましたdialog('open')

これが私のheadタグの内容です:

<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>

Jquery UIのjsおよびcssを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>

フェルミン-あなたの例と投稿に感謝します。CSSの問題であることが判明しましたが、正確な問題が何であるかはまだ明らかではありません(とにかくFirebugからは明らかではありませんでした)。すべてのダイアログdivを最上位に移動し、(テーマバージョンの代わりに)デフォルトの1.8.1 CSSを使用することで、うまく機能します。1.8.1リリースが落ちたときに、テーマバージョンを徐々に戻し、問題の根本を見つけます。ありがとう!
2010

問題ありません。お手伝いできてうれしいです。私は以前に行ったことがありますが、一度に1つのcssステートメントを移動する場合です。
フェルミン

2
IE7は壊れているようです
Alex

2
AJAXを使用してコンテンツをロードする場合、setTimeout()は信頼できるソリューションを提供しない場合があります(たとえば、サーバーが遅く、ロードに100ミリ秒以上かかった場合)。より良い解決策は、.ajax()メソッドのコールバック関数を使用してオープンをトリガーすることです。これにより、ページの読み込みが完了するまで開かなくなります。
njbair

1
{'width':'auto'}{'width':'auto'}オプションはscott.gonzalezに従ってjQuery-UIでサポートされていないため、IE7では機能せず、修正されません。ピクセルサイズについて。自動幅をサポートしない理由については、jquery-ui-devスレッドをご覧ください。」
Vladimir Kornea 2014年

11

同じ問題がありましたが、本当の問題はCSSに関連しているとお話いただきありがとうございます。

持つことposition:relativeはなく、position:absolute自分の中で.ui-dialogCSSルールは、ダイアログを作り、width:'auto'奇妙な動作します。

.ui-dialog { position: absolute;}


2

ダイアログにfloat:leftを設定するとうまくいくと思います。おそらくダイアログはプラグインによって絶対的に配置されます。その場合、その位置はこれによって決定されますが、フロートの副作用-要素をコンテンツを保持するために必要なだけの幅にする-はまだ有効です。

これは、次のようなルールを設定した場合に機能するはずです。

.myDialog {float:left}

あなたのスタイルシートでは、jQueryを使用して設定する必要があるかもしれませんが


2

対応するテーマをアップグレードせずにjquery UIを1.8.1にアップグレードしたときにも同じ問題が発生しました。テーマもアップグレードする必要があるだけで、「自動」が再び機能します。


2

何らかの理由で、IE7でこの全ページ幅の問題を抱え続けたため、このハックを行いました。

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オプションは機能していないようです。CSSを設定します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設定を。

でも設定maxWidthcreateうまくいきます:

$( ".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%',

OPの質問に基づくと、それは彼のすべてのダイアログボックスで機能するわけではなく、各ダイアログボックスを個別に設定する必要があります。
roelofs

0

私は同じ問題と立場を持っています:あなたの.ui-dialog {} CSSでの絶対は十分ではありませんでした。その位置に気づきました:相対が実際の要素の直接スタイルに設定されていたため、.ui-dialog css定義が上書きされていました。位置の設定:divの絶対値ダイアログを静的に作成するつもりでも機能しませんでした。

結局、私はこれを機能させるために私のローカルjQueryに配置された2つを変更しました。

私は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

IE7で動作させる必要がある場合は、文書化されていない、バグが多く、サポートされていない {'width':'auto'}オプションを使用できません。代わりに、以下をに追加してください.dialog()

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

.scrollWidth右側のパディングを含めるかどうかはブラウザに依存するため(FirefoxはChromeとは異なります)、主観的な「十分な」ピクセル数をに追加するか.scrollWidth、独自の幅計算関数で置き換えることができます。

この方法では幅が減ることはなく、幅を増やすだけなのでwidth: 0.dialog()オプションに含めることができます。

IE7、IE8、IE9、IE10、IE11、Firefox 30、Chrome 35、およびOpera 22で動作することがテストされています。


-1

このうなり声を編集します。

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


3
コードに説明を追加してください-なぜ回答を編集する必要があるのですか?
Nico Haase
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.