Botão dentro de tabela não está funcionando - jQuery

1 resposta
Roger75

Me baseando neste exemplo do site do jQuery UI:
http://jqueryui.com/demos/dialog/modal-form.html

Fiz o código abaixo. Mas o botão "Editar" que aparece na linha da tabela não está abrindo a janela quando clicado. Por que será, hein?

O outro botão, que está fora da tabela, funciona...

<!DOCTYPE html>
<!-- saved from url=(0048)http://jqueryui.com/demos/dialog/modal-form.html -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta charset="utf-8">
	<title>jQuery UI Dialog - Modal form</title>
	<link rel="stylesheet" href="http://jqueryui.com/themes/base/jquery.ui.all.css">
	<script src="./jQuery UI Dialog - Modal form_files/jquery-1.7.2.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.bgiframe-2.1.2.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.core.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.widget.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.mouse.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.button.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.draggable.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.position.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.resizable.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.ui.dialog.js"></script>
	<script src="./jQuery UI Dialog - Modal form_files/jquery.effects.core.js"></script>
	<link rel="stylesheet" href="http://jqueryui.com/demos/demos.css">
	<style>
		body { font-size: 62.5%; }
		label, input { display:block; }
		input.text { margin-bottom:12px; width:95%; padding: .4em; }
		fieldset { padding:0; border:0; margin-top:25px; }
		h1 { font-size: 1.2em; margin: .6em 0; }
		div#users-contain { width: 350px; margin: 20px 0; }
		div#users-contain table { margin: 1em 0; border-collapse: collapse; width: 100%; }
		div#users-contain table td, div#users-contain table th { border: 1px solid #eee; padding: .6em 10px; text-align: left; }
		.ui-dialog .ui-state-error { padding: .3em; }
		.validateTips { border: 1px solid transparent; padding: 0.3em; }
		.a {text-decoration:underline; cursor:pointer;}
	</style>
	<script>
	$(function() {
		// a workaround for a flaw in the demo system (http://dev.jqueryui.com/ticket/4375), ignore!
		$( "#dialog:ui-dialog" ).dialog( "destroy" );
		
		var name = $( "#name" ),
			email = $( "#email" ),
			password = $( "#password" ),
			allFields = $( [] ).add( name ).add( email ).add( password ),
			tips = $( ".validateTips" );

		function updateTips( t ) {
			tips
				.text( t )
				.addClass( "ui-state-highlight" );
			setTimeout(function() {
				tips.removeClass( "ui-state-highlight", 1500 );
			}, 500 );
		}

		function checkLength( o, n, min, max ) {
			if ( o.val().length > max || o.val().length < min ) {
				o.addClass( "ui-state-error" );
				updateTips( "Length of " + n + " must be between " +
					min + " and " + max + "." );
				return false;
			} else {
				return true;
			}
		}

		function checkRegexp( o, regexp, n ) {
			if ( !( regexp.test( o.val() ) ) ) {
				o.addClass( "ui-state-error" );
				updateTips( n );
				return false;
			} else {
				return true;
			}
		}
		
		$( "#dialog-form" ).dialog({
			autoOpen: false,
			height: 300,
			width: 350,
			modal: true,
			buttons: {
				"Create an account": function() {
					var bValid = true;
					allFields.removeClass( "ui-state-error" );

					bValid = bValid && checkLength( name, "username", 3, 16 );
					bValid = bValid && checkLength( email, "email", 6, 80 );
					bValid = bValid && checkLength( password, "password", 5, 16 );

					bValid = bValid && checkRegexp( name, /^[a-z]([0-9a-z_])+$/i, "Username may consist of a-z, 0-9, underscores, begin with a letter." );
					// From jquery.validate.js (by joern), contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/
					bValid = bValid && checkRegexp( email, /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "eg. [email removido]" );
					bValid = bValid && checkRegexp( password, /^([0-9a-zA-Z])+$/, "Password field only allow : a-z 0-9" );

					if ( bValid ) {
						$( "#users tbody" ).append( "<tr>" +
							"<td>" + name.val() + "</td>" + 
							"<td>" + email.val() + "</td>" + 
							"<td>" + password.val() + "</td>" +
							"<td><button id='edit-user'>Editar</button></td>"+
						"</tr>" ); 
						$( this ).dialog( "close" );
					}
				},
				Cancel: function() {
					$( this ).dialog( "close" );
				}
			},
			close: function() {
				allFields.val( "" ).removeClass( "ui-state-error" );
			}
		});

		$( "#create-user" )
			.button()
			.click(function() {
				$( "#dialog-form" ).dialog( "open" );
			});
		$( "#edit-user" )
			.button()
			.click(function() {
				$( "#dialog-form" ).dialog( "open" );
			});			
				
	});
	</script>
