Getting wrong length on dialog - javascript

I'm working with jquery and I'm trying to listen for how may are there open after I close a dialog, but I'm getting how many where open.
For example: if I have 4 and I close one it returns 4 when I expect to get 3, and at the end when I have only 1 open it returns 2, and at the end the when I close the last one return 1.
Am I doing right? I try look in the docs and try to look for something like afterClose but there is not.
$( ".test" ).dialog({
autoOpen: false,
height: "auto",
width: "auto",
modal: true,
close: function(e){
$(this).destroy();
// This returns wrong lenght
console.log($('.test').length);
if($('.test').length === 1) {
console.log($('.test a').text());
}
}
});

How are you getting those numbers? Unless you are destroying dialogs calling
$('.test').length
is always going to return the number of classes of test on the dom. Are you using .remove() or something to remove the dialogs? More information is needed.
When you close a dialog it does not remove it from the DOM. It just hides it, you can see the hidden html at the bottom of the page. The proper way to use multiple dialogs is to use instances of dialogs. but that shit is complicated. Post some more of your code, specifically how you are setting up your html and if you are some how deleting dialogs.
Also (since i cant comment yet), the close event fires as the window is closing but before the window is hidden, this allows you two places to cancel the close event, beforeClose (typically for some validation), and close (maybe where you do some population of objects or something).

Try changing the jQuery selector to search for visible items:
$( ".test" ).dialog({
autoOpen: false,
height: "auto",
width: "auto",
modal: true,
close: function(e){
// This returns wrong lenght
console.log($('.test:visible').length);
if($('.test:visible').length === 1) {
console.log($('.test a').text());
}
}
});
Source

$( ".test" ).dialog({
autoOpen: false,
height: "auto",
width: "auto",
modal: true,
close: function(e){
$(this).destroy();
// This returns wrong lenght
console.log($('.test').length);
if($('.test').length === 1) {
console.log($('.test a').text());
}
}
});

Related

Disabling window while opening popup

I've looked around this site a bit, and can't seem to find a solution that works for me...
I'm trying to disable parent window while opening a popup- I've tried:
<body onClick="func1()" onFocus="func1()">
with
editwindow = window.open("","","width=300, height=300");
with the following function in my header:
function func1(){
if (editwindow && !editwindow.closed) editwindow.focus();
}
My problem is that this method doesn't effectively "disable" the parent window. I need links and buttons not to respond when clicked on. It seems like the browser is giving preference to the links first, and then re-focuses to the popup window.
Any help would be appreciated.
Instead of reinventing the wheel, and dealing with pop-up blocker headaches in the future ruining your User Experience, you might consider using jQuery UI's modal dialog.
<script>
$(function() {
$( "#dialog-confirm" ).dialog({
resizable: false,
height:140,
modal: true,
buttons: {
"Delete all items": function() {
$( this ).dialog( "close" );
},
Cancel: function() {
$( this ).dialog( "close" );
}
}
});
});
</script>

multiple dialog box within same page

