Posts Tagged jQuery
Wyłączenie “submit” na czas działania zapytania Ajax
Często spotykam się z tym ostatnio w pracy – jakieś dodatkowe listy są ładowane do formularza i póki się nie załadują `submit` powinien pozostać nieaktywny.
Kod:
jQuery("body").ajaxStart(function(){
$(".disable-on-xhr").attr("disabled", "disabled");
});
jQuery("body").ajaxStop(function(){
$(".disable-on-xhr").attr("disabled", "");
});
/**
* w niektórych przypadkach możesz też chieć odblokować
* submit gdy zapytanie xhr się nie powiedzie
**/
jQuery("body").ajaxError(function(){
$(".disable-on-xhr").attr("disabled", "");
});
Teraz wystarczy przyciskom submit dodać class=”disable-on-xhr” i smiga.
10 rzeczy, których Paul Irish nauczył się z kodu źródłowego jQuery
Wpadłem na to i koniecznie muszę Wam to pokazać. Może nie jakoś super zorganizowana prezentacja ale treść jest naprawdę interesująca. Polecam!
Tutorial: dashboard web 2.0 dla leniwych…
W moim pierwszym tutorialu napiszę jak wydajnie korzystać z tego co daje Ci cakePHP i jQuery. Aktualnie cake opiera się na współpracy z innym frameworkiem javascript – prototype. Ale już w wersji 1.3 core cake’a ma współpracować z jquery. Już nie mogę się doczekać. Ten tutorial oparłem na wersji 1.3.0-beta dlatego, że przy okazji jego pisania chciałem rzucić okiem na kolejną wersję tego świetnego frameworka php. Jednak nie będę korzystał z żadnych helperów jquery, zatem większość z tych rad powinna pasować do wersji 1.2 (w razie problemów – chętnie służę pomocą).
Jest to mój pierwszy tutorial, więc proszę o wskazówki, komentarze i odrobinę wyrozumiałości.
Efekt jaki chcemy osiągnąć można obejrzeć jako demo oraz źródła na świetnym hostingu, który gorąco wszystkim webdeveloperom i ich klientom polecam: vipserv.org.
W tym tekście zakładam, ze znasz podstawy cakePHP i javascript. Czyli przynajmniej zrobiłeś sławny blog tutorial , wiesz jak mniej więcej używać narzędzia bake, oraz potrafisz przynajmniej zniknąć element na stronie i zmienić jego kolor przy pomocy czystego javascript’u.
Dashboard na zakładkach
Zacznijmy od przygotowania przykładowej aplikacji. Wypiekamy (cake bake) aplikację złożoną z dwóch modeli Thing i Item (każda tabela składa się z id i pola tekstowego name).
Następnie tworzymy dla niej zbiorczy widok (tzw. dashboard, metoda all())
// /app/controllers/items_controller.php
class ItemsController extends AppController {
//...
function all() {}
}
// /app/views/items/all.ctp
<?php echo $this->requestAction(
array(
"controller"=> "items",
"action"=> "index"),
array("return")
); ?>
<?php echo $this->requestAction(
array(
"controller"=> "things",
"action"=> "index"),
array("return")
); ?>
Na razie nie przejmujcie się kwestią requestAction i wydajności. Zazwyczaj efekty requestAction należy umieszczać w cache’owanych elementach, ale w naszym przypadku już niedługo zrezygnujemy z samego requestAction.
Zróbmy z tego widoku zakładki modyfikując widok all.ctp w następujący sposób:
<script type="text/javascript">
$(document).ready(function() {
$("#tabs").tabs();
});
</script>
<div id="tabs">
<ul>
<li><a href="#tabs-1">Items</a></li>
<li><a href="#tabs-2">Things</a></li>
</ul>
<div id="tabs-1">
<?php echo $this->requestAction(
array(
"controller"=> "items",
"action"=> "index"),
array("return")
); ?>
</div>
<div id="tabs-2">
<?php echo $this->requestAction(
array(
"controller"=> "things",
"action"=> "index"),
array("return")
); ?>
</div>
</div>
Żeby wypieczone widoki były “otoczone” ramką z zakładki – trzeba w nich dodać taki fragment na samym końcu plików index.ctp:
<div style="float: none; clear: both;"> </div>
Dodajmy więcej elementów, żeby zobaczyć jak zachowuje się pagination…
insert into items(`name`) values ('Item 4'), ('Item 5'), ('Item 6'), ('Item 7')
i zmieńmy parametry stronicowania, żeby efekty stronicowania zobaczyć szybko
class ItemsController extends AppController {
//...
var $paginate = array(
'limit'=> 5
);
//...
Widzimy, że w naszym zbiorczym widoku link ciągle prowadzi do items/index. Wolelibyśmy, żeby stronicowanie odbyło się w zakładkach.
Można oczywiście próbować rozwiązania via php. Oprogramować obsługę parametrów w metodzie all(), zmienić cel linków stronicowania i sortowania w widokach. I ogólnie dużo napracować się nad tym, żeby nasz kod wyglądał źle
. Już za chwilę moc javascript i w szczególności jQuery przyjdzie nam z pomocą. Zanim to nastąpi – zamieńmy nasze zakładki na Ajaxowe zmieniając widok all.ctp:
// views/items/all.ctp
<script type="text/javascript">
$(document).ready(function() {
$("#tabs").tabs();
});
</script>
<div id="tabs">
<ul>
<li>
<?php echo $html->link(
"Items",
array(
"controller"=> "items",
"action"=> "index"
)
);
?>
</li>
<li>
<?php echo $html->link(
"Things",
array(
"controller"=> "things",
"action"=> "index"
)
);
?>
</li>
</ul>
</div>
…prościzna, prawda? Kwestię requestAction też już mamy z głowy. Jednak pojawił się problem – wnętrze zakładek pojawiło się w powtórzonym layoucie.
Szybko naprawimy to w app_controller.php przy pomocy RequestHanlder:
// /app/app_controller.php
var $components = array("RequestHandler");
function beforeFilter(){
if($this->RequestHandler->isAjax()){
$this->layout = "ajax";
}
}
Wrócmy do kwestii stronicowania (i sortowania przy okazji). Chcemy, aby kolejne strony ładowały się w danej zakładce. Wykorzystajmy do tego potęgę jQuery.
Dodajemy taki prosty skrypt
// views/items/all.ctp
$('#tabs a[href*=/sort:],#tabs a[href*=/page:]').live('click', function(){
$('#tabs>div:visible').load($(this).attr('href'));
return false;
});
Jeśli interesuje Cię co się w tym fragmencie dzieje, zapraszam na do innego wpisu. W dużym skrócie: łapiemy linki, które mają w adresie “sort:” i “page:” i zmuszamy je aby przeładowały zawartość zakładki, zamiast całej strony.