</head>
<body>

<div class="demo">




<div id="users-contain" class="ui-widget">
	<h1>Existing Users:</h1>
	<table id="users" class="ui-widget ui-widget-content">
		<thead>
			<tr class="ui-widget-header ">
				<th>Name</th>
				<th>Email</th>
				<th>Password</th>
				<th>Ação</th>
			</tr>
		</thead>
		<tbody>
			<tr>
				
			</tr>
		</tbody>
	</table>
</div>
<button id="create-user" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false"><span class="ui-button-text">Create new user</span></button>

</div><!-- End demo -->



<div class="demo-description">
<p>Use a modal dialog to require that the user enter data during a multi-step process.  Embed form markup in the content area, set the &lt;code&gt;modal&lt;/code&gt; option to true, and specify primary and secondary user actions with the &lt;code&gt;buttons&lt;/code&gt; option.</p>
&lt;/div&gt;&lt;!-- End demo-description --&gt;



&lt;div style="outline: 0px; height: auto; width: 350px; position: absolute; top: 176px; left: 494px; z-index: 1002; display: none; " class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable" tabindex="-1" role="dialog" aria-labelledby="ui-dialog-title-dialog-form"&gt;&lt;div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix"&gt;&lt;span class="ui-dialog-title" id="ui-dialog-title-dialog-form"&gt;Create new user&lt;/span&gt;<a href="http://jqueryui.com/demos/dialog/modal-form.html#"  >&lt;span class="ui-icon ui-icon-closethick"&gt;close&lt;/span&gt;</a>&lt;/div&gt;&lt;div id="dialog-form" style="width: auto; min-height: 0px; height: 216px; " class="ui-dialog-content ui-widget-content" scrolltop="0" scrollleft="0"&gt;
	<p  >Length of username must be between 3 and 16.</p>

	&lt;form&gt;
	&lt;fieldset&gt;
		&lt;label for="name"&gt;Name&lt;/label&gt;
		&lt;input type="text" name="name" id="name" class="text ui-widget-content ui-corner-all"&gt;
		&lt;label for="email"&gt;Email&lt;/label&gt;
		&lt;input type="text" name="email" id="email" value="" class="text ui-widget-content ui-corner-all"&gt;
		&lt;label for="password"&gt;Password&lt;/label&gt;
		&lt;input type="password" name="password" id="password" value="" class="text ui-widget-content ui-corner-all"&gt;
	&lt;/fieldset&gt;
	&lt;/form&gt;
&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-n" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-e" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-s" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-w" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se ui-icon-grip-diagonal-se" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-sw" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-ne" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-resizable-handle ui-resizable-nw" style="z-index: 1000; "&gt;&lt;/div&gt;&lt;div class="ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"&gt;&lt;div class="ui-dialog-buttonset"&gt;&lt;button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false"&gt;&lt;span class="ui-button-text"&gt;Create an account&lt;/span&gt;&lt;/button&gt;&lt;button type="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only" role="button" aria-disabled="false"&gt;&lt;span class="ui-button-text"&gt;Cancel&lt;/span&gt;&lt;/butto
n></div></div></div></body></html>

1 Resposta

W

Eu acho que o problema eh que vc esta criando o botao edit dinamicamente, dentro do dialog. Quando vc conecta no evento click do botao ele nao esta criado, portanto nunca vai funcionar.

Faca um teste! Nessa parte do seu codigo adicione:

$("#create-user")  
     .button()  
     .click(function() {  
           $( "#dialog-form" ).dialog( "open" );  
     });

var edit_button = $("#edit-user");
console.dir(edit_button); // Isso provalvemente vai ser null.

$("#edit-user")  
     .button()  
     .click(function() {  
          $( "#dialog-form" ).dialog( "open" );  
     });

Da uma olhada no firebug console, para ver o erro.
Voce vai ter que colocar o event handle, quando vc criar o dialog.

Soh um comentario a respeito desse pedaco do seu codigo, vc nao precisa usar .button(), isso ja eh suficiente:

("#mybutton").click(function() {
     console.log("click!");
});

//Daniel

Criado 31 de julho de 2012
Ultima resposta 7 de ago. de 2012
Respostas 1
Participantes 2