Requirement is to show dialog box on click of a button.I have created dialog box using jQuery UI. Please find the code here http://jsfiddle.net/M4QM6/32/.
ISsue is i have single function for creating dialog box, how can i show multiple dialog box within same page with each dialog box displaying different data,
When i click on dialog2 button, i need to show a dialog box which has textArea and a submit button.Please suggest.
Below is the sample code:
$(function() {
$("#dialog").dialog({
autoOpen: false,
resizable: true,
width:"750",
height:300,
modal: true,
buttons: {
"Close": function() {
$(this).dialog("close");
}
}
});
});
You could go a couple routes. Since your need for dialog content is pretty specific (textarea control - first dialog pops second dialog - etc), I would hard-code the needed divs on the page. So, make a "#textAreaDialog" div and put the needed controls in it ad set its style to display:none.
Next, modify your function to accept parameters (the name of the div that should be popped, the funciton to execute if "OK" is clicked - and the function to execute if "Cancel" is clicked), so you're not limited to using #dialog for all of your modals and you can finely control what happens when each button is clicked (not always just closing the dialog. Then, set event handlers for the click events of the buttons you need, and call your dialog accordingly.
html:
<input type="button" id="btnPopFirstModal" Value="Open First Modal"/>
<div id="divFirstModal" style="display:none;">
Here is the content for the first modal
</div>
<div id="divSecondModal" style="display:none;">
Here is the content for the second modal
</div>
Javascript functions:
function PopDialog(divToPop, OkFunction, CancelFunction)
{
$("#" + divToPop).dialog({
autoOpen: false,
resizable: true,
width:"750",
height:300,
modal: true,
buttons: {
"Ok": function() {
OkFunction();
$(this).dialog("close");
},
"Cancel": function(){
CancelFunction();
$(this).dialog("close");
}
}
});
});
}
function PopSecondModal(){
PopDialog("divSecondModal", function(){ put code for OK Click here}, function(){put code for Cancel Click here});
}
Javascript event handlers:
$("#btnPopFirstModal").click(function(e){
e.preventDefault();
PopDialog("divFirstModal", PopSecondModal, function(){}); //empty function for cancel, but you can add your own code as needed
return false;
});
Remember, you can expand this as much as you want, adding more event handlers and custom divs to use for more tailored modals. Also, as you can see, you can write your OK and Cancel funcitons inline when calling the PopDialog function - or you can pass it a function name (this is preferable if you're going to reuse that function).
Here is how I did:
$(
//when JQuery is ready
funciton()
{
$('#SomeButton').on
(
'click',
function()
{
//Note that content could be anything (HTML, text...)
//This dynamicly create a div to be your dialog
$('<div>').append(content).dialog
(
{
//autoOpen: false, I removed it you can put it back in if you need it but I dont think its important for now
resizable: true,
//I remove the double quotes here because height didn't have any but maybe it was the other way around
width:750,
height:300,
//I put this on false because if two or more dialog would need to be displayed at the same time you can't have them modals.
modal: false,
buttons:
{
Close: function()
{
$(this).dialog("close");
}
},
//this is important it destroys and remove the dynamically create dialog when you close them so you don't get 20 dialog not displayed in your html markup.
close:
function()
{
$(this).dialog('destroy').remove();
}
}
);
}
);
}
);

beforeclose callback of jquery dialog not executed on close

I am trying to make fire a callback on dialog close, and I am unable to debug it from developer tools/firebug. The code defined after beforeclose label is never executed:
$(".dialog").dialog({
autoOpen: false,
modal: true,
width: 300,
beforeclose: function(event, ui)
{
// :input select all buttons, selects, textarea, checkbox
$(':input').removeAttr('checked').removeAttr('selected');
}
});
I get no errors from the console and I searched but no one seems to have the same problem.
I'll show more code if needed.
I'm not sure if it's case sensitive but in the API it's:
beforeClose
Source:
API

How to make jquery-ui-dialog not have a close button?

I didn't find this in the documentation.
Should I just make the close button display:none with css, or is there a clean way in the API to make a dialog without the X button (top-right)?
This may solve your Problem:
$("#dialogId").dialog({
closeOnEscape: false,
open: function(event, ui) { $(".ui-dialog-titlebar-close", ui.dialog).hide(); }
});
There is no option to disable the 'X' button. You would need to add css to display none/hide() the element with the class 'ui-icon-closethick' when it is loaded and opened.
For some reason .hide() did not work for me. This did:
$('#divMsg').dialog({ title: 'Please wait...',
modal: true,
closeOnEscape: false,
open: function (event, ui) { $(".ui-dialog-titlebar-close", ui.dialog).css('display', 'none'); } }).text('Text To Display').css('background', 'white');
This code snippet also shows how to set the title and text of the dialog box -- I am using it as a modal notification window and closing it when my AJAX call completes.

jQuery UI Dialog Auto-Close using setTimeout

I'm trying to have my dialog auto-close three seconds after opening. I've tried the following methods:
setTimeout($("#mydialog").dialog('close'), 3000);
Here it is in context:
$("#acknowledged-dialog").dialog({
height: 140,
modal: true
});
setTimeout($("#acknowledged-dialog").dialog('close'), 3000);
But with this method, it doesn't even show! I'm guessing the the close method is getting called immediately after it gets shown on the page. The log shows no errors.
I've also tried binding to the dialogopen event:
$("#acknowledged-dialog").bind('dialogopen', function(event, ui) {
setTimeout($(this).dialog('close'), 3000);
});
$("#acknowledged-dialog").dialog({
height: 140,
modal: true
});
The dialog shows, but does not auto-close. No error in the logs here either.
Am I not able to use 'this' in the argument for $ in setTimeout?
setTimeout is calling on the the return value of $("#mydialog").dialog("close") after 3 seconds. you want to throw the whole thing as a string, and it should work just fine. Also, I don't think you want to bind 'dialogopen' before you initialize the dialog. Below should work just fine:
$("#acknowledged-dialog").dialog({
height: 140,
modal: true,
open: function(event, ui){
setTimeout("$('#acknowledged-dialog').dialog('close')",3000);
}
});
I wrote an article specifically for the problem you are experiencing. Please read that.
In short, you want to wrap $("#mydialog").dialog('close') with an inline function everywhere you want it executed as a result of a delay or a triggered event.
setTimeout(function(){
$("#mydialog").dialog('close')
}, 3000);
The dialog doesn't even show because you closed it as soon as you opened it in each case.

Categories

Resources