2010-02-04 84 views
5

我在单个页面上使用多个jQuery UI对话框主题,并且我有错误。自定义CSS范围和jQuery UI对话框主题

[1.3.2的jQuery] [jQuery用户界面1.7.2]

下面是一个屏幕截图(VS 定制CSS范围):

Enter image description here

单独第1页)

VS天然2)

我该如何解决这个问题?

回答

9

今天我遇到了同样的问题。看起来您创建的任何对话框都会从当前层次结构中取出,并放置在主体元素的末尾,这意味着它不包含在自定义范围内。

“dialogClass”选项也没有帮助,因为它设置了对话框元素的类,但是您需要使用该对话框作为自定义类的元素的后代。

使其工作的一种方法是在body标签上设置自定义类。但是,这意味着整个文档都会受到影响,并且不能在一个页面上使用不同的主题。

我最终的解决方法是使用自定义作用域将对话元素放回到元素中。假设有一个包含“myCustomScope”类的div,其中包含自定义主题应用的所有内容;与ID为“myDialogContent”的DIV应该成为对话:

// Create the dialog, but don't open it yet 
var d = $('#myDialogContents').dialog({ 
    autoOpen: false 
    // Other dialog options 
}); 
// Take the whole dialog and put it back into the custom scope. 
d.parent('.ui-dialog').appendTo('.myCustomScope'); 
// Open the dialog (if you want autoOpen). 
d.dialog('open'); 
0
//Try this to fix problem 
//note: jquery-ui-1.7.2 

var dwrap = [false, false]; 
//0 - dialog1 flag(modal: true) 
//1 - dialog2 flag(modal: false) 

//?dialog1 = your dialog id 
// example: mytest-dialog1 
//?dialog2 = your dialog id 
// example: mytest-dialog2 

//?custom css scope = your custom css scope 
// example: .my-dialog-themes 

function DialogTheme(dialog){ 
    switch (dialog){ 
    case 0 : 
     if(!dwrap[0]){ 
     $("div[aria-labelledby*='ui-dialog-title-?dialog1']").wrap("<div class='?custom css scope'></div>"); 
     dwrap[0] = true; 
     } 
     //for overlay no good way but i dont see another 
    $(".ui-widget-overlay").wrap("<div class='?custom css scope'></div>"); 
    break; 
    case 1 : 
     if(!dwrap[1]){ 
     $("div[aria-labelledby*='ui-dialog-title-?dialog2']").wrap("<div class='?custom css scope'></div>"); 
     dwrap[1] = true; 
     } 
    break; 
    default : 
    break; 
    } 
} 

//Use: 
//after open dialog call DialogTheme(0) for modal and DialogTheme(1) for none modal 
//example: 

$("#?dialog1").dialog('open'); 
DialogTheme(0); 

//This way work correct on the page except overlay, 
//note you must have jquery-ui-1.7.2 other versions not tested 
//It's all 

三江源安德烈亚斯你的答案

2

有迹象表明,得到取出正常的HTML流的其他的jQuery UI元素,除了对话框。例如,自动完成小部件。

我发现,这些方针的东西,似乎这样的伎俩:

$(window).load(function() { 
$('.ui-autocomplete').wrap('<div class="css_scope_selector" />'); 
}); 

虽然window.load这样做可能不是很理想。

+0

谢谢你,soupenvy为你的答案 – Ret 2010-07-07 20:25:43

+0

结合这和安德烈亚斯的答案让我在我需要的地方。但这得到了投票作为$ .wrap更好我认为:-) – firecall 2011-05-05 09:05:02

0

Andrea的回答让我对覆盖层工作的iframe和模态有了一个了解。打开后必须设置宽度和高度,并将覆盖图添加到作用域div。

var d = $("<iframe src=\"" + src + "\" id=\"upload_iframe\" />") 
.dialog(
{ 
    title: "Import", 
    autoOpen: false, 
    width: 1000, 
    height: 600, 
    modal: true, 
    resizable: false, 
    draggable: false 
}); 

var scope = $("<div>").addClass("jquery-ui-scope").appendTo("body"); 

d.parent(".ui-dialog").appendTo(scope); 
d.dialog("open").width(990).height(590); 
$(".ui-widget-overlay").appendTo(scope); 
1

对话框小部件通过设计附加到主体。如果您觉得不自然,将它移到DOM中的其他位置是jQuery UI开发团队无法预料的,​​那么一种解决方案可能就是将您的作用域应用于对话框,方法与将其应用于使用它的其他元素的方式相同,通过简单地用你的主题范围为类包装它在一个div标签:

$("#mydialog").dialog().parent(".ui-dialog").wrap("<div class='custom-theme-css-scope'></div>"); 
4

你应该对话框的创建后 1)总结的.ui-dialog元素。 2)打开对话框后包装.ui-widget-overlay元素。 由于每次打开/关闭对话框时,都会创建/销毁.ui-widget-overlay元素,因此您还应该使用 3)在关闭对话框时移除.ui-widget-overlay的空包装(否则您将获得许多空包装)。

$(function() { 
$("#dialog").dialog({ 
    position: "center", 
    autoOpen: false, 
    modal: true, 
    create: function(event, ui){ 
     $('.ui-dialog').wrap('<div class="your-class" />'); 
    }, 
    open: function(event, ui){ 
     $('.ui-widget-overlay').wrap('<div class="your-class" />'); 
    }, 
    close: function(event, ui){ 
     $(".your-class").filter(function(){ 
      if ($(this).text() == "") 
      { 
       return true; 
      } 
      return false; 
     }).remove(); 
     } 
    }); 
}); 

在JQuery UI 1.8.13中测试。