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과 함께 사용하고 있습니다. 이것은 정말 쉬운 것 같습니다.

편집 : 나는 이것에 대한 해결 방법을 구현했지만 더 나은 해결책을 찾고 있습니다.

답변:


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>

http://jquery-ui.googlecode.com/files/jquery-ui-1.8rc1.zip 에서 Jquery UI 용 js 및 css를 다운로드했습니다 . 그리고 몸 :

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

Fermin-귀하의 모범과 게시물에 감사드립니다. 정확한 문제가 무엇인지 아직 확실하지 않지만 CSS에 실제로 문제가 있음이 밝혀졌습니다 (어쨌든 Firebug에서는 분명하지 않았습니다). 모든 대화 상자 div를 최상위 수준으로 이동하고 테마 버전 대신 기본 1.8.1 CSS를 사용하면 효과적입니다. 1.8.1 릴리스가 떨어지면 테마 버전을 점차 다시 이동하여 문제의 근본을 찾으십시오. 감사!
womp

문제 없습니다. 도와 드리겠습니다. 나는 전에 거기에 가봤다. 한 번에 1 개의 CSS 문장을 옮기는 경우이다 .... 즐기십시오!
Fermin

2
IE7은 깨지는 것 같습니다
Alex

2
AJAX를 사용하여 내용을로드하는 경우 setTimeout ()은 안정적인 솔루션을 제공하지 않을 수 있습니다 (예 : 서버가 느리고로드하는 데 100ms 이상 걸린 경우). 더 나은 해결책은 .ajax () 메소드의 콜백 함수를 사용하여 열기를 트리거하는 것입니다. 이렇게하면 페이지로드가 완료 될 때까지 열리지 않습니다.
njbair

1
{'width':'auto'}scott.gonzalez에 따르면 jQuery-UI{'width':'auto'} 가 옵션을 지원하지 않기 때문에 IE7에서 작동하지 않으며 수정 되지 않습니다. 자동 너비를 지원하지 않는 이유에 대한 설명은 jquery-ui-dev 스레드 를 참조하십시오 . "
Vladimir Kornea

11

동일한 문제가 있었고 실제 문제가 CSS와 관련이 있다고 언급 한 덕분에 문제를 발견했습니다.

갖는 position:relative대신 position:absolute당신의 .ui-dialogCSS 규칙은 대화를하게하고 width:'auto'이상하게 동작합니다.

.ui-dialog { position: absolute;}


2

대화 상자에 float : left를 설정하는 것이 좋습니다. 아마도 대화 상자는 플러그인에 의해 절대적으로 배치됩니다.이 경우 위치는 이것에 의해 결정되지만 float의 부작용은 내용을 보유 해야하는만큼 요소를 넓게 만듭니다-여전히 효과가 있습니다.

다음과 같은 규칙을 설정하면 작동합니다.

.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옵션이 작동하지 않는 것; max-width대신 대화 상자 위젯 에서 CSS 특성을 설정하십시오 .

최대 높이를 제한하려는 경우 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%',

OP의 질문에 따르면 모든 대화 상자에서 작동하지는 않지만 각 대화 상자를 개별적으로 설정해야합니다.
roelofs

0

똑같은 문제가 있고 위치가 있습니다. .ui-dialog {} CSS의 절대로는 충분하지 않습니다. position : relative가 실제 요소의 직접 스타일로 설정되어 .ui-dialog CSS 정의가 덮어 쓰여지는 것을 알았습니다. 위치 설정 : div에서 절대 대화 상자를 정적으로 만들려고해도 작동하지 않았습니다.

결국이 작업을 수행하기 위해 로컬 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

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
코드에 설명을 추가하십시오. 왜 답변을 수정해야합니까?
니코 하세
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.